Bei manchen Artikeln passt Walmart den Preis mehrmals am Tag an. Wer das schon mal per Skript mitschneiden wollte, kennt den Moment: Eine Viertelstunde läuft alles rund, und dann liefert der Scraper plötzlich CAPTCHA-Seiten zurück, die als ganz normale 200-OK-Antworten getarnt sind.
Bei unserer Arbeit an der Datenerfassung bei Thunderbit habe ich mich ausgiebig durch Walmarts Bot-Abwehr gekämpft. Was dabei hängengeblieben ist, gebe ich hier weiter: die Ansätze, die 2025 wirklich tragen, die lautlosen Fehler, die deinen Datensatz unbrauchbar machen, und die nüchterne Abwägung zwischen Eigenbau-Scraper, Scraping-API und No-Code-Tool. Der Artikel behandelt drei Extraktionswege (HTML-Parsing, das __NEXT_DATA__-JSON und das Abfangen interner APIs), dazu die produktionsreife Fehlerbehandlung, die in den meisten Tutorials komplett fehlt, sowie eine ehrliche Entscheidungshilfe für den richtigen Weg. Ob du in Python entwickelst oder bis zum Mittag einfach eine Preistabelle willst – für beide Fälle ist etwas dabei.
Warum Walmart mit Python scrapen?
Walmart ist nach Umsatz der größte Einzelhändler der Welt: 680,985 Milliarden US-Dollar im Geschäftsjahr 2025, und seit 12 Jahren in Folge die Nummer 1 der Fortune Global 500. Auf der Website stehen rund 420 Millionen aktive Angebote, Walmarts CFO spricht beim Marktplatz sogar von „einer halben Milliarde SKUs“. Rund 95 % davon kommen von Drittanbietern – der Katalog ist also ständig in Bewegung: Verkäufer kommen und gehen, Varianten ändern sich, der Bestand schwankt von Tag zu Tag.

Und genau deshalb lohnt sich Scraping überhaupt. Ein Quartalsbericht bildet nie ab, was ein nächtlicher Scrape liefert. Diese Anwendungsfälle begegnen mir am häufigsten:
| Anwendungsfall | Wer ihn braucht | Was extrahiert wird |
|---|---|---|
| Wettbewerbs-Preisüberwachung | E-Commerce-Teams, Repricing-Tools | Preise, Aktionen, MAP-Compliance |
| Anreicherung des Produktkatalogs | Vertriebs- und Merchandising-Teams | Beschreibungen, Bilder, Spezifikationen, Varianten |
| Lagerbestands-Tracking | Lieferkette, Dropshipper | Bestandsstatus, Verkäuferinformationen |
| Marktforschung & Trendanalyse | Marketing, Produktmanager | Bewertungen, Rezensionen, Kategoriesortiment |
| Lead-Generierung | Vertriebsteams | Verkäufernamen, Produktanzahl, Kategorien |
Wie viel Geld in diesem Bereich steckt, zeigt eine Zahl: Allein der Markt für Wettbewerbs-Preisüberwachungssoftware lag 2025 bei 1,92 Milliarden US-Dollar und soll bis 2033 auf 5,09 Milliarden US-Dollar klettern. Befeuert wird das vom Käuferverhalten: 94 % der Kundschaft vergleichen beim Online-Shopping Preise, 83 % über mehrere Websites hinweg.
Die übliche Sprache für solche Aufgaben ist Python. Apifys Infrastructure Report 2026 schreibt Python 71,7 % des gesamten Web-Scrapings zu, und die zentrale Bibliothek (requests) wird rund 30 Millionen Mal pro Woche heruntergeladen. Wer in nennenswertem Umfang scraped, tut das mit hoher Wahrscheinlichkeit in Python.
Warum Walmart eine der schwersten Websites zum Scrapen ist
Das Knifflige an Walmart sind zwei kommerzielle Bot-Abwehrsysteme, die hintereinander geschaltet sind: Akamai Bot Manager als Edge-WAF mit TLS-Fingerprinting, dahinter PerimeterX (mittlerweile HUMAN Security) als verhaltensbasierte JavaScript-Challenge. Scrape.do nennt diese Kombination „selten und extrem schwer zu umgehen“.

