Walmart mění ceny u některých položek několikrát denně. Pokud jste to někdy zkoušeli sledovat programově, znáte ten problém: skript běží 20 minut a pak tiše začne vracet stránky s CAPTCHA, které jsou maskované jako běžné odpovědi 200 OK.
V Thunderbitu jsem strávil spoustu času prací na obcházení anti-bot ochran Walmartu v rámci naší práce na extrakci dat a chci se podělit o všechno, co jsem se naučil — metody, které v roce 2025 opravdu fungují, tiché chyby, které vám kazí data, i upřímné kompromisy mezi vlastním scraperem, placeným scraping API a prostým použitím no-code nástroje. Tenhle průvodce pokrývá tři metody extrakce (parsování HTML, JSON z __NEXT_DATA__ a zachytávání interního API), produkčně připravené zpracování chyb, které většina návodů úplně přeskočí, a poctivý rozhodovací rámec pro výběr správného přístupu. Ať už píšete v Pythonu, nebo jen chcete mít do oběda tabulku plnou cen, najdete si tu svoje.
Proč scrapovat Walmart pomocí Pythonu?
Walmart je podle tržeb největší maloobchodník na světě — ve fiskálním roce 2025 utržil 680,985 miliardy dolarů a 12 let po sobě držel 1. místo v žebříčku Fortune Global 500. Na webu má zhruba 420 milionů aktivních nabídek a CFO Walmartu mluvil o „půl miliardě SKU“ na marketplace. Asi 95 % těchto nabídek pochází od prodejců třetích stran, což znamená, že katalog je hodně proměnlivý — prodejci se střídají, varianty se mění a zásoby se denně obracejí.

Právě tahle proměnlivost dělá scraping důležitým. Čtvrtletní report nezachytí to, co noční scrape ano. Tady jsou nejčastější use-cases, se kterými se setkávám:
| Případ použití | Kdo to potřebuje | Co extrahují |
|---|---|---|
| Sledování cen konkurence | E-commerce provoz, nástroje pro repricing | Ceny, akce, soulad s MAP |
| Obohacení produktového katalogu | Prodejní a merchandising týmy | Popisy, obrázky, specifikace, varianty |
| Sledování dostupnosti zásob | Supply chain, dropshippeři | Stav zásob, informace o prodejci |
| Průzkum trhu a analýza trendů | Marketing, produktoví manažeři | Hodnocení, recenze, sortiment kategorií |
| Generování leadů | Obchodní týmy | Jména prodejců, počty produktů, kategorie |
Jen trh se softwarem pro sledování cen konkurence dosáhl v roce 2025 1,92 miliardy dolarů a podle předpovědí má do roku 2033 vzrůst na 5,09 miliardy. Výdaje táhne chování zákazníků: 94 % zákazníků při online nákupu porovnává ceny a 83 % z nich srovnává nabídky napříč více weby.
Python je pro tuhle práci výchozí jazyk. Apify ve své Infrastructure Report 2026 uvádí, že Python tvoří 71,7 % veškerého web scrapingu a základní knihovna (requests) má asi 30 milionů stažení týdně. Pokud scrapujete v jakémkoli větším měřítku, je téměř jisté, že to děláte v Pythonu.
Proč je Walmart jedním z nejtěžších webů ke scrapování
Walmart je specificky těžký, protože běží na dvou komerčních anti-bot produktech v řadě: Akamai Bot Manager jako edge WAF a vrstva pro TLS fingerprinting, a PerimeterX (přejmenovaný na HUMAN Security) jako behaviorální JavaScript challenge vrstva. Scrape.do tuhle kombinaci popisuje jako „vzácnou a extrémně obtížně obcházenou“.

