Come estrarre dati sui prodotti Amazon su larga scala in Python
Il tutorial di BeautifulSoup in tre righe funziona una volta, poi Amazon ti serve un CAPTCHA. Ecco cosa effettivamente si rompe su larga scala — selettori di prezzo che cambiano, prezzi geolocalizzati, blocchi IP — e la pipeline che sopravvive a tutto questo.
L'estrazione di dati sui prodotti Amazon sembra banale in ogni tutorial per principianti: requests, BeautifulSoup, prendi il titolo e il prezzo, fatto. Questo funziona esattamente fino a quando non lo esegui qualche centinaio di volte, a quel punto Amazon ti consegna una pagina di verifica robot e il tuo selettore di prezzo restituisce None. Questa guida riguarda la versione che sopravvive al contatto con il sito reale — una pipeline che parte dagli ASIN, i selettori che effettivamente si rompono, perché lo stesso prodotto mostra un prezzo diverso a IP diversi, e la configurazione proxy che ti tiene lontano dal muro del CAPTCHA. Si tratta di dati pubblici sui prodotti (titoli, prezzi, valutazioni, disponibilità), non di nulla dietro un login.
La struttura dell'URL: gli ASIN sono la chiave
Ogni prodotto Amazon ha un ASIN — un identificatore di 10 caratteri come B08N5WRWNW — e l'intero catalogo si basa su di esso. Una pagina prodotto è semplicemente https://www.amazon.com/dp/<ASIN>, e lo stesso ASIN è mappato su diversi marketplace (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Le pagine di ricerca e di categoria si trovano sotto /s? con parametri di query e browse-node. Quindi una pipeline scalabile ha due fasi: scoprire gli ASIN dalle pagine di ricerca o dei best-seller, poi idratare ciascuno dalla sua pagina /dp/. Una nota — un ASIN "genitore" (un prodotto con varianti di taglia o colore) si risolve in una variante figlio selezionata automaticamente, quindi cattura l'ASIN della variante su cui sei effettivamente atterrato.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
def product(asin, domain="com"):
url = f"https://www.amazon.{domain}/dp/{asin}"
r = requests.get(url, headers=HEADERS,
proxies={"http": PROXY, "https": PROXY}, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
return parse(soup, asin)
Il selettore che tutti copiano e che Amazon ha ritirato
Quasi ogni vecchio tutorial legge il prezzo da span#priceblock_ourprice. Amazon serve più layout di blocchi di prezzo e li testa A/B, quindi quel singolo ID è vuoto sulla maggior parte delle pagine oggi. L'approccio durevole è provare diversi contenitori di prezzo noti in ordine e prendere il primo che corrisponde — e trattare un prezzo mancante come uno stato reale (di solito esaurito), non come un crash.
def parse(soup, asin):
title = soup.select_one("#productTitle")
price = None
for sel in ["span.a-price span.a-offscreen", # current layout
"#priceblock_ourprice", # legacy
"#priceblock_dealprice", # deal layout
"#corePrice_feature_div .a-offscreen"]:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
price = el.get_text(strip=True)
break
rating = soup.select_one("span.a-icon-alt")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price, # None -> likely out of stock
"rating": rating.get_text(strip=True) if rating else None,
}

Perché lo stesso prodotto mostra due prezzi
Questo è il fatto che rovina silenziosamente i dataset di prezzi. Amazon localizza prezzo e disponibilità alla posizione di consegna dell'acquirente — l'impostazione "Consegna a" — che deduce principalmente dal tuo IP. Estrai amazon.com da un IP di un datacenter tedesco e potresti ottenere prezzi in euro, offerte diverse o un vincitore della Buy Box diverso da quello che vede un acquirente statunitense. Se stai raccogliendo dati di prezzi competitivi, la geografia dell'IP di uscita è l'esperimento: per catturare il prezzo che vede un acquirente statunitense, instrada tramite un proxy residenziale statunitense; per il mercato del Regno Unito, un'uscita nel Regno Unito. Un prodotto, molti prezzi, uno per mercato che campioni.
Ottieni proxy residenziali geotargetizzati
Perché gli scraper ingenui vengono bloccati
Amazon gestisce sistemi automatizzati di gestione delle richieste: se esplodi troppo velocemente da un IP ottieni un CAPTCHA, un ban IP o una pagina ridotta. Tre cose mantengono uno scraper vivo a volume. Primo, ruota gli IP in modo che nessun singolo indirizzo porti tutto il carico — un pool residenziale rotante distribuisce le richieste su molti IP reali dei consumatori. Secondo, datti un ritmo: ritardi casuali e un limite di concorrenza, non un ciclo a tutto gas. Terzo, invia intestazioni coerenti — un vero User-Agent del browser e Accept-Language, non la stringa predefinita di Python. Quando una pagina torna sospettosamente corta o contiene un marcatore di verifica robot, scartala e riprova su un nuovo IP invece di analizzare spazzatura.
import time, random
def fetch_many(asins, domain="com"):
rows = []
for asin in asins:
for attempt in range(3):
data = product(asin, domain)
if data["title"]: # got a real page
rows.append(data)
break
time.sleep(1.5 + random.random()) # back off, rotate, retry
time.sleep(random.uniform(1, 3)) # pace between products
return rows
Ricerca, best-seller e paginazione
Le pagine prodotto sono il dettaglio; le pagine di ricerca e dei best-seller sono come scopri cosa estrarre. Una ricerca per parola chiave è /s?k=<query>&page=<n>; i best-seller si trovano nei nodi di navigazione delle categorie. Percorri le pagine, estrai gli ASIN da ogni scheda risultato, quindi alimentali nella fase prodotto sopra. Mantieni separate le due fasi — ti permette di deduplicare gli ASIN, riprendere un crawl e rivalutare una lista di ASIN conosciuta su base programmata senza riscoprirla ad ogni esecuzione. Per una costruzione più ampia, la nostra guida ai migliori proxy per il web scraping copre il lato pool di questo.
Per l'output stesso, mantieni lo schema delle righe piatto e stabile: un asin, l'url di origine, title, price, rating, conteggio delle recensioni, un image_url e il domain del marketplace da cui hai estratto. Scrivi il dominio in ogni riga in modo che un dataset misto di mercati non confonda un prezzo statunitense con uno del Regno Unito. Cattura l'ASIN anche quando il prezzo è vuoto — una lettura fuori stock è un punto dati, non un vuoto, e tracciare quando un prodotto entra ed esce dal magazzino è spesso tanto prezioso quanto il prezzo. Un CSV o una tabella di database con queste colonne si integra facilmente nel monitoraggio dei prezzi, negli avvisi di disponibilità o in uno studio della Buy Box senza ulteriori ristrutturazioni.

