Come estrarre dati sui prodotti Walmart: JSON, prezzi geografici, blocchi

Walmart non ha un'API pubblica, personalizza ogni pagina e protegge i scraper con un CAPTCHA da premere e tenere premuto. Ma il suo JSON Next.js ti offre dati strutturati puliti — se il tuo IP supera la porta. Ecco il metodo completo.

Walmart è il più grande rivenditore al mondo, il che rende i suoi prezzi un segnale economico attivo — e non esiste un'API pubblica di Walmart per leggerli. Quindi le persone estraggono dati. La buona notizia: Walmart è un sito Next.js e ogni pagina prodotto contiene un singolo blob JSON con tutti i dati puliti già analizzati. La cattiva notizia: un IP di datacenter incontra un CAPTCHA da premere e tenere premuto prima di vedere quel JSON. Questa guida copre il metodo affidabile — leggi il JSON di idratazione invece dell'HTML stilizzato, supera la difesa bot di HUMAN con l'IP giusto e ottieni prezzi geografici a livello di negozio.

Smetti di analizzare i tag. Leggi il JSON __NEXT_DATA__

La maggior parte dei tutorial ti insegna a trovare l'h1 per il titolo e uno span per il prezzo. Funziona finché Walmart non riorganizza i suoi nomi di classe, cosa che accade spesso. L'approccio durevole: Walmart rende React da un tag script con id="__NEXT_DATA__" contenente l'intero modello del prodotto come JSON. Prendi quello una volta e ogni campo è strutturato:

import requests, json
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
           "https": "http://USER:PASS@gate.quantumproxies.io:8000"}

url = "https://www.walmart.com/ip/1756765288"
r = requests.get(url, headers=headers, proxies=proxies, timeout=20)

soup = BeautifulSoup(r.text, "html.parser")
blob = soup.find("script", id="__NEXT_DATA__")
data = json.loads(blob.string)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
print(product["name"], product["priceInfo"]["currentPrice"]["price"])

Il percorso esatto delle chiavi cambia nel tempo, quindi stampa le chiavi di livello superiore una volta e naviga da lì. Ma il principio rimane: il JSON è la fonte di verità e include prezzo, disponibilità, venditore, varianti e valutazioni in un unico posto — nessun selettore per campo da rompere.

La porta: "Robot o umano?"

Esegui la richiesta da un IP di datacenter nudo e non otterrai il JSON del prodotto — otterrai una pagina che dice "Robot o umano? Attiva e tieni premuto il pulsante per confermare che sei umano." Questo è HUMAN (precedentemente PerimeterX), il livello di difesa bot che Walmart utilizza. Valuta la reputazione dell'IP, l'impronta digitale TLS e le intestazioni insieme, e una sfida da premere e tenere premuto è ciò che serve quando il punteggio è basso.

Non risolvi quel CAPTCHA; eviti di attivarlo. La leva singola più grande è l'IP. Un proxy residenziale si presenta come la connessione di un vero acquirente di Walmart, mantenendo il punteggio abbastanza alto da servire la vera pagina. Gli intervalli di datacenter sono pre-valutati come sospetti e ottengono il muro alla prima richiesta. La nostra analisi di come HUMAN rileva l'automazione copre cos'altro alimenta quel punteggio.

Pipeline per estrarre dati sui prodotti Walmart: URL del prodotto attraverso un'uscita residenziale al JSON __NEXT_DATA__ e righe strutturate
Instrada attraverso un'uscita residenziale, quindi leggi il JSON di idratazione — nessun selettore HTML fragile nel percorso.

Prezzi geografici: un prodotto, molti prezzi

I prezzi e le scorte di Walmart sono specifici per negozio. Lo stesso articolo mostra un prezzo e una disponibilità diversi a seconda della posizione di acquisto, quindi uno scraper senza posizione impostata sta leggendo un negozio arbitrario. Imposta la posizione tramite CAP per controllare quale negozio stai valutando — Walmart lo persiste in un cookie di posizione, quindi invialo su ogni richiesta:

# pin the store location by US ZIP before reading price/stock
cookies = {"assortmentStoreId": "3081", "locationData": '{"postalCode":"10001"}'}

r = requests.get(url, headers=headers, cookies=cookies,
                 proxies=proxies, timeout=20)
# now priceInfo + availabilityStatus reflect that store

Per confrontare un prodotto tra i mercati, cicla la tua lista CAP e abbina ciascuno a un'uscita residenziale in quella regione — un acquirente di New York che legge i prezzi del negozio di NYC è molto più coerente di una richiesta che afferma una posizione ma esce da un'altra parte. Quella coerenza geografica è esattamente ciò su cui si basa il monitoraggio dei prezzi dei concorrenti.

