Jak zeskrobać dane produktów Walmart: JSON, ceny geo, blokady
Walmart nie ma publicznego API, personalizuje każdą stronę i zabezpiecza skrobaki CAPTCHA z przyciskiem do przytrzymania. Ale jego JSON Next.js daje ci czyste, strukturalne dane — jeśli twój IP przetrwa wejście. Oto cała metoda.
Walmart jest największym detalistą na świecie, co czyni jego ceny żywym sygnałem ekonomicznym — i nie ma publicznego API Walmart, aby je odczytać. Więc ludzie skrobią. Dobra wiadomość: Walmart to strona Next.js, a każda strona produktu zawiera pojedynczy blob JSON z pełnymi, czystymi danymi już przeanalizowanymi. Zła wiadomość: IP centrum danych napotyka CAPTCHA z przyciskiem do przytrzymania, zanim zobaczy ten JSON. Ten przewodnik obejmuje niezawodną metodę — czytaj JSON hydratacyjny zamiast stylizowanego HTML, przejdź przez obronę botów HUMAN z odpowiednim IP i pobierz ceny geo na poziomie sklepu.
Przestań analizować tagi. Czytaj JSON __NEXT_DATA__
Większość poradników uczy cię, jak znaleźć h1 dla tytułu i span dla ceny. To działa, dopóki Walmart nie przetasuje nazw klas, co zdarza się często. Trwałe podejście: Walmart renderuje React z tagu skryptu z id="__NEXT_DATA__", zawierającym cały model produktu jako JSON. Pobierz to raz, a każde pole jest strukturalne:
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"])
Dokładna ścieżka klucza zmienia się z czasem, więc wydrukuj klucze najwyższego poziomu raz i nawiguj stamtąd. Ale zasada pozostaje: JSON jest źródłem prawdy i zawiera cenę, dostępność, sprzedawcę, warianty i oceny w jednym miejscu — żadnego selektora na pole, który mógłby się zepsuć.
Drzwi: "Robot czy człowiek?"
Uruchom żądanie z gołego IP centrum danych, a nie dostaniesz JSON produktu — dostaniesz stronę, która mówi "Robot czy człowiek? Aktywuj i przytrzymaj przycisk, aby potwierdzić, że jesteś człowiekiem." To jest HUMAN (dawniej PerimeterX), warstwa obrony botów, którą prowadzi Walmart. Waży reputację IP, odcisk TLS i nagłówki razem, a wyzwanie z przyciskiem do przytrzymania to, co serwuje, gdy wynik jest niski.
Nie rozwiązujesz tej CAPTCHA; unikasz jej wywołania. Największą dźwignią jest IP. Proxy rezydencyjne prezentuje się jako połączenie prawdziwego klienta Walmart, co utrzymuje wynik wystarczająco wysoki, aby serwować prawdziwą stronę. Zakresy centrów danych są wstępnie oceniane jako podejrzane i dostają ścianę na pierwsze żądanie. Nasza analiza jak HUMAN wykrywa automatyzację obejmuje, co jeszcze wpływa na ten wynik.

