Wie man Walmart 2026 mit Python scraped (und nicht blockiert wird)

Zuletzt aktualisiert am July 13, 2026
Wie man Walmart 2026 mit Python scraped (und nicht blockiert wird)

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.

walmart_stats_670d06c6bd.png

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:

AnwendungsfallWer ihn brauchtWas extrahiert wird
Wettbewerbs-PreisüberwachungE-Commerce-Teams, Repricing-ToolsPreise, Aktionen, MAP-Compliance
Anreicherung des ProduktkatalogsVertriebs- und Merchandising-TeamsBeschreibungen, Bilder, Spezifikationen, Varianten
Lagerbestands-TrackingLieferkette, DropshipperBestandsstatus, Verkäuferinformationen
Marktforschung & TrendanalyseMarketing, ProduktmanagerBewertungen, Rezensionen, Kategoriesortiment
Lead-GenerierungVertriebsteamsVerkä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“.

walmart_antibot_3d67d0119c.png

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.

MethodeZuverlässigkeitVollständigkeit der DatenSchwierigkeit für Anti-BotWartungsaufwand
HTML + BeautifulSoup⚠️ Niedrig (Selektoren brechen bei jedem Deploy)MittelHochHoch
__NEXT_DATA__-JSON✅ GutHochMittel bis hochMittel
Abfangen interner API-Aufrufe✅ Am bestenHöchste (Varianten, Bestand, Bewertungen)Mittel bis hochNiedrig (strukturiertes JSON)
Thunderbit (No-Code)✅ GutHochNiedrig (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:

DatenfeldJSON-Pfad (unter initialData)TypHinweise
Produktnamedata > product > nameString
Markedata > product > brandString
Aktueller Preis (Zahl)data > product > priceInfo > currentPrice > priceFloatKann je nach Store-Cookie abweichen
Aktueller Preis (String)data > product > priceInfo > currentPrice > priceStringStringFormatiert, z. B. "$9.99"
Kurzbeschreibungdata > product > shortDescriptionHTML-StringMit BeautifulSoup in Text umwandeln
Lange Beschreibungdata > idml > longDescriptionHTML-StringLiegt auf idml, NICHT in product — genau hier irren ältere Tutorials
Alle Bilderdata > product > imageInfo > allImagesArrayListe von {id, url}-Objekten
Durchschnittliche Bewertungdata > product > averageRatingFloatDer Schlüssel heißt averageRating, nicht das ältere rating
Anzahl der Bewertungendata > product > numberOfReviewsInteger
Variantendata > product > variantCriteriaArrayOptionsgruppen (Größe, Farbe)
Verfügbarkeitdata > product > availabilityStatusStringIN_STOCK, OUT_OF_STOCK, LIMITED_STOCK
Verkäuferdata > product > sellerDisplayNameString
Herstellerdata > product > manufacturerNameString

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:

  1. Öffne eine Walmart-Produktseite in Chrome
  2. Öffne DevTools → Reiter „Network“, filtere nach „Fetch/XHR“
  3. Nutze die Seite ganz normal — klicke auf Varianten, scrolle zu den Bewertungen, ändere den Store-Standort
  4. Achte auf Anfragen an /orchestra/*-Endpunkte, die JSON mit Produktdaten zurückgeben
  5. Rechtsklick auf die Anfrage → „Copy as cURL“
  6. Wandle den cURL-Befehl mit curl_cffi in 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_low und dann mit &sort=price_high aus – so kommst du auf etwa 50 Seiten Abdeckung
  • Preisbereich aufteilen: Mit &min_price=X&max_price=Y zerlegst 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 &amp; 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.

FaktorDIY-Python (requests + Proxies)Scraping-API (Oxylabs, Bright Data usw.)No-Code-Tool (Thunderbit)
Setup-Zeit bis zur ersten ZeileStunden15–60 Min.~2 Min.
Setup-Zeit bis zur Produktion40–80 Std.4–16 Std.~30 Min.
Anti-Bot-BehandlungDu verwaltest sie selbst (schwierig)Vom Anbieter übernommenAutomatisch übernommen
Kosten bei kleinem Umfang (<1K Seiten/Monat)Niedrig (Proxy-Kosten ca. 4–8 $/GB)Einstiegstarife 40–49 $/MonatKostenlos–15 $/Monat
Kosten bei großem Umfang (100K+ Seiten/Monat)Niedrigere Kosten pro AnfrageHöhere Kosten pro AnfrageVariiert
AnpassbarkeitVolle KontrolleAPI-ParameterDurch UI/Felder begrenzt
Laufende Wartung4–8 Std./MonatNahezu nullKeine (KI passt sich an)
Am besten geeignet fürEntwickler mit eigenen PipelinesMittelgroßes produktives ScrapingBusiness-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 ist props.pageProps.initialData.data.product für PDPs und searchResult.itemStacks für Suche/Browse.
  • curl_cffi mit impersonate="chrome124" ist Pflicht. Schlichtes requests oder httpx kommt 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

Shuai Guan
Shuai Guan
CEO bei Thunderbit | Experte für KI-gestützte Datenautomatisierung Shuai Guan ist CEO von Thunderbit und Absolvent der University of Michigan im Bereich Engineering. Mit fast zehn Jahren Erfahrung in Tech und SaaS-Architektur hat er sich darauf spezialisiert, komplexe KI-Modelle in praxisnahe No-Code-Tools zur Datenextraktion zu verwandeln. In diesem Blog teilt er ungefilterte, in der Praxis bewährte Einblicke in Web-Scraping- und Automatisierungsstrategien, damit Sie intelligentere, datengetriebene Workflows aufbauen können. Wenn er gerade keine Datenprozesse optimiert, widmet er dieselbe Liebe zum Detail seiner Leidenschaft für die Fotografie.
Inhaltsverzeichnis

Eine Webseite einfach per Anfrage scrapen

Sag einfach in normalem Deutsch, was du brauchst. Oder noch besser: sag gar nichts.

Thunderbit ausprobieren kostenlos
Daten mit KI extrahieren
Daten einfach zu Google Sheets, Airtable oder Notion übertragen
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week