Proxy vs un'API di scraping: quando passare
requests fatto a mano più un buon pool residenziale è la scelta giusta finché controlli il volume e l'obiettivo rimane collaborativo. Una volta che stai mantenendo selettori rotanti, gestione CAPTCHA, fissaggio geografico e logica di riprova su migliaia di ASIN al giorno, quella manutenzione diventa il lavoro. Un Scraper API lo semplifica: invia un URL Amazon, ricevi dati strutturati sui prodotti con rotazione, rendering e geolocalizzazione gestiti per te. La regola onesta — fai da te finché l'attrito è basso, passa quando la manutenzione anti-bot costa più tempo di ingegneria di quanto valgano i dati. La nostra analisi costruire vs acquistare mette numeri su quella linea.
Domande frequenti
Come faccio a estrarre dati sui prodotti Amazon con Python?
Recupera la pagina del prodotto a /dp/<ASIN> con requests e un vero User-Agent del browser, quindi analizza titolo, prezzo, valutazione e disponibilità con BeautifulSoup. Prova diversi selettori di prezzo, non solo il ritirato priceblock_ourprice. Instrada tramite un proxy residenziale rotante in modo che i picchi non attivino un blocco, e fissa la geolocalizzazione di uscita al mercato di cui vuoi i prezzi.
È legale estrarre dati sui prodotti Amazon?
Raccogliere dati sui prodotti visibili pubblicamente — titoli, prezzi, valutazioni — è generalmente trattato in modo diverso dal bypassare login o copiare contenuti protetti, ma i termini di Amazon limitano l'accesso automatizzato e il quadro legale varia a seconda della giurisdizione e dell'uso. Queste sono informazioni generali, non consigli legali: estrai solo dati pubblici, rispetta i limiti di velocità e consulta un legale per qualsiasi cosa commerciale o borderline.
Perché il mio scraper Amazon ottiene un prezzo diverso rispetto al sito web?
Amazon localizza prezzi e disponibilità alla posizione di consegna che deduce dal tuo IP. Se il tuo proxy esce in un paese diverso dal mercato che stai studiando, vedrai la valuta e le offerte sbagliate. Fissa l'IP di uscita al mercato target — un IP residenziale statunitense per i prezzi statunitensi, un IP del Regno Unito per i prezzi del Regno Unito — in modo che i dati corrispondano a quelli che vede un vero acquirente lì.
Come evito di essere bloccato nell'estrazione di Amazon?
Ruota su molti IP residenziali in modo che nessun singolo indirizzo porti il carico, regola con ritardi casuali e un limite di concorrenza, e invia intestazioni coerenti del browser. Valida ogni risposta — un 200 può ancora essere una pagina di verifica robot — e riprova su un nuovo IP piuttosto che analizzare una bloccata. Ad alto volume, un'API di Scraping gestisce tutto questo per te.
Amazon su larga scala non è difficile perché il parsing è difficile — è difficile perché il sito si difende e il prezzo dipende da dove ti trovi. Costruisci partendo dagli ASIN, abbina diversi contenitori di prezzo, fissa la tua geolocalizzazione, ruota i tuoi IP e tratta una risposta breve come un blocco, non come dati. Fai tutto questo correttamente e il tutorial per principianti finalmente scala.
Estrai dati da Amazon con l'API di Scraping di QuantumProxies