Ceny geo: jeden produkt, wiele cen
Ceny i zapasy Walmart są specyficzne dla sklepu. Ten sam przedmiot pokazuje inną cenę i dostępność w zależności od lokalizacji zakupów, więc skrobak bez ustawionej lokalizacji czyta jeden arbitralny sklep. Ustaw lokalizację według kodu ZIP, aby kontrolować, który sklep wyceniasz — Walmart przechowuje to w ciasteczku lokalizacji, więc wysyłaj je przy każdym żądaniu:
# 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
Aby porównać produkt na różnych rynkach, przejdź przez swoją listę ZIP i sparuj każdy z wyjściem rezydencyjnym w tym regionie — klient z Nowego Jorku czytający ceny sklepu NYC jest znacznie bardziej spójny niż żądanie, które twierdzi, że jest z jednej lokalizacji, ale wychodzi gdzie indziej. Ta spójność geo to dokładnie to, na czym opiera się monitorowanie cen konkurencji.
Strony wyszukiwania i paginacja
Do pracy katalogowej, zeskrob wyniki wyszukiwania, a nie tylko strony produktów. Dwie rzeczy do zapamiętania: Walmart personalizuje kolejność wyszukiwania dla każdego użytkownika, więc nie oczekuj stabilnej pozycji w różnych uruchomieniach, a wyniki obejmują wiele stron, które przeglądasz za pomocą parametru page. Ten sam wzorzec __NEXT_DATA__ ma zastosowanie — JSON wyszukiwania zawiera pełną listę pozycji z cenami i identyfikatorami, więc rzadko musisz dotykać strony produktu, chyba że chcesz szczegóły na poziomie wariantu:
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
Kiedy przestać robić to ręcznie
Surowe żądania plus IP rezydencyjne dają ci długą drogę na Walmart. Punkt, w którym przestaje to się opłacać, to skala: rotacja wyjść na żądanie, ponowne próby tych, które nadal trafiają na ścianę, i utrzymanie spójności logiki ciasteczek sklepu w tysiącach ZIP to prawdziwe obciążenie konserwacyjne. Scraper API, które przenosi odcisk palca przeglądarki, rotuje IP rezydencyjne i może zwrócić przeanalizowany JSON, redukuje to do jednego wywołania — wysyłasz URL Walmart i otrzymujesz model produktu z powrotem, bloki obsługiwane. Jeśli twoja strona wraca jako powłoka CAPTCHA zamiast danych, to klasyczny objaw pustej strony i to problem z renderowaniem i IP, a nie błąd parsera.

Zdobądź IP rezydencyjne, które docierają do Walmart
Często zadawane pytania
Czy Walmart ma API danych produktów?
Nie ma otwartego publicznego API dla dowolnych danych produktów i cen, dlatego skrobanie jest powszechną drogą. Istnieją API dla afiliantów i sprzedawców na rynku Walmart, ale są one ograniczone i mają ograniczony zakres. Do szerokiego zbierania danych o produktach, cenach i dostępności, odczytywanie JSON __NEXT_DATA__ strony przez IP rezydencyjne jest praktyczną metodą.
Jak zeskrobać ceny Walmart bez blokady?
Przekieruj żądania przez proxy rezydencyjne, aby obrona botów HUMAN oceniła cię jako prawdziwego klienta, wyślij spójny User-Agent przeglądarki i Accept-Language, i czytaj JSON hydratacyjny zamiast uderzać w wiele żądań selektorów. Przypnij sklep przez ciasteczko ZIP i utrzymuj spójność regionu wyjścia z nim. Ta kombinacja unika CAPTCHA z przyciskiem do przytrzymania w większości żądań.
Dlaczego Walmart pokazuje różne ceny dla tego samego produktu?
Ceny i zapasy Walmart są na poziomie sklepu. Cena, którą widzisz, zależy od lokalizacji ustawionej dla sesji, więc dwa żądania z różnymi lokalizacjami ZIP rzeczywiście zwracają różne ceny. Aby zebrać porównywalne dane, ustaw ZIP explicite i dopasuj swoje wyjście proxy do tego regionu, zamiast pozwalać Walmartowi zgadywać na podstawie IP.
Czy JSON __NEXT_DATA__ jest lepszy niż analizowanie HTML?
Tak, dla trwałości. Widoczne nazwy klas Walmart zmieniają się często, łamiąc skrobaki CSS-selektorów, ale JSON hydratacyjny Next.js jest stabilnym, strukturalnym modelem produktu z ceną, wariantami, sprzedawcą i dostępnością w jednym obiekcie. Przeanalizuj JSON raz i unikniesz stosu kruchych selektorów na pole.
Walmart nie jest trudny, ponieważ dane są ukryte — są tam w JSON strony. Jest trudny, ponieważ drzwi sprawdzają, kto puka. Czytaj __NEXT_DATA__ zamiast tagów, ustaw sklep przez ZIP i pukaj z IP rezydencyjnym, a uzyskasz czyste, porównywalne dane produktów na dużą skalę. Dla pracy z cenami w dużych sklepach bardziej ogólnie, ten sam podręcznik rozszerza się na Best Buy i Target.