ScrapeOps stuft Walmart insgesamt mit 9/10 Schwierigkeit ein, Akamai allein schon mit 9/10. Aus meiner Erfahrung passt diese Einschätzung gut.
Im Detail sieht die Gegenwehr so aus:
Akamai Bot Manager prüft deinen TLS-Fingerprint (JA3/JA4-Hash), die Reihenfolge der HTTP/2-Frames, Reihenfolge und Schreibweise der Header sowie Sitzungscookies (_abck, ak_bmsc). Ein normaler Python-requests-Aufruf erzeugt einen TLS-Fingerprint, den kein echter Browser je produziert – Akamai blockiert ihn, noch bevor deine Anfrage Walmarts Server überhaupt erreicht.
PerimeterX/HUMAN kommt nach Akamai und führt JavaScript-Fingerprinting (px.js) aus: Navigator-Eigenschaften, Canvas-Rendering, WebGL, Audio-Kontext und Verhaltensbiometrie (Mausbewegungen, Scrollgeschwindigkeit, Tastenanschläge). Sichtbar wird das Scheitern an der berüchtigten „Press & Hold“-Challenge – einem Button, den du etwa 10 Sekunden halten musst, während im Hintergrund Verhaltenssignale gemessen werden. Oxylabs sagt es ohne Umschweife: „Walmart verwendet das ‚Press & Hold‘-CAPTCHA-Modell von PerimeterX, das bekanntermaßen nahezu unmöglich per Code zu lösen ist.“
Richtig tückisch wird es beim lautlosen Blockieren. Statt eines 403 schickt Walmart HTTP 200 mit einem CAPTCHA-Body zurück. ScrapingBee bestätigt das: „Walmart gibt einen 200-OK-Statuscode zurück, selbst wenn eine CAPTCHA-Seite ausgeliefert wird. Man kann sich nicht allein auf den Statuscode verlassen, um zu wissen, ob die Anfrage erfolgreich war.“ Dein Skript parst das CAPTCHA-HTML brav als „Produkt nicht gefunden“ und läuft weiter. Die Hälfte deines Datensatzes ist Schrott – und du merkst nichts davon.
Hinzu kommt die standortabhängige Datenfrage. Walmarts Preise und Bestände hängen vom Standort ab, gesteuert über Cookies wie locDataV3 und assortmentStoreId. Ohne die richtigen Cookies bekommst du „nationale Standarddaten“, die vollständig wirken, aber nicht dem entsprechen, was echte Käufer sehen. Fehlende Cookies erzeugen keine Sperrseite, sie liefern falsche Daten ohne erkennbaren Fehler, und das ist noch übler.
Drei Methoden, um Daten von Walmart zu extrahieren (und wie sie sich vergleichen)
Bevor es Schritt für Schritt losgeht, hier die drei zentralen Extraktionsansätze. Die meisten konkurrierenden Tutorials behandeln nur einen oder zwei. Ich gehe alle drei durch, damit du den für deine Lage passenden auswählen kannst.
| Methode | Zuverlässigkeit | Vollständigkeit der Daten | Schwierigkeit für Anti-Bot | Wartungsaufwand |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ Niedrig (Selektoren brechen bei jedem Deploy) | Mittel | Hoch | Hoch |
__NEXT_DATA__-JSON | ✅ Gut | Hoch | Mittel bis hoch | Mittel |
| Abfangen interner API-Aufrufe | ✅ Am besten | Höchste (Varianten, Bestand, Bewertungen) | Mittel bis hoch | Niedrig (strukturiertes JSON) |
| Thunderbit (No-Code) | ✅ Gut | Hoch | Niedrig (von KI übernommen) | Keine |
Für Walmart ist HTML-Parsing die schwächste Variante – die Seite läuft auf Next.js und liefert gehashte CSS-Klassennamen aus, die sich bei jedem Deploy verschieben. Die __NEXT_DATA__-JSON-Methode ist der pragmatische Mittelweg, den jeder ernstzunehmende Open-Source-Walmart-Scraper von 2024 bis 2026 nutzt. Das Abfangen interner APIs ist am mächtigsten, kommt aber mit Vorbehalten, die die meisten Tutorials unterschlagen. Und Thunderbit ist die richtige Wahl, wenn du gar keine eigene Pipeline aufbauen willst.
Thunderbit für Walmart-Scraping testen
Deine Python-Umgebung für Walmart-Scraping einrichten
Das brauchst du:
- Schwierigkeit: Mittel
- Benötigte Zeit: ca. 30 Minuten für das Setup, plus Entwicklungszeit
- Was du brauchst: Python 3.10+, pip, einen Code-Editor und (für den produktiven Einsatz) einen Proxy-Dienst oder eine Scraping-API
Leg deinen Projektordner und die virtuelle Umgebung an:
mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate # Unter Windows: venv\Scripts\activate
Installiere die benötigten Bibliotheken:
pip install curl_cffi parsel beautifulsoup4 lxml
curl_cffi ist 2025 der Standard für harte Ziele. Es ist ein libcurl-Binding, das exakte Browser-TLS-Fingerprints nachbilden kann. Bright Data erklärt es so: „Walmart verwendet TLS-Fingerprinting als Teil seiner Bot-Erkennung, und selbst das Setzen des User-Agent, um einen echten Browser zu simulieren, umgeht das nicht.“ Schlichtes requests oder httpx kommt an Akamai nicht vorbei, egal welche Header du setzt. curl_cffi mit impersonate="chrome124" macht den Unterschied.
Für die produktionsreifen Muster weiter unten brauchst du außerdem json (integriert), csv (integriert), time, random und logging.
Schritt für Schritt: Walmart-Produktseiten mit Python scrapen
Schritt 1: Die Walmart-Produktseite abrufen
Zuerst geht es um eine HTTP-Anfrage, die nicht sofort geblockt wird. Hier der kanonische Header-Satz, den Scrapfly, Scrapingdog, Oxylabs und ScrapeOps 2024–2026 verwenden:
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)
Die eigentliche Arbeit leistet hier impersonate="chrome124". Der Parameter weist curl_cffi an, Chromes exakten TLS-ClientHello aus Version 124, die HTTP/2-Frame-Reihenfolge und die Pseudo-Header-Sequenz nachzubauen. Ohne ihn sieht Akamai einen Python-typischen JA3-Hash und blockiert dich, bevor deine Anfrage Walmarts Anwendungsschicht erreicht.
So sieht eine geblockte Antwort aus: Steht "Robot or human?" im HTML-Titel oder leitet die Antwort auf walmart.com/blocked um, hat man dich erwischt. Der Haken: Walmart liefert den CAPTCHA-Body oft mit Statuscode 200, response.ok zu prüfen reicht also nicht.
Für jeden produktiven oder wiederholten Einsatz führt kein Weg an Residential Proxies vorbei. Rechenzentrums-IPs verbrennt Akamais IP-Reputationssystem sofort. Die komplette Fehlerbehandlung und Proxy-Strategie folgt unten im Produktionsabschnitt.
Schritt 2: Produktdaten aus der __NEXT_DATA__-JSON parsen
Walmart.com ist eine Next.js-Anwendung, und das serverseitig gerenderte HTML packt die komplette Hydration-Payload in ein einziges Script-Tag: <script id="__NEXT_DATA__" type="application/json">. Das ist die Goldgrube.
Der Scrapfly-Leitfaden von 2026 bestätigt das: „Im Jahr 2026 verwendet Walmart Next.js mit strukturiertem JSON in __NEXT_DATA__-Script-Tags, wodurch die Extraktion versteckter Daten zuverlässiger ist als das klassische CSS-Selector-Parsing.“ Jeder bekannte Open-Source-Walmart-Scraper setzt darauf – Scrapfly, Oxylabs, python-scrapy-playbook.
So holst du die Daten raus:
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", {})
An dieser Stelle ist bei den meisten Tutorials Schluss. Darunter findest du eine vollständige JSON-Pfadkarte für die Felder, auf die es wirklich ankommt – verifiziert an live laufenden Walmart-Seiten von 2024–2026:
| Datenfeld | JSON-Pfad (unter initialData) | Typ | Hinweise |
|---|---|---|---|
| Produktname | data > product > name | String | — |
| Marke | data > product > brand | String | — |
| Aktueller Preis (Zahl) | data > product > priceInfo > currentPrice > price | Float | Kann je nach Store-Cookie abweichen |
| Aktueller Preis (String) | data > product > priceInfo > currentPrice > priceString | String | Formatiert, z. B. "$9.99" |
| Kurzbeschreibung | data > product > shortDescription | HTML-String | Mit BeautifulSoup in Text umwandeln |
| Lange Beschreibung | data > idml > longDescription | HTML-String | Liegt auf idml, NICHT in product — genau hier irren ältere Tutorials |
| Alle Bilder | data > product > imageInfo > allImages | Array | Liste von {id, url}-Objekten |
| Durchschnittliche Bewertung | data > product > averageRating | Float | Der Schlüssel heißt averageRating, nicht das ältere rating |
| Anzahl der Bewertungen | data > product > numberOfReviews | Integer | — |
| Varianten | data > product > variantCriteria | Array | Optionsgruppen (Größe, Farbe) |
| Verfügbarkeit | data > product > availabilityStatus | String | IN_STOCK, OUT_OF_STOCK, LIMITED_STOCK |
| Verkäufer | data > product > sellerDisplayName | String | — |
| Hersteller | data > product > manufacturerName | String | — |
Die eine Falle, in die viele tappen, ist longDescription. Ein ScrapeHero-Beitrag von 2023 verortete den Pfad noch unter product.longDescription, doch Quellen ab 2024 legen ihn durchgängig auf den Schwester-Schlüssel idml. Lies also zuerst idml.longDescription und falle bei älteren Seiten auf product.longDescription zurück.
Hier das sichere Extraktionsmuster mit .get()-Ketten:
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"),
}
Wer sich gar nicht erst mit der JSON-Pfadnavigation aufhalten möchte: Thunderbits KI erkennt und strukturiert diese Felder automatisch, ganz ohne manuelles Mapping. Du klickst auf „KI-Felder vorschlagen“, die Seite wird ausgelesen, und du bekommst eine Tabelle. Baust du dagegen eine eigene Pipeline, ist die obige Karte deine Referenz.
Schritt 3: Walmarts interne API-Endpunkte für reichhaltigere Daten abfangen
Diese Methode behandelt kein Konkurrenzartikel sauber. Sie ist der mächtigste Extraktionsweg – und zugleich der komplizierteste.
Walmarts Frontend ruft ein föderiertes GraphQL-Backend auf Basis von Apollo Gateway auf. Die Endpunkte liegen unter www.walmart.com/orchestra/*:
/orchestra/pdp/graphql/...— Produktdetail-Hydration + Variantenwechsel/orchestra/snb/graphql/...— Such- und Browse-Paginierung/orchestra/reviews/graphql/...— paginierte Bewertungen
Diese Endpunkte liefern sauberes, strukturiertes JSON mit Daten, die __NEXT_DATA__ manchmal abschneidet: Variantenpreise, Echtzeit-Bestände, vollständige Review-Paginierung.
Der Haken, um den sich Blogposts gern drücken: Walmart setzt auf persistierte Apollo-Queries. Im Request-Body steht nur ein SHA-256-Hash (persistedQuery.sha256Hash), nicht der Query-Text. Kennt der Server den Hash nicht, bekommst du PersistedQueryNotFound. Und diese Hashes rotiert Walmart bei jedem Deployment. Deshalb veröffentlicht auch keiner der bekannten Open-Source-Walmart-Scraper direkt kopierbaren /orchestra/-Code.
Die praktische, ehrliche Variante dieser Methode ist eine DevTools-Übung:
- Öffne eine Walmart-Produktseite in Chrome
- Öffne DevTools → Reiter „Network“, filtere nach „Fetch/XHR“
- Nutze die Seite ganz normal — klicke auf Varianten, scrolle zu den Bewertungen, ändere den Store-Standort
- Achte auf Anfragen an
/orchestra/*-Endpunkte, die JSON mit Produktdaten zurückgeben - Rechtsklick auf die Anfrage → „Copy as cURL“
- Wandle den cURL-Befehl mit
curl_cffiin Python um
So sieht ein nachgespielter API-Aufruf aus:
import json
from curl_cffi import requests
session = requests.Session(impersonate="chrome124")
# Zuerst die Sitzung durch einen Besuch der Produktseite aufwärmen
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
# Dann den internen API-Aufruf wiedergeben (aus DevTools kopiert)
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": "your-copied-correlation-id",
}
payload = {
# Den exakten Request-Body aus DevTools einfügen
"variables": {"productId": "1234567"},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "the-hash-you-copied"
}
}
}
api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()
Das Aufwärmen der Sitzung ist dabei nicht optional. Walmarts PerimeterX-Cookies (_px3, _pxhd, ACID) müssen über den ersten HTML-Abruf gesetzt werden, bevor der API-Aufruf greift. Fehlen sie, bekommst du ein 412 oder 403.
Wann diese Methode sinnvoll ist: Wenn du Daten brauchst, die in __NEXT_DATA__ nicht stecken – tiefe Variantenpreise, paginierte Bewertungen über den ersten Batch hinaus oder Echtzeit-Bestandszahlen. Für die meisten Anwendungsfälle reicht __NEXT_DATA__ und ist deutlich einfacher.
Walmart-Suchergebnisse und mehrere Seiten scrapen
Suchergebnisse folgen einem ähnlichen __NEXT_DATA__-Muster, allerdings mit einem anderen JSON-Pfad:
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"]
# Gesponserte Produkte herausfiltern
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"))
Die Paginierung läuft über den page-Parameter: &page=1, &page=2 und so weiter. Es gibt allerdings eine undokumentierte Grenze: Walmart deckelt Suchergebnisse bei 25 Seiten, egal wie viele es eigentlich gäbe. Scrapfly bestätigt das: „Walmart setzt die maximale Anzahl zugänglicher Ergebnis-Seiten auf 25 fest, unabhängig von der Gesamtzahl verfügbarer Seiten.“
Um tiefer zu kommen, helfen diese Kniffe:
- Sortierreihenfolge wechseln: Führe dieselbe Suche einmal mit
&sort=price_lowund dann mit&sort=price_highaus – so kommst du auf etwa 50 Seiten Abdeckung - Preisbereich aufteilen: Mit
&min_price=X&max_price=Yzerlegst du den Katalog in kleinere Fenster - Kategorien aufteilen: Suche innerhalb konkreter Kategorien statt über die ganze Website
Beachte: itemStacks ist ein Array. Scrapfly verdrahtet in seinem Repo fest [0], doch Kategorie- und Browse-Seiten enthalten manchmal mehrere Stacks („Top Picks“, „Weitere Ergebnisse“). Robust ist es, über alle Stacks zu iterieren:
for stack in search_result.get("itemStacks", []):
for item in stack.get("items", []):
if item.get("__typename") == "Product":
# Artikel verarbeiten
pass
Noch ein wichtiger Punkt: Walmarts robots.txt verbietet /search. Produktdetailseiten (/ip/...) und die meisten Kategorieseiten (/cp/...) sind dagegen erlaubt. Wem Compliance wichtig ist, der startet besser bei Produktseiten und Kategoriestrukturen statt bei der Suche.
Lass lautlose Blocks nicht deine Daten ruinieren: produktionsreife Fehlerbehandlung
Genau hier scheitern die meisten Tutorials. Sie zeigen dir, wie du eine Seite abrufst, ein Produkt parst, und das war's. In der Produktion rufst du Tausende Seiten ab, und Walmart arbeitet aktiv dagegen. Was einen Demo-Scraper von einem ernsthaften unterscheidet, ist der Umgang mit Fehlern.
Lautlose Blocks erkennen, bevor sie deine Daten verfälschen
Die wichtigste Funktion in einem Walmart-Scraper ist der Block-Detektor. Im Konsens der Anbieter ScrapingBee, Scrapingdog, Oxylabs und Decodo brauchst du vier voneinander unabhängige Prüfungen:
BLOCK_MARKERS = (
"Robot or human",
"Press & Hold",
"Press & Hold",
"px-captcha",
"perimeterx",
)
def is_walmart_blocked(response) -> bool:
# 1. Weiterleitung zum dedizierten Block-Endpunkt
if "/blocked" in str(response.url):
return True
# 2. Harte Statuscodes
if response.status_code in (403, 412, 428, 429, 503):
return True
# 3. 200 OK mit CAPTCHA-Body (der stille-Block-Fall)
body = response.text or ""
if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
return True
# 4. Plausibilitätscheck der Antwortlänge — echte PDPs sind 300–900 KB groß
if len(response.content) < 50_000 and "/ip/" in str(response.url):
return True
return False
Die vierte Prüfung – die Antwortlänge – fängt die Fälle ab, in denen Walmart eine abgespeckte Seite ausliefert: weder offensichtliche CAPTCHA-Marker noch die Produktdaten, die du brauchst.
Wiederholungslogik mit exponentiellem Backoff und Jitter
Nach einem Fehlschlag solltest du Walmart nicht sofort wieder bombardieren. Das Standardmuster nutzt exponentiellen Backoff mit Jitter, um die Wiederholungen zu entzerren:
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("Stiller Block erkannt")
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"Versuch {attempt + 1} fehlgeschlagen: {e}. Erneuter Versuch in {wait:.1f} s")
time.sleep(wait)
return None
Der Jitter (random.uniform(0, 3)) ist mehr als Kosmetik – er entkoppelt die Worker, damit ein Scraper-Verbund nicht im selben Sekundenfenster erneut feuert und Akamais Geschwindigkeitsdetektoren auslöst.
Rate-Limiting
Sowohl Thunderbit als auch Scrape.do raten für Walmart zu einer zufälligen Verzögerung von 3–6 Sekunden pro Anfrage: „Drossele deine Anfragen, indem du zwischen Seitenaufrufen 3–6 Sekunden wartest und die Verzögerungen randomisierst.“
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
Bei größerem Umfang lohnt sich für asynchrone Rate-Limits ein Blick auf aiolimiter:
from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60) # 10 Anfragen pro Minute
Datenvalidierung
Auch eine nicht blockierte Antwort kann falsch geparste Daten enthalten (falscher Store, degradierte Payload). Validiere also, bevor du in die Ausgabe schreibst:
def validate_product(product):
"""Gibt True zurück, wenn die Produktdaten plausibel aussehen."""
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
Sitzungs-Logging
Behalte deine Erfolgsquote pro Sitzung im Blick. Fällt sie über 10 Minuten unter 80 %, hat sich etwas verändert: entweder ist deine IP verbrannt, deine Cookies sind abgelaufen, oder Walmart hat eine neue Anti-Bot-Regel ausgerollt.
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"Erfolgsquote ist auf {self.success_rate:.1f}% gefallen — Proxies rotieren oder pausieren")
Nichts davon ist spektakulär. Aber genau das hält deine Daten sauber.
DIY-Python vs. Scraping-API vs. No-Code: der richtige Weg für Walmart
Viele Entwickler legen direkt mit dem Eigenbau los, ohne zu fragen, ob das überhaupt die richtige Entscheidung ist. ScrapeOps bewertet Walmart mit 9/10 Schwierigkeit. In Foren beschreiben Nutzer es als „im Grunde 9/10“ und fragen sich, „ob eine dedizierte Web-Scraping-API nicht übertrieben wäre“. Die Antwort hängt von Volumen, Budget und Engineering-Kapazität ab.
| Faktor | DIY-Python (requests + Proxies) | Scraping-API (Oxylabs, Bright Data usw.) | No-Code-Tool (Thunderbit) |
|---|---|---|---|
| Setup-Zeit bis zur ersten Zeile | Stunden | 15–60 Min. | ~2 Min. |
| Setup-Zeit bis zur Produktion | 40–80 Std. | 4–16 Std. | ~30 Min. |
| Anti-Bot-Behandlung | Du verwaltest sie selbst (schwierig) | Vom Anbieter übernommen | Automatisch übernommen |
| Kosten bei kleinem Umfang (<1K Seiten/Monat) | Niedrig (Proxy-Kosten ca. 4–8 $/GB) | Einstiegstarife 40–49 $/Monat | Kostenlos–15 $/Monat |
| Kosten bei großem Umfang (100K+ Seiten/Monat) | Niedrigere Kosten pro Anfrage | Höhere Kosten pro Anfrage | Variiert |
| Anpassbarkeit | Volle Kontrolle | API-Parameter | Durch UI/Felder begrenzt |
| Laufende Wartung | 4–8 Std./Monat | Nahezu null | Keine (KI passt sich an) |
| Am besten geeignet für | Entwickler mit eigenen Pipelines | Mittelgroßes produktives Scraping | Business-Anwender, schnelle Einmal-Extraktionen |
Wann DIY-Python Sinn ergibt
DIY gewinnt, wenn du schon einen Proxy-Vertrag hast, strikte Kontrolle über Header, Postleitzahl-Ziele oder Verkäufergruppen brauchst, monatlich Millionen Seiten indexierst, bei denen sich API-Gebühren pro Datensatz aufsummieren, oder wenn du On-Premise- bzw. Compliance-Garantien benötigst. Der Preis dafür ist echter Engineering-Aufwand: Ein produktionsreifer Scrapy-Spider mit Paginierung, Retries, Proxy-Rotation, TLS-Impersonation und Schemata für mehrere Seitentypen verschlingt 40–80 Stunden Senior-Python-Arbeit, dazu 4–8 Stunden Wartung pro Monat, sobald Walmart Fingerprints ändert.
Wann eine Scraping-API dir Zeit spart
Scraping-APIs nehmen dir die Anti-Bot-Schicht ab. ScrapeOps-Benchmarks zeigen bei Walmart Erfolgsraten von 99 % für die Zyte API und 98 % für Scrape.do. Die Einstiegspreise liegen bei 40–49 $/Monat für Tools wie ScraperAPI, Oxylabs und Scrapingdog. Seid ihr ein Team aus 2–5 Entwicklern mit einem Scraping-Volumen zwischen 10K und 1M Seiten pro Monat, ist eine API fast immer die richtige Wahl. Du tauschst Kosten pro Anfrage gegen null Wartungsaufwand.
Wann No-Code die richtige Wahl ist
Thunderbit passt zu einem ganz anderen Profil. Bist du PM, Analyst oder im E-Commerce tätig und brauchst heute Nachmittag Walmart-Produktdaten in einer Tabelle – nicht erst im nächsten Sprint – dann ist ein No-Code-Tool die ehrliche Antwort.
Der Ablauf: Installiere die Thunderbit Chrome-Erweiterung, öffne eine Walmart-Produkt- oder Suchseite und klicke auf „KI-Felder vorschlagen“. Thunderbits KI liest die Seite aus und schlägt Spalten vor (Produktname, Preis, Bewertung usw.). Ein Klick auf „Scrapen“, und die Daten landen in einer Tabelle. Export nach Excel, Google Sheets, Airtable oder Notion – alles kostenlos, ohne Paywall.
Die Anti-Bot-Behandlung erledigt Thunderbit in der Cloud, du musst dich also nicht mit CAPTCHAs, Proxies oder TLS-Fingerprinting herumärgern. Die KI passt sich Layout-Änderungen selbst an, Wartung entfällt damit. Für alle, die mit JSON-Pfadnavigation nichts zu tun haben wollen, ist das der Weg mit dem geringsten Widerstand.
Ehrliche Grenzen: Thunderbit ist nicht für 100K+ Seiten pro Tag gemacht. Kreditbudgets und Cloud-Limits machen High-Volume-Ingest gegenüber rohen APIs unwirtschaftlich. Außerdem lässt sich eine bestimmte Postleitzahl oder ASN nicht ohne Weiteres fest verdrahten, sofern das Tool das nicht vorsieht. Für laufende Pipelines mit hohem Volumen bleiben DIY oder eine Scraping-API die bessere Wahl.
Grobe Preisabschätzung: 1.000 Walmart-Produktzeilen kosten mit Thunderbit etwa 2.000 Credits (rund 0,60–1,10 $ im Starter-/Pro-Tarif). Das liegt auf dem Niveau der Walmart-API von Oxylabs und ist bei geringem Volumen günstiger als die meisten Hobby-Scraping-APIs. Die aktuellen Preise findest du bei Thunderbit.
Walmart-Produktdaten mit KI scrapen Get Started Free
Deine gescrapten Walmart-Daten exportieren
Wenn die Daten erstmal da sind, brauchen sie einen sinnvollen Platz. Drei Formate decken die meisten Anforderungen ab:
CSV — der kleinste gemeinsame Nenner, den Analysten tatsächlich öffnen:
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})
Verwende utf-8-sig, damit Excel die Datei korrekt öffnet. Das BOM-Markierungselement verhindert, dass Excel Sonderzeichen verhunzt.
JSONL — das Produktionsformat für Scraping-Pipelines:
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 ist absturzsicher (ein abgebrochener Schreibvorgang kostet nur die letzte Zeile), streambar bei konstantem Speicherverbrauch und bewahrt verschachtelte Daten wie Varianten und Bewertungen intakt.
Excel — für einmalige Übergaben an Analysten:
from openpyxl import Workbook
def export_excel(products, filename="walmart_products.xlsx"):
wb = Workbook(write_only=True)
ws = wb.create_sheet("Produkte")
ws.append(["Name", "Preis", "Verfügbarkeit", "Bewertung", "Rezensionen", "Verkäufer"])
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)
Den Export-Teil deckt Thunderbit für Nicht-Python-Nutzer ab: Ein-Klick-Export nach Google Sheets, Airtable, Notion, Excel, CSV und JSON, im Basistarif komplett kostenlos. Für laufende Überwachung übernimmt Thunderbits geplante Scraper-Funktion wiederkehrende Extraktionen automatisch.
Ein Wort zum Scheduling: Nutze GitHub Actions nicht für Walmart-Scraping. GitHub-Actions-Runner sitzen in Azure-IP-Bereichen, die Walmarts Anti-Bot sofort blockiert. Setze stattdessen APScheduler auf einem VPS ein oder leite den gesamten Traffic über Residential Proxies.
Rechtliche und ethische Leitlinien für Walmart-Scraping
In Foren bringen es Nutzer auf den Punkt: „Ich habe nichts dagegen, Katz und Maus mit den Entwicklern zu spielen, aber ich möchte ungern mit ihrem Legal-Team spielen.“
Walmarts Nutzungsbedingungen untersagen ausdrücklich den Einsatz von „Robotern, Spidern … oder anderen manuellen oder automatisierten Mitteln, um Materialien abzurufen, zu indizieren, zu ‚scrapen‘, zu ‚data minen‘ oder anderweitig zu sammeln“, ohne „vorherige ausdrückliche schriftliche Zustimmung“.
Walmarts robots.txt verbietet /search, /account, /api/ und Dutzende interne Endpunkte. Produktdetailseiten (/ip/...) und Bewertungen (/reviews/product/) sind nicht gesperrt.
Der Präzedenzfall hiQ v. LinkedIn (9. Bezirk, 2022) hielt fest, dass das Scrapen öffentlich zugänglicher Daten den bundesrechtlichen CFAA vermutlich nicht verletzt. Im selben Verfahren entschied das Gericht allerdings später, dass hiQ gegen LinkedIns Nutzungsbedingungen verstoßen hatte, und verhängte ein Vergleichsurteil über 500.000 US-Dollar gegen das Unternehmen. Neuere Entscheidungen von 2024 (Meta v. Bright Data, X Corp. v. Bright Data) haben den CFAA weiter eingegrenzt und Verteidigungslinien über die Copyright-Preemption eröffnet, doch diese Urteile hingen an spezifischer ToU-Sprache, die sich nicht sauber auf Walmart übertragen lässt.
Praktische Leitlinien: Server nicht überlasten. Rate Limits respektieren. Keine personenbezogenen oder Nutzerdaten scrapen. Daten verantwortungsvoll verwenden. Öffentliche Walmart-Produktseiten in moderatem Umfang für die eigene Recherche zu scrapen ist ein ganz anderes Risikoprofil als kommerzielles Scraping entgegen Walmarts Bedingungen. Wenn du ein Produkt auf Basis von Walmart-Daten baust, sprich mit einer Anwältin oder einem Anwalt und prüfe Walmarts offizielle Affiliate- und Seller-APIs.
Hinweis: Das hier sind Bildungsinformationen, keine Rechtsberatung.
Fazit und wichtigste Erkenntnisse
Walmart mit Python zu scrapen ist dank des doppelten Anti-Bot-Stacks aus Akamai und PerimeterX eine 9/10-Schwierigkeit. Nicht unmöglich – aber du brauchst die richtigen Werkzeuge und Muster.
Die wichtigsten Erkenntnisse:
- Die Extraktion aus
__NEXT_DATA__-JSON ist für die meisten Anwendungsfälle die pragmatische Wahl. Jeder ernsthafte Open-Source-Walmart-Scraper von 2024–2026 setzt darauf. Der Basispfad istprops.pageProps.initialData.data.productfür PDPs undsearchResult.itemStacksfür Suche/Browse. curl_cffimitimpersonate="chrome124"ist Pflicht. Schlichtesrequestsoderhttpxkommt an Akamais TLS-Fingerprinting nicht vorbei, egal welche Header du setzt.- Lautlose Blocks sind die eigentliche Gefahr. Walmart liefert 200 OK mit CAPTCHA-Body. Prüfe den Response-Content, nicht nur den Statuscode.
- Produktions-Scraper brauchen mehr als Happy-Path-Code. Exponentieller Backoff mit Jitter, Block-Erkennung über vier Signale, Rate-Limits von 3–6 Sekunden pro Anfrage, Datenvalidierung und Session-Health-Monitoring sind allesamt essenziell.
- Das Abfangen interner APIs über
/orchestra/*ist stark, aber fragil. Nutze es als DevTools-Übung für konkrete Datenbedürfnisse, nicht als primäre Extraktionsmethode. - Walmart deckelt Suchergebnisse bei 25 Seiten. Mit Sortierreihenfolge-Wechsel und Preisbereich-Slicing kommst du breiter voran.
- Wähle deinen Ansatz ehrlich: DIY-Python für Entwickler mit Sonderanforderungen und hohem Volumen. Scraping-APIs für mittelgroße Teams ohne eigenen Scraping-Engineer. Thunderbit für Business-Anwender, die heute Nachmittag Daten in Google Sheets brauchen.
Willst du den No-Code-Weg ausprobieren, hat die Thunderbit Chrome-Erweiterung einen kostenlosen Tarif – damit kannst du ein paar Walmart-Seiten scrapen und dir die Ergebnisse selbst ansehen. Gehst du den Python-Weg, sind die Code-Muster in diesem Artikel produktionsgetestet. So oder so hast du jetzt eine Landkarte von Walmarts Abwehr und drei Wege hindurch.
Mehr zu Web-Scraping-Techniken findest du in unseren Anleitungen zu Web Scraping mit Python, den besten automatisierten Web-Scraping-Tools und Web Scraping ohne Blockierung. Außerdem gibt es Tutorials auf dem Thunderbit YouTube-Kanal.
FAQs
Ist es legal, Walmart-Produktdaten zu scrapen?
Walmarts Nutzungsbedingungen untersagen automatisiertes Scraping ohne schriftliche Zustimmung. Das Urteil des 9. Bezirks in hiQ v. LinkedIn (2022) hielt fest, dass der bundesrechtliche CFAA auf das Scrapen öffentlicher Seiten wahrscheinlich nicht anwendbar ist, doch derselbe Fall endete mit einem Vertragsverletzungsurteil über 500.000 US-Dollar gegen den Scraper. Öffentliche Produktseiten in moderatem Umfang für die eigene Recherche zu scrapen hat ein ganz anderes Risikoprofil als kommerzielle Extraktion im großen Stil. Sprich mit einer Anwältin oder einem Anwalt, wenn du auf Walmart-Daten ein Geschäft aufbauen willst.
Warum wird mein Walmart-Scraper ständig blockiert?
Die häufigsten Ursachen: der Einsatz von schlichtem requests oder httpx (die einen Python-typischen TLS-Fingerprint senden, den Akamai sofort erkennt), fehlende oder falsche Header, keine Proxy-Rotation, zu schnelle Anfragen mit weniger als 3–6 Sekunden Abstand und fehlende Sitzungscookies (_px3, _abck, locDataV3). Wechsle zu curl_cffi mit impersonate="chrome124", nutze Residential Proxies und setze die in diesem Artikel beschriebenen Block-Erkennungs- und Retry-Muster ein.
Welche Daten kann ich mit Python von Walmart scrapen?
Produktnamen, Preise (aktuell und reduziert), Bilder, kurze und lange Beschreibungen, Bewertungen, Anzahl der Rezensionen, Verfügbarkeitsstatus, Verkäufernamen, Herstellerinformationen, Variantenoptionen (Größe, Farbe) und die Kategorisierung. Mit der __NEXT_DATA__-Methode liegen all diese Daten als strukturiertes JSON vor. Das Abfangen interner APIs liefert zusätzlich Variantenpreise, Echtzeit-Bestände und paginierte Bewertungsdaten.
Brauche ich Proxies, um Walmart zu scrapen?
Ja, für jeden produktiven oder wiederholten Einsatz. Walmarts Anti-Bot-Systeme blockieren einfache Requests konsequent – selbst bei perfekten Headern markiert Akamais IP-Reputationssystem eine Nicht-Residential-IP. Residential- oder Mobile-Proxies sind Pflicht. Rechenzentrums-IPs sind fast sofort verbrannt. Rechne grob mit 3–17 US-Dollar pro 1.000 Seiten, je nach Proxy-Anbieter und Tarif.
Kann ich Walmart scrapen, ohne Code zu schreiben?
Ja. Thunderbit ist eine KI-gestützte Chrome-Erweiterung, die Walmart in zwei Klicks scrapt: erst „KI-Felder vorschlagen“, um die Produktdatenspalten automatisch zu erkennen, dann „Scrapen“, um die Daten zu ziehen. Die Anti-Bot-Herausforderungen übernimmt sie in der Cloud und exportiert direkt nach Excel, Google Sheets, Airtable oder Notion – alles kostenlos. Am besten passt das zu Analysten, PMs und Business-Anwendern, die schnell Daten brauchen, ohne eine eigene Pipeline aufzubauen. Für starkes oder stark angepasstes Scraping bleiben Python oder eine Scraping-API die bessere Wahl.
Thunderbit für KI-gestütztes Walmart-Scraping testen Get Started Free
Mehr erfahren
- Walmart-Scraping mit Python in 2025: Ein praktischer Leitfaden
- Wie man Web Scraping ohne Blockierung in Python durchführt
- Python Web Scraping: Blocks mit kluger Proxy-Nutzung vermeiden
- Wie man einen Web Scraper mit Python schreibt: von Anfang bis Ende
- Wie man Daten mit Python scrapt: ein Tutorial für Einsteiger