Pagine di ricerca e paginazione

Per il lavoro di catalogo, estrai i risultati di ricerca, non solo le pagine dei prodotti. Due cose da sapere: Walmart personalizza l'ordinamento delle ricerche per utente, quindi non aspettarti un rango stabile tra le esecuzioni, e i risultati si estendono su più pagine che attraversi con un parametro page. Lo stesso schema __NEXT_DATA__ si applica — il JSON di ricerca contiene l'elenco completo degli articoli con prezzi e ID, quindi raramente è necessario toccare la pagina del prodotto a meno che non si desideri dettagli a livello di variante:

def search(query, pages=5):
    items = []
    for page in range(1, pages + 1):
        url = f"https://www.walmart.com/search?q={query}&page={page}"
        html = requests.get(url, headers=headers, cookies=cookies,
                            proxies=proxies, timeout=20).text
        blob = BeautifulSoup(html, "html.parser").find("script", id="__NEXT_DATA__")
        data = json.loads(blob.string)
        stacks = data["props"]["pageProps"]["initialData"]["searchResult"]["itemStacks"]
        for stack in stacks:
            items += stack["items"]
    return items

Quando smettere di farlo manualmente

Richieste grezze più IP residenziali ti portano lontano su Walmart. Il punto in cui smette di essere vantaggioso è la scala: ruotare le uscite per richiesta, riprovare quelle che colpiscono ancora il muro e mantenere la logica del cookie del negozio coerente su migliaia di CAP è un vero carico di manutenzione. Un Scraper API che trasporta l'impronta digitale del browser, ruota gli IP residenziali e può restituire JSON analizzato collassa tutto in una singola chiamata — invii un URL di Walmart e ottieni indietro il modello del prodotto, blocchi gestiti. Se la tua pagina torna come il guscio CAPTCHA invece dei dati, quello è il classico sintomo di pagina vuota ed è un problema di rendering e IP, non un bug del parser.

Walmart HUMAN CAPTCHA da premere e tenere premuto che blocca un IP di datacenter mentre un IP residenziale passa per ottenere JSON del prodotto pulito
Non risolvi la barriera da premere e tenere premuto — mantieni il tuo punteggio di fiducia abbastanza alto da non farla mai apparire.

Ottieni IP residenziali che raggiungono Walmart

Domande frequenti

Walmart ha un'API di dati sui prodotti?

Non esiste un'API pubblica aperta per dati arbitrari su prodotti e prezzi, motivo per cui l'estrazione è il percorso comune. Esistono le API per affiliati e venditori di marketplace di Walmart, ma sono limitate e ristrette. Per una raccolta ampia di prodotti, prezzi e disponibilità, leggere il JSON __NEXT_DATA__ della pagina tramite IP residenziali è il metodo pratico.

Come posso estrarre prezzi Walmart senza essere bloccato?

Instrada le richieste tramite proxy residenziali in modo che la difesa bot di HUMAN ti valuti come un vero acquirente, invia un User-Agent e un Accept-Language del browser coerenti e leggi il JSON di idratazione invece di martellare molte richieste di selettori. Fissa il negozio tramite cookie CAP e mantieni la regione di uscita coerente con esso. Quella combinazione evita il CAPTCHA da premere e tenere premuto sulla maggior parte delle richieste.

Perché Walmart mostra prezzi diversi per lo stesso prodotto?

I prezzi e le scorte di Walmart sono a livello di negozio. Il prezzo che vedi dipende dalla posizione impostata per la sessione, quindi due richieste con diverse posizioni CAP restituiscono legittimamente prezzi diversi. Per raccogliere dati comparabili, fissa il CAP esplicitamente e abbina la tua uscita proxy a quella regione piuttosto che lasciare che Walmart indovini dall'IP.

Il JSON __NEXT_DATA__ è migliore del parsing HTML?

Sì, per la durata. I nomi di classe visibili di Walmart cambiano frequentemente, rompendo i scraper basati su selettori CSS, ma il JSON di idratazione Next.js è un modello strutturato stabile del prodotto con prezzo, varianti, venditore e disponibilità in un unico oggetto. Analizza il JSON una volta e eviti una pila di selettori fragili per campo.

Walmart non è difficile perché i dati sono nascosti — sono proprio lì nel JSON della pagina. È difficile perché la porta controlla chi bussa. Leggi __NEXT_DATA__ invece dei tag, imposta il negozio tramite CAP e bussa con un IP residenziale, e ottieni dati sui prodotti puliti e comparabili su larga scala. Per il lavoro sui prezzi dei grandi magazzini più in generale, lo stesso schema si estende a Best Buy e Target.

Estrai dati da Walmart con una chiamata API