Hoe Walmart-productgegevens te Scrapen: JSON, Geo Prijzen, Blokkades
Walmart heeft geen openbare API, personaliseert elke pagina en beschermt scrapers met een druk-en-houd CAPTCHA. Maar zijn Next.js JSON biedt je schone gestructureerde data — als je IP het toegangspunt overleeft. Hier is de volledige methode.
Walmart is 's werelds grootste retailer, wat zijn prijsstelling een levend economisch signaal maakt — en er is geen openbare Walmart API om het te lezen. Dus mensen scrapen. Het goede nieuws: Walmart is een Next.js site, en elke productpagina bevat een enkele JSON blob met de volledige, schone data al geparsed. Het slechte nieuws: een datacenter IP krijgt een druk-en-houd CAPTCHA voordat het die JSON ooit ziet. Deze gids behandelt de betrouwbare methode — lees de hydration JSON in plaats van gestylede HTML, omzeil HUMAN's botbescherming met de juiste IP, en haal winkel-specifieke geo-prijzen op.
Stop met het parsen van tags. Lees de __NEXT_DATA__ JSON
De meeste tutorials leren je om de h1 voor de titel en een span voor de prijs te vinden. Dat werkt totdat Walmart zijn klassenamen herschikt, wat vaak gebeurt. De duurzame aanpak: Walmart rendert React vanuit een script tag met id="__NEXT_DATA__" die het volledige productmodel als JSON bevat. Pak dat eenmaal en elk veld is gestructureerd:
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"])
Het exacte sleutelpad verschuift in de tijd, dus druk de top-level sleutels eenmaal af en navigeer vanaf daar. Maar het principe blijft: de JSON is de bron van waarheid, en het bevat prijs, beschikbaarheid, verkoper, varianten en beoordelingen op één plek — geen per-veld selector om te breken.
De deur: "Robot of mens?"
Voer het verzoek uit vanaf een kaal datacenter IP en je krijgt geen product JSON — je krijgt een pagina die zegt "Robot of mens? Activeer en houd de knop ingedrukt om te bevestigen dat je een mens bent." Dat is HUMAN (voorheen PerimeterX), de botbeschermingslaag die Walmart gebruikt. Het weegt IP-reputatie, TLS-vingerafdruk en headers samen, en een druk-en-houd uitdaging is wat het serveert wanneer de score laag is.
Je lost die CAPTCHA niet op; je voorkomt dat je hem triggert. De grootste hefboom is de IP. Een residentiële proxy presenteert zich als een echte Walmart-shopperverbinding, wat de score hoog genoeg houdt om de echte pagina te serveren. Datacenterbereiken worden vooraf gescoord als verdacht en krijgen de muur bij het eerste verzoek. Onze uiteenzetting van hoe HUMAN automatisering detecteert behandelt wat nog meer die score voedt.

Geo-prijzen: één product, vele prijzen
Walmart-prijzen en voorraad zijn winkel-specifiek. Hetzelfde artikel toont een andere prijs en beschikbaarheid afhankelijk van de winkel locatie, dus een scraper zonder ingestelde locatie leest één willekeurige winkel. Stel de locatie in op basis van ZIP om te bepalen welke winkel je prijst — Walmart bewaart het in een locatiecookie, dus stuur het bij elk verzoek mee:
# 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
Om een product over markten te vergelijken, loop je door je ZIP-lijst en koppel je elke met een residentiële exit in die regio — een New York shopper die NYC winkelprijzen leest is veel coherenter dan een verzoek dat één locatie claimt maar ergens anders uitkomt. Die geo-consistentie is precies waar concurrentieprijsmonitoring op leeft of sterft.
Zoekpagina's en paginering
Voor cataloguswerk, scrape zoekresultaten, niet alleen productpagina's. Twee dingen om te weten: Walmart personaliseert de zoekvolgorde per gebruiker, dus verwacht geen stabiele rangorde over runs, en resultaten beslaan meerdere pagina's die je doorbladert met een page parameter. Hetzelfde __NEXT_DATA__ patroon geldt — de zoek-JSON bevat de volledige lijst van items met prijzen en ID's, dus je hoeft zelden de productpagina aan te raken tenzij je detail op variantniveau wilt:
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
Wanneer te stoppen met handmatig rollen
Ruwe verzoeken plus residentiële IP's brengen je een heel eind op Walmart. Het punt waarop het niet meer loont is schaal: roterende exits per verzoek, de verzoeken die nog steeds de muur raken opnieuw proberen, en de winkel-cookie logica coherent houden over duizenden ZIP's is een echte onderhoudslast. Een Scraper API die de browservingerafdruk draagt, residentiële IP's roteert en geparseerde JSON kan retourneren, vouwt dat samen tot één enkele oproep — je stuurt een Walmart-URL en krijgt het productmodel terug, blokkades afgehandeld. Als je pagina terugkomt als de CAPTCHA-shell in plaats van data, is dat het klassieke lege-pagina symptoom en is het een render-en-IP probleem, geen parserfout.

Verkrijg residentiële IP's die Walmart bereiken
Veelgestelde vragen
Heeft Walmart een productdata API?
Er is geen open openbare API voor willekeurige product- en prijsgegevens, daarom is scrapen de gebruikelijke route. Walmart's affiliate en marketplace-verkoper API's bestaan maar zijn beperkt en beperkt in scope. Voor brede product-, prijs- en beschikbaarheidsverzameling is het lezen van de pagina's __NEXT_DATA__ JSON via residentiële IP's de praktische methode.
Hoe scrape ik Walmart-prijzen zonder geblokkeerd te worden?
Routeer verzoeken via residentiële proxies zodat HUMAN's botbescherming je scoort als een echte shopper, stuur een coherente browser User-Agent en Accept-Language, en lees de hydration JSON in plaats van veel selectorverzoeken te hameren. Pin de winkel door ZIP-cookie en houd de exitregio consistent daarmee. Die combinatie vermijdt de druk-en-houd CAPTCHA bij de meeste verzoeken.
Waarom toont Walmart verschillende prijzen voor hetzelfde product?
Walmart-prijzen en voorraad zijn op winkelniveau. De prijs die je ziet hangt af van de locatie die is ingesteld voor de sessie, dus twee verzoeken met verschillende ZIP-locaties geven legitiem verschillende prijzen terug. Om vergelijkbare gegevens te verzamelen, stel je de ZIP expliciet in en stem je je proxy-exit af op die regio in plaats van Walmart te laten raden vanaf de IP.
Is de __NEXT_DATA__ JSON beter dan het parsen van HTML?
Ja, voor duurzaamheid. Walmart's zichtbare klassenamen veranderen vaak, waardoor CSS-selector scrapers breken, maar de Next.js hydration JSON is een stabiel gestructureerd model van het product met prijs, varianten, verkoper en beschikbaarheid in één object. Parse de JSON eenmaal en je vermijdt een stapel fragiele per-veld selectors.
Walmart is niet moeilijk omdat de data verborgen is — het staat daar in de pagina JSON. Het is moeilijk omdat de deur controleert wie er klopt. Lees __NEXT_DATA__ in plaats van tags, stel de winkel in op ZIP, en klop met een residentiële IP, en je krijgt schone, vergelijkbare productgegevens op schaal. Voor prijswerk in grote winkels breder, strekt hetzelfde draaiboek zich uit naar Best Buy en Target.