ScrapeOps hodnotí Walmart na 9/10 v celkové obtížnosti scrapování, přičemž samotný Akamai má 9/10. Z mé zkušenosti to sedí.
Tady je, proti čemu skutečně stojíte:
Akamai Bot Manager kontroluje váš TLS fingerprint (hash JA3/JA4), pořadí HTTP/2 rámců, pořadí a velikost písmen hlaviček i session cookies (_abck, ak_bmsc). Běžný Python requests vytváří TLS fingerprint, který žádný skutečný prohlížeč nevygeneruje — Akamai ho odhalí dřív, než se váš požadavek vůbec dostane k serverům Walmartu.
PerimeterX/HUMAN běží po Akamai a provádí JavaScript fingerprinting (px.js), který kontroluje vlastnosti navigatoru, vykreslování canvasu, WebGL, audio context a behaviorální biometriku (pohyb myši, rychlost scrollování, dynamiku stisku kláves). Viditelným selháním je nechvalně známá výzva „Press & Hold“ — tlačítko, které musíte držet asi 10 sekund, zatímco se sbírají behaviorální signály. Oxylabs to říká natvrdo: „Walmart používá model CAPTCHA ‚Press & Hold‘ od PerimeterX, který je z kódu téměř nemožné vyřešit.“
Opravdu nebezpečné je tiché zablokování. Walmart místo 403 vrací HTTP 200 s tělem CAPTCHA. ScrapingBee to potvrzuje: „Walmart vrací status code 200 OK i tehdy, když servíruje CAPTCHA stránku. Nemůžete se spoléhat jen na status code, abyste poznali, jestli byl požadavek úspěšný.“ Váš skript s chutí parseuje HTML z CAPTCHA jako „produkt nenalezen“ a pokračuje dál. Polovina datasetu je pak odpad a vy o tom nevíte.
Pak je tu problém dat vázaných na obchod. Ceny a sklad Walmartu jsou závislé na lokaci a řídí je cookies jako locDataV3 a assortmentStoreId. Bez správných cookies dostanete „výchozí národní“ data, která mohou vypadat kompletně, ale neodpovídají tomu, co vidí skuteční zákazníci. Chybějící cookies nevyrobí blokovací stránku — vyrobí špatná data bez viditelného selhání, což je ještě horší.
Tři metody, jak z Walmartu extrahovat data (a jak si vedou navzájem)
Než přejdeme na postup krok za krokem, tady jsou tři hlavní přístupy k extrakci. Většina konkurenčních návodů popisuje jen jeden nebo dva. Projdeme si všechny tři, abyste si mohli vybrat ten, který odpovídá vaší situaci.
| Metoda | Spolehlivost | Úplnost dat | Obtížnost vůči anti-botu | Náročnost údržby |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ Nízká (selektory se mění s každým nasazením) | Střední | Vysoká | Vysoká |
JSON z __NEXT_DATA__ | ✅ Dobrá | Vysoká | Středně vysoká | Střední |
| Zachytávání interního API | ✅ Nejlepší | Nejvyšší (varianty, sklad, recenze) | Středně vysoká | Nízká (strukturované JSON) |
| Thunderbit (bez kódu) | ✅ Dobrá | Vysoká | Nízká (řeší AI) | Žádná |
Parsování HTML je pro Walmart nejhorší volba — web používá Next.js bundle a hashované názvy CSS tříd, které se při každém nasazení mění. Metoda s __NEXT_DATA__ JSON je pragmatická volba, kterou používá každý seriózní open-source Walmart scraper z let 2024–2026. Zachytávání interních API je nejsilnější, ale přináší komplikace, které většina návodů přechází. A Thunderbit je správná volba, když vlastně vůbec nepotřebujete vlastní pipeline.
Vyzkoušet Thunderbit pro scraping Walmartu
Nastavení Python prostředí pro scraping Walmartu
Co budete potřebovat:
- Obtížnost: Střední
- Potřebný čas: asi 30 minut na nastavení, plus čas na programování
- Co budete potřebovat: Python 3.10+, pip, editor kódu a (pro produkční použití) proxy službu nebo scraping API
Vytvořte složku projektu a virtuální prostředí:
mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate # Ve Windows: venv\Scripts\activate
Nainstalujte potřebné knihovny:
pip install curl_cffi parsel beautifulsoup4 lxml
curl_cffi je v roce 2025 standard pro scraping těžko dostupných webů. Je to binding na libcurl, který dokáže napodobit přesný TLS fingerprint prohlížeče. Bright Data vysvětluje: „Walmart používá TLS fingerprinting jako součást detekce botů a ani nastavení User-Agentu tak, aby simuloval skutečný prohlížeč, to neobejde.“ Samotný requests nebo httpx nedokážou Akamai projít, ať nastavíte jakékoli hlavičky. To, co dělá rozdíl, je curl_cffi s impersonate="chrome124".
Hodit se vám bude také json (součást standardní knihovny), csv (součást standardní knihovny), time, random a logging pro produkční vzory, které si ukážeme níže.
Krok za krokem: scraping produktových stránek Walmartu pomocí Pythonu
Krok 1: Načtěte produktovou stránku Walmartu
První úkol je poslat HTTP požadavek, který nebude okamžitě zablokován. Tady je standardní sada hlaviček používaná napříč Scrapfly, Scrapingdog, Oxylabs a ScrapeOps v letech 2024–2026:
from curl_cffi import requests
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36"
),
"Accept": (
"text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/avif,image/webp,*/*;q=0.8"
),
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Referer": "https://www.google.com/",
}
session = requests.Session(impersonate="chrome124")
url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
response = session.get(url, headers=HEADERS)
Parametr impersonate="chrome124" tady dělá hlavní práci. Říká curl_cffi, aby přesně napodobil TLS ClientHello, pořadí HTTP/2 rámců a sekvenci pseudo-headerů v Chromu 124. Bez toho Akamai vidí Python-specific JA3 hash a zablokuje vás dřív, než se požadavek dostane k aplikační vrstvě Walmartu.
Jak vypadá zablokovaná odpověď: Pokud v HTML titulku odpovědi uvidíte "Robot or human?", nebo pokud se odpověď přesměruje na walmart.com/blocked, byli jste odhaleni. Záludnost je v tom, že Walmart často vrací status code 200 s CAPTCHA tělem — proto samotné response.ok nestačí.
Pro jakékoli produkční nebo opakované použití budete potřebovat rezidenční proxy. Datacentrové IP adresy jsou okamžitě spálené systémem reputace IP adres Akamai. Plnou strategii chyb i proxy popíšu v produkční části níže.
Krok 2: Parsování produktových dat z JSONu __NEXT_DATA__
Walmart.com je aplikace v Next.js a server-side renderovaný HTML kód vkládá celý hydration payload do jediného script tagu: <script id="__NEXT_DATA__" type="application/json">. To je zlatý důl.
Průvodce Scrapfly z roku 2026 potvrzuje: „V roce 2026 používá Walmart Next.js se strukturovaným JSONem v tagu __NEXT_DATA__, takže extrakce skrytých dat je spolehlivější než tradiční parsování pomocí CSS selektorů.“ Každý významný open-source Walmart scraper — od Scrapfly, Oxylabs, python-scrapy-playbook — používá právě tuto metodu.
Jak ho získat:
import json
from parsel import Selector
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
Většina návodů tady končí. Níže je kompletní mapa JSON cest pro pole, která vás skutečně zajímají — ověřená na živých stránkách Walmartu v letech 2024–2026:
| Datové pole | JSON cesta (pod initialData) | Typ | Poznámky |
|---|---|---|---|
| Název produktu | data > product > name | Řetězec | — |
| Značka | data > product > brand | Řetězec | — |
| Aktuální cena (číslo) | data > product > priceInfo > currentPrice > price | Float | Může se lišit podle cookies obchodu |
| Aktuální cena (řetězec) | data > product > priceInfo > currentPrice > priceString | Řetězec | Formát např. "$9.99" |
| Krátký popis | data > product > shortDescription | HTML řetězec | Pro text parsujte pomocí BeautifulSoup |
| Dlouhý popis | data > idml > longDescription | HTML řetězec | Leží v idml, NE uvnitř product — to je past, kterou starší návody dělají špatně |
| Všechny obrázky | data > product > imageInfo > allImages | Pole | Seznam objektů {id, url} |
| Průměrné hodnocení | data > product > averageRating | Float | Klíč je averageRating, ne staré rating |
| Počet recenzí | data > product > numberOfReviews | Integer | — |
| Varianty | data > product > variantCriteria | Pole | Skupiny možností (velikost, barva) |
| Dostupnost | data > product > availabilityStatus | Řetězec | IN_STOCK, OUT_OF_STOCK, LIMITED_STOCK |
| Prodejce | data > product > sellerDisplayName | Řetězec | — |
| Výrobce | data > product > manufacturerName | Řetězec | — |
Právě cesta longDescription je ta jedna past, na kterou lidé narážejí. Příspěvek na ScrapeHero z roku 2023 ji umisťoval na product.longDescription, ale zdroje z let 2024+ ji konzistentně dávají na sourozenecký klíč idml. Vždy nejdřív čtěte idml.longDescription a pro starší stránky až potom sáhněte po product.longDescription.
Tady je bezpečný vzor extrakce s řetězením .get():
def extract_product(data):
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
price_info = product.get("priceInfo", {})
current_price = price_info.get("currentPrice", {})
image_info = product.get("imageInfo", {})
return {
"name": product.get("name"),
"brand": product.get("brand"),
"price": current_price.get("price"),
"price_string": current_price.get("priceString"),
"short_desc": product.get("shortDescription"),
"long_desc": idml.get("longDescription", product.get("longDescription")),
"images": [img.get("url") for img in image_info.get("allImages", [])],
"rating": product.get("averageRating"),
"review_count": product.get("numberOfReviews"),
"variants": product.get("variantCriteria"),
"availability": product.get("availabilityStatus"),
"seller": product.get("sellerDisplayName"),
"manufacturer": product.get("manufacturerName"),
}
Pro uživatele, kteří se vůbec nechtějí zabývat navigací po JSON cestách, Thunderbit AI tyto pole automaticky rozpozná a strukturuje — žádné ruční mapování cest není potřeba. Kliknete na „AI Suggest Fields“, stránka se přečte a dostanete tabulku. Ale pokud stavíte vlastní pipeline, mapa výše je vaše reference.
Krok 3: Zachytávání interních API endpointů Walmartu pro bohatší data
Žádný konkurenční článek tuhle metodu pořádně nepokrývá. Je to nejsilnější cesta extrakce — a zároveň nejsložitější.
Frontend Walmartu volá federovaný GraphQL backend postavený na Apollo Gateway. Endpoints se nacházejí pod www.walmart.com/orchestra/*:
/orchestra/pdp/graphql/...— hydratace detailu produktu + přepínání variant/orchestra/snb/graphql/...— stránkování search-n-browse/orchestra/reviews/graphql/...— stránkované recenze
Tyto endpointy vracejí čistý, strukturovaný JSON s daty, která __NEXT_DATA__ někdy ořezává — ceny na úrovni variant, stav zásob v reálném čase, plné stránkování recenzí.
Háček, který blogové články obcházejí: Walmart používá persistované dotazy Apollo. Tělo požadavku posílá pouze SHA-256 hash (persistedQuery.sha256Hash), ne text dotazu. Pokud hash server nezná, dostanete PersistedQueryNotFound. Walmart tyto hashe při nasazení mění. Proto žádný z vysoce známých open-source Walmart scraperů nezveřejňuje jednoduše kopírovatelný kód pro /orchestra/.
Praktická a poctivá verze téhle metody je práce v DevTools:
- Otevřete produktovou stránku Walmartu v Chromu
- Otevřete DevTools → karta Network, filtrujte „Fetch/XHR“
- Procházejte stránku běžným způsobem — klikejte na varianty, scrollujte k recenzím, měňte lokaci obchodu
- Sledujte požadavky na endpointy
/orchestra/*, které vracejí JSON s produktovými daty - Na požadavek klikněte pravým tlačítkem → „Copy as cURL“
- cURL příkaz převeďte do Pythonu pomocí
curl_cffi
Takhle vypadá přehraný API request:
import json
from curl_cffi import requests
session = requests.Session(impersonate="chrome124")
# Nejprve zahřejte session návštěvou produktové stránky
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
# Pak přehrajte interní API request (zkopírovaný z DevTools)
api_url = "https://www.walmart.com/orchestra/pdp/graphql"
api_headers = {
**HEADERS,
"accept": "application/json",
"content-type": "application/json",
"referer": "https://www.walmart.com/ip/some-product/1234567",
"wm_qos.correlation_id": "vámi_zkopírované_correlation_id",
}
payload = {
# Vložte přesné tělo requestu z DevTools
"variables": {"productId": "1234567"},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "hash_který_jste_zkopírovali"
}
}
}
api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()
Krok zahřátí session je zásadní. PerimeterX cookies Walmartu (_px3, _pxhd, ACID) musí být nastavené prvním HTML fetch requestem, než bude API volání úspěšné. Bez nich dostanete 412 nebo 403.
Kdy tuhle metodu použít: Když potřebujete data, která __NEXT_DATA__ neobsahuje — detailní ceny variant, stránkované recenze za první dávkou nebo aktuální počty zásob. Pro většinu use-cases stačí __NEXT_DATA__ a je mnohem jednodušší.
Scraping výsledků vyhledávání Walmartu a více stránek
Výsledky vyhledávání používají podobný vzor __NEXT_DATA__, ale s jinou JSON cestou:
search_url = "https://www.walmart.com/search?q=laptops&page=1"
response = session.get(search_url, headers=HEADERS)
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
items = search_result["itemStacks"][0]["items"]
# Odfiltrujte sponzorované produkty
organic_items = [i for i in items if i.get("__typename") == "Product"]
for item in organic_items:
print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))
Stránkování funguje zvyšováním parametru page: &page=1, &page=2 atd. Ale tady je nezdokumentované omezení: Walmart omezuje výsledky vyhledávání na 25 stránek bez ohledu na skutečný celkový počet výsledků. Scrapfly to potvrzuje: „Walmart nastavuje maximální počet přístupných stránek výsledků na 25 bez ohledu na celkový počet dostupných stránek.“
Workaroundy pro hlubší pokrytí:
- Přepínání řazení: Spusťte stejný dotaz s
&sort=price_lowa pak s&sort=price_high, abyste získali pokrytí asi 50 stránek - Dělení podle cenového rozsahu: Přidejte
&min_price=X&max_price=Y, aby se katalog rozsekal na menší okna - Dělení podle kategorií: Hledejte v konkrétních kategoriích místo napříč celým webem
Upozorňuji, že itemStacks je pole. Scrapfly ve svém repu natvrdo používá [0], ale kategoriové a browse stránky někdy obsahují více stacků („Top picks“, „More results“). Robustní vzor iteruje přes všechny stacky:
for stack in search_result.get("itemStacks", []):
for item in stack.get("items", []):
if item.get("__typename") == "Product":
# zpracovat item
pass
Ještě jedna důležitá věc: robots.txt Walmartu zakazuje /search. Produktové detailové stránky (/ip/...) a většina kategoriových stránek (/cp/...) zakázané nejsou. Pokud řešíte soulad s pravidly, začněte produktovými stránkami a stromem kategorií, ne vyhledáváním.
Nenechte tiché bloky zničit vaše data: zpracování chyb připravené pro produkci
Většina návodů tady selže. Ukážou vám, jak stáhnout jednu stránku, parseovat jeden produkt a jít dál. V produkci ale stahujete tisíce stránek a Walmart se vás aktivně snaží zastavit. Rozdíl mezi demo scraperem a scraperem, který opravdu funguje, je v tom, jak zvládá chyby.
Odhalte tichá blokování dřív, než zkazí data
Jedna z nejdůležitějších funkcí Walmart scraperu je detektor blokace. Podle shody mezi ScrapingBee, Scrapingdog, Oxylabs a Decodo potřebujete čtyři nezávislé kontroly:
BLOCK_MARKERS = (
"Robot or human",
"Press & Hold",
"Press & Hold",
"px-captcha",
"perimeterx",
)
def is_walmart_blocked(response) -> bool:
# 1. Přesměrování na dedikovaný blokovací endpoint
if "/blocked" in str(response.url):
return True
# 2. Tvrdé status kódy
if response.status_code in (403, 412, 428, 429, 503):
return True
# 3. 200 OK s tělem CAPTCHA (případ tichého blokování)
body = response.text or ""
if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
return True
# 4. Kontrola délky odpovědi — skutečné PDP má 300–900 KB
if len(response.content) < 50_000 and "/ip/" in str(response.url):
return True
return False
Ta čtvrtá kontrola — délka odpovědi — zachytí případy, kdy Walmart vrátí osekanou stránku, která neobsahuje zjevné CAPTCHA markery, ale zároveň neobsahuje data, která potřebujete.
Retry logika s exponenciálním backoffem a jitterem
Když požadavek selže, nechcete na Walmart okamžitě tlačit znovu. Standardní vzor používá exponenciální backoff s jitterem, aby se opakované pokusy nerozbíhaly synchronně:
import time
import random
import logging
from curl_cffi import requests as cffi_requests
log = logging.getLogger("walmart")
def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
for attempt in range(max_retries):
try:
response = session.get(url, headers=HEADERS, timeout=15)
if response.status_code in (429, 503):
raise Exception(f"Throttled: {response.status_code}")
if is_walmart_blocked(response):
raise Exception("Detekováno tiché blokování")
return response
except Exception as e:
if attempt == max_retries - 1:
raise
wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
log.warning(f"Pokus {attempt + 1} selhal: {e}. Opakuji za {wait:.1f}s")
time.sleep(wait)
return None
Jitter (random.uniform(0, 3)) není kosmetika — rozlaďuje pracovníky tak, aby se fleet scraperů nevracel ve stejnou sekundu a nespouštěl Akamai velocity detekci.
Rate limiting
Thunderbit i Scrape.do se u Walmartu shodují na náhodném zpoždění 3–6 sekund na jeden request: „omezte tempo požadavků čekáním 3–6 sekund mezi načteními stránek a zpoždění náhodně měňte.“
import time
import random
def rate_limited_fetch(session, url):
response = fetch_with_retry(session, url)
time.sleep(random.uniform(3.0, 6.0))
return response
Ve větším měřítku zvažte aiolimiter pro async rate limiting:
from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60) # 10 requestů za minutu
Validace dat
I když odpověď není blokovaná, parsovaná data mohou být chybná (špatný obchod, degradovaný payload). Před zápisem do výstupu je ověřte:
def validate_product(product):
"""Vrací True, pokud data o produktu vypadají legitimně."""
if not product.get("name"):
return False
price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
if not isinstance(price, (int, float)) or price <= 0:
return False
if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
return False
return True
Logování session
Sledujte úspěšnost podle session. Když během 10 minut klesne pod 80 %, něco se změnilo — buď je vaše IP spálená, vypršely cookies, nebo Walmart nasadil nové anti-bot pravidlo.
class ScrapeMetrics:
def __init__(self):
self.total = 0
self.success = 0
self.blocks = 0
self.errors = 0
def record(self, result):
self.total += 1
if result == "success":
self.success += 1
elif result == "blocked":
self.blocks += 1
else:
self.errors += 1
@property
def success_rate(self):
return (self.success / self.total * 100) if self.total > 0 else 0
def check_health(self):
if self.total > 20 and self.success_rate < 80:
log.critical(f"Úspěšnost klesla na {self.success_rate:.1f}% — zvažte rotaci proxy nebo pauzu")
Nic okázalého. Ale právě to udržuje vaše data čistá.
DIY Python vs. scraping API vs. no-code: jak zvolit správný přístup pro scraping Walmartu
Spousta vývojářů se bez rozmyslu pustí do psaní vlastního scraperu, aniž by si položili otázku, jestli je to opravdu správná volba. ScrapeOps hodnotí Walmart obtížností 9/10. Lidé na fórech to popisují jako „v podstatě 9/10“ a ptají se, zda by „dedikované web scraping API nebylo zbytečné“. Odpověď závisí na objemu, rozpočtu a technické kapacitě.
| Faktor | DIY Python (requests + proxy) | Scraping API (Oxylabs, Bright Data atd.) | No-code nástroj (Thunderbit) |
|---|---|---|---|
| Čas od nuly k prvnímu řádku | Hodiny | 15–60 min | asi 2 min |
| Čas od nuly do produkce | 40–80 hod | 4–16 hod | asi 30 min |
| Zpracování anti-botu | Řešíte sami (těžké) | Řeší poskytovatel | Řeší se automaticky |
| Náklady v malém měřítku (<1 tis. stránek/měs.) | Nízké (proxy stojí asi 4–8 $/GB) | vstupní tier 40–49 $/měs. | Zdarma–15 $/měs. |
| Náklady ve velkém měřítku (100 tis.+ stránek/měs.) | Nižší na request | Vyšší na request | Liší se |
| Přizpůsobení | Plná kontrola | Parametry API | Omezené UI/poli |
| Průběžná údržba | 4–8 hod/měsíc | Téměř nulová | Žádná (AI se přizpůsobuje) |
| Nejlepší pro | Vývojáře stavící vlastní pipeline | Produkční scraping ve středním měřítku | Byznys uživatele, rychlé jednorázové extrakce |
Kdy dává DIY Python smysl
DIY vyhrává, když už máte vlastní proxy smlouvu, potřebujete přísnou kontrolu nad hlavičkami, cílením podle ZIP kódu nebo skupinami prodejců, indexujete miliony stránek měsíčně, takže API poplatky za záznam se nasčítají, nebo potřebujete on-prem / compliance záruky. Kompromisem je skutečný inženýrský čas: produkčně připravený Scrapy spider s pagination, retry logikou, rotací proxy, TLS impersonací a více schématy typů stránek zabere 40–80 hodin práce seniorního Python vývojáře, plus 4–8 hodin měsíčně na údržbu, jakmile Walmart začne měnit fingerprinty.
Kdy vám scraping API ušetří čas
Scraping API zvládnou anti-bot vrstvu za vás. Benchmarky ScrapeOps ukazují úspěšnost 99 % pro Zyte API a 98 % pro Scrape.do na Walmartu. Vstupní tarify se pohybují kolem 40–49 $ měsíčně u nástrojů jako ScraperAPI, Oxylabs a Scrapingdog. Pokud jste tým 2–5 inženýrů a objem scrapingu je 10 tis.–1 mil. stránek měsíčně, API je skoro vždy správná volba. Platíte za request, ale nemáte téměř žádnou údržbu.
Kdy je správná volba no-code
Thunderbit sedí na úplně jiný profil. Pokud jste PM, analytik nebo e-commerce provozní člověk, který potřebuje dnes odpoledne data o produktech Walmartu v tabulce — ne v dalším sprintu — no-code nástroj je poctivá odpověď.
Workflow: nainstalujte rozšíření Thunderbit pro Chrome, otevřete produktovou nebo search stránku Walmartu, klikněte na „AI Suggest Fields“ a AI v Thunderbitu přečte stránku a navrhne sloupce (název produktu, cena, hodnocení atd.). Kliknete na „Scrape“ a data se naplní do tabulky. Exportujte do Excelu, Google Sheets, Airtable nebo Notion — vše zdarma, bez paywallu.
Thunderbit řeší anti-bot v cloudu, takže se nemusíte zabývat CAPTCHA, proxy ani TLS fingerprintingem. AI se automaticky přizpůsobuje změnám rozvržení, takže není potřeba údržba. Pro uživatele, kteří se vůbec nechtějí zabývat navigací po JSON cestách, je to nejméně bolestivá cesta.
Upřímná omezení: Thunderbit není stavěný na 100 tis.+ stránek denně. Rozpočty na kredity a cloudové limity dělají vysoký objem méně ekonomickým než surové API. Také si nemůžete připnout konkrétní ZIP kód nebo ASN, pokud to nástroj nepodporuje. Pro průběžné, vysoce objemové pipeline je pořád lepší DIY nebo scraping API.
Hrubý odhad ceny: 1 000 řádků produktů Walmartu v Thunderbitu stojí zhruba 2 000 kreditů (asi 0,60–1,10 $ v tarifech Starter/Pro). To je srovnatelné s Walmart API od Oxylabs a levnější než většina hobby scraping API při nízkém objemu. Aktuální detaily najdete na ceníku Thunderbitu.
Scrapujte data o produktech Walmartu pomocí AI Get Started Free
Export vašich scrapovaných dat z Walmartu
Jakmile data máte, potřebujete je dostat někam, kde budou užitečná. Tři formáty pokryjí většinu potřeb:
CSV — nejuniverzálnější formát, který analytici opravdu otevírají:
import csv
def export_csv(products, filename="walmart_products.csv"):
fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
with open(filename, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
writer.writeheader()
for p in products:
writer.writerow({k: p.get(k) for k in fieldnames})
Použijte kódování utf-8-sig kvůli kompatibilitě s Excelem. BOM marker zabrání tomu, aby Excel rozbil speciální znaky.
JSONL — produkční formát pro scraping pipeline:
import json
import gzip
def export_jsonl(products, filename="walmart_products.jsonl.gz"):
with gzip.open(filename, "at", encoding="utf-8") as f:
for p in products:
f.write(json.dumps(p, ensure_ascii=False) + "\n")
JSONL je odolný proti pádu (přerušený zápis ztratí jen poslední řádek), dá se streamovat s konstantní pamětí a zachovává vnořená data jako varianty a recenze.
Excel — pro jednorázové předání analytikovi:
from openpyxl import Workbook
def export_excel(products, filename="walmart_products.xlsx"):
wb = Workbook(write_only=True)
ws = wb.create_sheet("Products")
ws.append(["Název", "Cena", "Dostupnost", "Hodnocení", "Recenze", "Prodejce"])
for p in products:
ws.append([p.get("name"), p.get("price"), p.get("availability"),
p.get("rating"), p.get("review_count"), p.get("seller")])
wb.save(filename)
Thunderbit pokrývá export i pro uživatele bez Pythonu: jedním kliknutím do Google Sheets, Airtable, Notion, Excelu, CSV a JSON — vše zdarma v základním tarifu. Pro průběžné monitorování zvládne funkce plánovaného scrapingu v Thunderbitu spouštět opakované extrakce automaticky.
Jedna poznámka ke schedulingu: nepoužívejte pro scraping Walmartu GitHub Actions. Runnery GitHub Actions běží na rozsazích IP adres Azure, které Walmartův anti-bot okamžitě blokuje. Použijte APScheduler na VPS, nebo veškerý provoz veďte přes rezidenční proxy.
Právní a etické zásady pro scraping Walmartu
Uživatelé na fórech tuhle obavu formulují napřímo: „Nevadí mi hrát si s vývojáři na kočku a myš, ale nechci si hrát s jejich právním oddělením.“
Podmínky použití Walmartu výslovně zakazují použití „jakéhokoli robotu, spideru… nebo jiného manuálního či automatického zařízení ke stahování, indexování, ‚scrapování‘, ‚data miningu‘ nebo jinému shromažďování jakýchkoli materiálů“ bez „předchozího písemného souhlasu“.
robots.txt Walmartu zakazuje /search, /account, /api/ a desítky interních endpointů. Produktové detailové stránky (/ip/...) a recenze (/reviews/product/) zakázané nejsou.
Precedent hiQ v. LinkedIn (9. okruh, 2022) stanovil, že scraping veřejně dostupných dat pravděpodobně neporušuje federální CFAA. Stejný soud ale později rozhodl, že hiQ porušil podmínky použití LinkedInu a uložil proti němu 500 000dolarový consent judgment. Novější rozhodnutí z roku 2024 (Meta v. Bright Data, X Corp. v. Bright Data) CFAA dál zúžila a přidala obranu založenou na přednosti autorského práva, ale tato rozhodnutí stála na konkrétním znění ToU, které se na Walmart neaplikuje úplně jednoduše.
Praktická doporučení: Nepřetěžujte servery. Respektujte rate limits. Nescrapujte osobní ani uživatelská data. Nakládejte s daty zodpovědně. Scraping veřejných produktových stránek Walmartu v rozumném tempu pro osobní výzkum je úplně jiný rizikový profil než scraping v komerčním měřítku proti podmínkám Walmartu. Pokud chcete postavit produkt nad daty Walmartu, promluvte si s právníkem a podívejte se na oficiální affiliate a seller API.
Upozornění: Toto je vzdělávací informace, nikoli právní poradenství.
Závěr a klíčové poznatky
Scraping Walmartu pomocí Pythonu je obtížnost 9/10 kvůli jeho dvojité anti-bot vrstvě Akamai + PerimeterX. Není to nemožné — ale potřebujete správné nástroje a vzory.
Klíčové poznatky:
- Extrakce JSONu z
__NEXT_DATA__je pragmatická volba pro většinu use-cases. Používá ji každý seriózní open-source Walmart scraper z let 2024–2026. Základní cesta jeprops.pageProps.initialData.data.productpro PDP asearchResult.itemStackspro search/browse. curl_cffisimpersonate="chrome124"je povinný. Samotnýrequestsnebohttpxneprojdou TLS fingerprintingem Akamai bez ohledu na hlavičky.- Tiché bloky jsou skutečné nebezpečí. Walmart vrací 200 OK s tělem CAPTCHA. Kontrolujte obsah odpovědi, ne jen status kód.
- Produkční scrapery potřebují víc než happy-path kód. Exponenciální backoff s jitterem, detekce blokace na čtyřech signálech, rate limiting na 3–6 sekund na request, validace dat a monitoring zdraví session jsou nezbytné.
- Zachytávání interního API přes
/orchestra/*je silné, ale křehké. Používejte ho jako úlohu v DevTools pro konkrétní datové potřeby, ne jako primární metodu extrakce. - Walmart omezuje výsledky vyhledávání na 25 stránek. Jděte do větší šířky pomocí přepínání řazení a dělení podle cenového rozsahu.
- Vyberte přístup poctivě: DIY Python pro vývojáře s vlastními potřebami a vysokým objemem. Scraping API pro týmy ve středním měřítku bez dedikovaného scraping inženýra. Thunderbit pro byznys uživatele, kteří chtějí data odpoledne v Google Sheets.
Pokud chcete vyzkoušet no-code cestu, rozšíření Thunderbit pro Chrome má zdarma dostupný tarif — můžete scrapovat několik stránek Walmartu a podívat se na výsledky sami. Pokud jdete cestou Pythonu, vzory kódu v tomto článku jsou prověřené v produkci. Ať už zvolíte cokoli, máte teď mapu obrany Walmartu i tři cesty skrz ni.
Více o technikách web scrapingu najdete v našich návodech na jak scrapovat web pomocí Pythonu, nejlepší automatizované nástroje pro web scraping a web scraping bez blokování. Můžete se také podívat na tutoriály na Thunderbit YouTube kanálu.
Časté dotazy
Je legální scrapovat produktová data Walmartu?
Podmínky použití Walmartu zakazují automatizovaný scraping bez písemného souhlasu. Rozhodnutí 9. okruhu hiQ v. LinkedIn (2022) stanovilo, že federální CFAA se na scraping veřejných stránek pravděpodobně nevztahuje, ale tentýž případ skončil proti scraperu rozsudkem o porušení smlouvy ve výši 500 000 dolarů. Scraping veřejných produktových stránek v rozumném tempu pro osobní výzkum představuje úplně jiný risk než komerční extrakce. Pokud stavíte byznys na datech Walmartu, poraďte se s právníkem.
Proč se můj Walmart scraper pořád blokuje?
Nejčastější příčiny jsou: používání čistého requests nebo httpx (které vytvářejí Python-specific TLS fingerprint, jenž Akamai okamžitě odhalí), chybějící nebo špatné hlavičky, žádná rotace proxy, rychlost požadavků vyšší než 3–6 sekund na stránku a chybějící session cookies (_px3, _abck, locDataV3). Přepněte na curl_cffi s impersonate="chrome124", použijte rezidenční proxy a implementujte detekci blokace a retry vzory popsané v tomto článku.
Jaká data můžu z Walmartu pomocí Pythonu scrapovat?
Názvy produktů, ceny (aktuální i rollback), obrázky, krátké a dlouhé popisy, hodnocení, počty recenzí, stav dostupnosti zásob, jména prodejců, informace o výrobci, varianty (velikost, barva) a umístění v kategoriích. Pomocí metody __NEXT_DATA__ jsou všechna tato data dostupná jako strukturovaný JSON. Zachytávání interního API navíc může vracet ceny na úrovni variant, počty zásob v reálném čase a stránkovaná data recenzí.
Potřebuji pro scraping Walmartu proxy?
Ano, pro jakékoli produkční nebo opakované použití. Anti-bot systémy Walmartu blokují běžné requesty konzistentně — i při perfektních hlavičkách bude nerezidenční IP adresu detekovat Akamaiův systém reputace IP. Jsou potřeba rezidenční nebo mobilní proxy. Datacentrové IP jsou spálené téměř okamžitě. Rozpočet je zhruba 3–17 $ na 1 000 stránek podle poskytovatele proxy a tarifu.
Můžu scrapovat Walmart bez psaní kódu?
Ano. Thunderbit je AI-powered rozšíření pro Chrome, které scrapuje Walmart ve dvou kliknutích: „AI Suggest Fields“ pro automatické rozpoznání sloupců s produktovými daty a potom „Scrape“ pro samotnou extrakci dat. Anti-bot výzvy řeší v cloudu a exportuje přímo do Excelu, Google Sheets, Airtable nebo Notionu — vše zdarma. Nejlépe se hodí pro analytiky, PM a byznys uživatele, kteří potřebují data rychle a bez stavby vlastní pipeline. Pro vysoce objemový nebo silně přizpůsobený scraping je pořád vhodnější Python nebo scraping API.
Vyzkoušejte Thunderbit pro AI scraping Walmartu Get Started Free
Další informace


