Walmarts Katalog ist eine der reichhaltigsten öffentlichen Quellen für Einzelhandelsdaten im Web: Jede Suchanfrage gibt ein Raster von Produktlistings mit Namen, Preisen, Sternbewertungen, Rezensionsanzahlen und Links zur jeweiligen Produktseite zurück. Diese Daten treiben Wettbewerber-Preisverfolgung, Marktforschung, Sortimentsanalyse und Trendüberwachung an. Das Problem ist, dass Walmart diese Listings im Browser rendert und sich stark gegen automatisierten Traffic wehrt, sodass eine einfache HTTP-Anfrage Ihnen eine JavaScript-Hülle statt der gesuchten Produkte liefert.
Dieser Leitfaden zeigt Ihnen, wie Sie Walmart-Suchergebnisse mit Python auf zuverlässige Weise scrapen. Sie bauen einen kleinen, lauffähigen Scraper, der eine gerenderte Suchseite über die Crawling API abruft, das Ergebnisraster mit BeautifulSoup analysiert und einen sauberen Datensatz für jedes Listing zieht: Produktname, Preis, Bewertung, Rezensionsanzahl und Produktlink. Wir beschränken die Anleitung auf öffentliche Such- und Listingdaten, und der Abschnitt zur Rechtslage am Ende ist kein Standardtext, also lesen Sie ihn, bevor Sie dies auf echtes Volumen anwenden.
Was Sie bauen werden
Ein Python-Skript, das eine Walmart-Suchanfrage entgegennimmt, die gerenderte Ergebnisseite über die Crawling API abruft und einen strukturierten Datensatz pro Produkt extrahiert. Wir verwenden eine iPhone-Suche als laufendes Beispiel und ziehen diese Felder aus jeder Ergebniskarte:
- Name der Produkttitel, zum Beispiel "Apple iPhone 15, 128GB, Black".
- Preis der auf der Karte angezeigte Listenpreis.
- Bewertung die durchschnittliche Sternebewertung, wenn das Produkt eine hat.
- Rezensionen die Anzahl der Kundenrezensionen hinter dieser Bewertung.
- Link die URL zur eigenen Detailseite des Produkts.
Warum ein einfacher Abruf bei Walmart scheitert
Wenn Sie eine Walmart-Such-URL mit einem einfachen HTTP-Client abrufen, erhalten Sie eine Antwort mit Status 200 und fast keine der Produktdaten im Body. Zwei Dinge arbeiten gegen Sie. Erstens baut Walmart sein Suchraster clientseitig: Das anfängliche HTML ist eine Hülle, die sich erst füllt, nachdem das JavaScript der Seite in einem Browser ausgeführt wurde. Zweitens kennzeichnet Walmart automatisierten Traffic schnell. Datacenter-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden mit einem CAPTCHA herausgefordert oder blockiert, bevor sie je die gerenderten Listings erreichen.
Ein funktionierender Walmart-Scraper benötigt also zwei Dinge in einer Anfrage: einen Browser, der die Seite tatsächlich rendert, und eine IP, die die Plattform als echten Käufer liest. Das können Sie selbst mit einem Headless-Browser plus einem Pool von rotierenden Residential-Proxys zusammenstellen, aber diese Teile zusammenzufügen und gesund zu halten, ist der Großteil der Arbeit. Die Crawling API fasst beides in einem einzigen Aufruf zusammen: Sie senden die URL mit einem JavaScript-Token, sie rendert die Seite hinter einer vertrauenswürdigen Residential-IP und gibt fertiges HTML zurück, das Sie parsen können.
Crawlbase bietet zwei Token-Typen an. Das normale Token ruft statisches HTML ab; das JavaScript (JS)-Token rendert die Seite zuerst in einem echten Browser. Walmarts Suchraster wird clientseitig gerendert, daher benötigen Sie hier das JS-Token. Das normale Token zu verwenden gibt dieselbe leere Hülle zurück wie ein einfacher Abruf, und es gibt nichts daraus zu parsen.
Voraussetzungen
Bevor Sie Code schreiben, müssen einige Dinge vorhanden sein. Keines davon nimmt viel Zeit in Anspruch.
Grundkenntnisse in Python. Sie sollten vertraut sein mit dem Schreiben und Ausführen eines Python-Skripts sowie dem Installieren von Paketen mit pip. Wenn Sie neu in der Sprache sind, bringen Sie die offiziellen Python-Docs und jeder Einsteigerkurs auf das Niveau, das dieses Tutorial voraussetzt.
Python 3.8 oder höher. Überprüfen Sie Ihre Version mit python --version. Falls Sie es nicht haben, installieren Sie es von python.org oder über eine Distribution wie Anaconda.
Ein Crawlbase-Konto und JS-Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr JavaScript (JS)-Token von der Konto-Dokumentationsseite. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, halten Sie es also aus der Versionskontrolle heraus.
Projekt einrichten
Erstellen Sie eine virtuelle Umgebung, damit Projektabhängigkeiten isoliert bleiben, und installieren Sie dann die zwei Bibliotheken, die der Scraper benötigt.
python --version python -m venv walmart_env source walmart_env/bin/activate pip install crawlbase beautifulsoup4
Unter Windows aktivieren Sie die Umgebung mit walmart_env\Scripts\activate anstelle der source-Zeile. Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Client für die Crawling API, und beautifulsoup4 parst das zurückgegebene HTML, sodass Sie jedes Feld per CSS-Selektor aus dem Ergebnisraster ziehen können.
Die Walmart-Suchseite verstehen
Eine Walmart-Suchergebnisseite zeigt ein Raster von Produktkarten, eine pro Listing. Jede Karte trägt dieselbe Handvoll Felder: einen Titel, einen Preis, eine Sternebewertung mit einer Rezensionsanzahl und einen Link zur Detailseite des Produkts. Unter dem Raster befinden sich Paginierungssteuerungen, mit denen Sie weitere Ergebnisseiten für dieselbe Anfrage durchsuchen können.
Bevor Sie Selektoren schreiben, öffnen Sie eine Suchseite in Ihrem Browser, klicken Sie mit der rechten Maustaste auf eine Produktkarte und wählen Sie Inspizieren. Sie sehen jede Karte in einem Container mit stabilen Datenattributen eingewickelt, und Titel, Preis und Bewertung durch data-automation-id-Marker exponiert. Diese Attribute sind Ihr Ziel. Walmarts Utility-Klassennamen ändern sich oft, aber die Automation-IDs sind haltbarer, also setzen Sie dort an, wo Sie können.
Schritt 1: Die gerenderte Suchseite abrufen
Beginnen Sie damit, die fertige Seite zu laden. Importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem JS-Token, erstellen Sie die Such-URL aus einer Anfrage und fordern Sie sie an. Den Statuscode vor dem Parsen zu prüfen hält Fehler sichtbar statt still.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("latin1") print(f"Request failed: {response['status_code']}") return None if __name__ == "__main__": query = "iPhone" search_url = f"https://www.walmart.com/search?q={query}" html = crawl(search_url) print(html[:500] if html else "No HTML returned")
Die beiden Warteoptionen sind wichtig für ein clientseitig gerendertes Ziel wie dieses. ajax_wait weist die API an, auf das Fertigladen von asynchronem Inhalt zu warten, und page_wait hält für eine feste Anzahl von Millisekunden nach dem Laden, damit das spät rendernd Raster erscheint, bevor die Seite erfasst wird. Fünf Sekunden sind ein vernünftiger Start; erhöhen Sie den Wert, wenn Karten fehlen. Der Body wird als latin1 dekodiert, weil Walmart-Seiten Zeichen enthalten, bei denen die strikte UTF-8-Dekodierung stürzen kann. Führen Sie das Skript aus und Sie sollten echtes Produkt-Markup sehen, nicht die leere Hülle, die ein einfacher Abruf zurückgibt. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben.
Walmart benötigt eine gerenderte Seite hinter einer vertrauenswürdigen IP, in einem Aufruf. Die Crawling API nimmt ein JS-Token, führt die Seite in einem echten Browser aus, rotiert serverseitig durch Residential-IPs und gibt Ihnen fertiges HTML, sodass Sie selbst keine Headless-Flotte und keinen Proxy-Pool betreiben müssen. Testen Sie es zunächst auf dem kostenlosen Tarif gegen eine Suchanfrage.
Schritt 2: Das Ergebnisraster mit BeautifulSoup parsen
Mit dem gerenderten HTML laden Sie es in BeautifulSoup, finden jede Produktkarte und ziehen jedes Feld per Selektor. Walmart umschließt jedes Listing in einem Container, den Sie auswählen können, und exponiert Titel und Preis durch data-automation-id-Attribute. Lesen Sie den Link aus dem Anker der Karte, und parsen Sie den kombinierten Bewertungs- und Rezensionsstring in zwei Werte. Umwickeln Sie jede Karte in einem try/except, damit ein fehlerhaftes Listing den Lauf nicht abbricht.
from bs4 import BeautifulSoup def text_of(card, selector): el = card.select_one(selector) return el.get_text(strip=True) if el else None def parse_rating(card): el = card.select_one("span.w_iUH7") if not el: return None, None text = el.get_text(strip=True) rating = text.split(" out of")[0] if "out of" in text else None reviews = None if "reviews" in text: reviews = text.split("Stars.")[-1].replace("reviews", "").strip() return rating, reviews def scrape_results(html): soup = BeautifulSoup(html, "html.parser") cards = soup.select("div[data-item-id]") results = [] for card in cards: try: rating, reviews = parse_rating(card) link = card.select_one("a[href]") results.append({ "name": text_of(card, 'span[data-automation-id="product-title"]'), "price": text_of(card, 'div[data-automation-id="product-price"] span.f2'), "rating": rating, "reviews": reviews, "link": link["href"] if link else None, }) except Exception as e: print(f"Skipped a card: {e}") return results
Der text_of-Helfer fragt ein einzelnes Element innerhalb einer Karte ab und gibt None zurück, wenn das Element fehlt, statt bei einem .get_text()-Aufruf gegen nichts zu werfen. Das hält die Extraktion resilient, wenn ein Feld fehlt, was häufig ist, da nicht jedes Listing eine Bewertung trägt. Der Preis wird aus dem Ganzzahlspan im Preisblock gelesen, und der Produktlink kommt aus dem href des Ankers der Karte statt aus seinem Text. Der parse_rating-Helfer teilt Walmarts kombinierten String "4.2 out of 5 Stars. 3244 reviews" in eine numerische Bewertung und eine Rezensionsanzahl auf, sodass Sie sie als separate Felder speichern.
Walmarts Utility-Klassennamen (der span.f2-Preisspan, der span.w_iUH7-Bewertungsstring) ändern sich ohne Vorankündigung, und die Ergebniskarten-Container-Attribute verschieben sich gelegentlich auch. Behandeln Sie die obigen Selektoren als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld für jede Karte als None zurückkommt, prüfen Sie die Live-Suchseite in den Dev Tools Ihres Browsers und aktualisieren Sie den Selektor. Periodische Selektorpflege ist normal für jeden Produktions-Scraper, kein Zeichen dafür, dass etwas kaputt ist.
Schritt 3: Alles zusammenfügen
Verbinden Sie nun den Abruf und das Parsen in einem lauffähigen Skript. Rufen Sie die gerenderte Suchseite ab, übergeben Sie sie dem Parser und geben Sie die strukturierten Datensätze aus.
import json from crawlbase import CrawlingAPI from bs4 import BeautifulSoup api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("latin1") print(f"Request failed: {response['status_code']}") return None def text_of(card, selector): el = card.select_one(selector) return el.get_text(strip=True) if el else None def parse_rating(card): el = card.select_one("span.w_iUH7") if not el: return None, None text = el.get_text(strip=True) rating = text.split(" out of")[0] if "out of" in text else None reviews = None if "reviews" in text: reviews = text.split("Stars.")[-1].replace("reviews", "").strip() return rating, reviews def scrape_results(html): soup = BeautifulSoup(html, "html.parser") cards = soup.select("div[data-item-id]") results = [] for card in cards: try: rating, reviews = parse_rating(card) link = card.select_one("a[href]") results.append({ "name": text_of(card, 'span[data-automation-id="product-title"]'), "price": text_of(card, 'div[data-automation-id="product-price"] span.f2'), "rating": rating, "reviews": reviews, "link": link["href"] if link else None, }) except Exception as e: print(f"Skipped a card: {e}") return results def main(): query = "iPhone" search_url = f"https://www.walmart.com/search?q={query}" html = crawl(search_url) if not html: return data = scrape_results(html) print(json.dumps(data, indent=2)) if __name__ == "__main__": main()
Wie die Ausgabe aussieht
Führen Sie das vollständige Skript mit python scraper.py aus und Sie erhalten eine saubere Liste von Datensätzen, einen pro Ergebnis, bereit zum Schreiben in JSON, CSV oder eine Datenbank.
[ { "name": "AT&T Apple iPhone 11, 64GB, Black - Prepaid Smartphone", "price": "399", "rating": "3.8", "reviews": "202", "link": "https://www.walmart.com/ip/..." }, { "name": "Straight Talk Apple iPhone 11, 64GB, Black", "price": "249", "rating": "4.2", "reviews": "3244", "link": "https://www.walmart.com/ip/..." } ]
Paginierung über Ergebnisseiten
Eine Seite ist ein Demo; ein echter Auftrag läuft über jede Seite der Ergebnisse für eine Anfrage. Walmart paginiert die Suche mit einem &page=-Parameter, also laufen Sie durch Seiten, indem Sie ihn erhöhen und aufhören, wenn eine Seite keine Karten zurückgibt. Das vermeidet die Hardcodierung einer Seitenanzahl und verarbeitet natürlich Anfragen mit nur wenigen Ergebnissen.
import time def scrape_all_pages(query, max_pages=5): base = f"https://www.walmart.com/search?q={query}" all_results = [] for page in range(1, max_pages + 1): page_url = f"{base}&page={page}" html = crawl(page_url) if not html: break results = scrape_results(html) if not results: break all_results.extend(results) print(f"Page {page}: {len(results)} products") time.sleep(2) return all_results
Die max_pages-Obergrenze hält einen Lauf begrenzt, damit eine breite Anfrage nicht endlos läuft, und der Leereseitenbruch stoppt Sie früh, wenn Walmart keine Seiten mehr hat. Das time.sleep(2) zwischen Seiten verteilt Anfragen zeitlich, sodass Sie die Suche nicht in einer engen Schleife hämmern, was der schnellste Weg ist, gedrosselt zu werden. Passen Sie beides an Ihr Volumen und die folgenden Ratenlimits an.
Nicht blockiert bleiben
Auch mit behandeltem Rendering beobachtet Walmart Traffic, der wie ein Scraper aussieht. Einige Gewohnheiten halten einen Lauf gesund und gelten für jedes schwierige kommerzielle Ziel.
-
Anfragen zeitlich verteilen. Verteilen Sie Anfragen mit einer Verzögerung zwischen Seiten und variieren Sie Ihre Anfragen, statt einen Begriff mit voller Geschwindigkeit zu crawlen. Das
time.sleepin der Paginierungsschleife ist die Untergrenze, nicht die Obergrenze. - Auf Rotation setzen. Ein Pool von Residential-IPs verteilt Anfragen über viele echte Benutzeradressen, sodass keine einzelne ein Ratenlimit auslöst. Die Crawling API übernimmt das für Sie; wenn Sie Ihren eigenen Stack verwenden, ist das der Teil, den Sie richtig machen müssen.
- Statuscodes lesen. Ein Lauf, der beginnt, Herausforderungen oder Fehler zurückzugeben, signalisiert, dass die aktuelle Rate oder IP-Stufe nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückschalten, nicht als Lärm zum Ignorieren.
Das umfassendere Playbook finden Sie unter wie Sie CAPTCHAs beim Web-Scraping umgehen, und wenn Sie nach dem Sammeln von Suchlinks ein einzelnes Listing ausführlich scrapen möchten, setzt der Begleitleitfaden zum Scrapen einer Walmart-Produktseite mit Selenium dort an. Für Zahlen dazu, wie eine verwaltete API im Vergleich zu einem rohen Proxy-Pool bei diesem genauen Ziel abschneidet, ist der Walmart-Scraping-Proxys-Benchmark lesenswert. Wenn Sie lieber Ihren eigenen Traffic über einen rotierenden Pool leiten, anstatt die verwaltete API zu verwenden, gibt Ihnen der Smart AI Proxy (auch KI-Proxy genannt) dieselbe Residential-IP-Rotation als Drop-in-Proxy-Endpunkt.
Ist es legal, Walmart zu scrapen?
Ob das Scrapen von Walmart erlaubt ist, hängt von Walmarts Nutzungsbedingungen, Ihrer Rechtsprechung und der Verwendung der Daten ab. Walmarts Bedingungen schränken automatisierten Zugriff ein, sodass Scraping unabhängig von der Sorgfalt Ihrer Tools gegen diese Bedingungen verstoßen kann. Keiner der hier vorgestellte Code ändert das; er lässt lediglich den technischen Teil funktionieren. Lesen Sie Walmarts Nutzungsbedingungen und seine robots.txt und behandeln Sie beides als Grenze dessen, was Sie sammeln.
Einige Regeln, an die es sich zu halten lohnt. Sammeln Sie nur öffentliche Daten: die Produktnamen, Preise, Bewertungen, Rezensionsanzahlen und Listing-Links, die jeder auf einer Suchergebnisseite ohne Konto sehen kann. Respektieren Sie Walmarts erklärte Ratenerwartungen und halten Sie Ihr Anfragevolumen niedrig genug, dass Sie seine Server nicht belasten. Vermeiden Sie personenbezogene Daten, einschließlich allem, was mit identifizierbaren Käufern, Rezensenten oder Verkäufern verbunden ist, über das hinaus, was öffentlich auf einer Ergebnisseite aufgeführt ist. Wenn Sie die Daten kommerziell weiterverwenden möchten, holen Sie eine Genehmigung oder eine offizielle Vereinbarung ein, anstatt davon auszugehen, dass Schweigen Zustimmung bedeutet.
Dieser Leitfaden beschränkt sich bewusst auf öffentliche Such- und Listingseiten, weil das die Grenze ist, die die Arbeit vertretbar hält. Er behandelt weder Inhalte hinter einem Login, Konto- oder Bestelldaten, personenbezogene Informationen, Zahlungs- oder Checkout-Flows noch Versuche, Authentifizierung zu umgehen. Für lizenzierten oder Massenzugriff bietet Walmart offizielle APIs und Partnerprogramme an, und das ist das richtige Werkzeug, wenn Sie große Mengen, garantierte Strukturen oder kommerzielle Rechte benötigen. Wenn Ihr Projekt mehr als öffentliche Listings erfordert, ist eine offizielle API oder eine Datenvereinbarung der richtige Weg, nicht ein cleverer Scraper.
Wichtigste Erkenntnisse
- Walmart-Suche wird clientseitig gerendert. Ein einfacher Abruf gibt eine leere Hülle zurück, Sie müssen also die Seite rendern, bevor Sie sie parsen.
-
Sie benötigen Rendering und eine vertrauenswürdige IP zusammen. Die Crawling API mit einem JS-Token macht beides in einem Aufruf;
ajax_waitundpage_waitsteuern, wie lange es auf das Raster wartet. - BeautifulSoup erledigt die Extraktion. Schleifen Sie durch die Ergebniskarten und ordnen Sie Name, Preis, Bewertung, Rezensionen und Link den aktuellen Selektoren zu, und rechnen Sie damit, dass diese driften.
-
Mit dem page-Parameter paginieren. Laufen Sie
&page=durch, bis eine Seite keine Karten zurückgibt, verteilen Sie Anfragen zeitlich mit einer Verzögerung und begrenzen Sie die Seitenanzahl. - Bei öffentlichen Daten bleiben. Respektieren Sie Walmarts Nutzungsbedingungen und robots.txt, bevorzugen Sie eine offizielle Walmart-API für lizenzierte oder Massendaten und berühren Sie niemals Konten, Bestellungen oder personenbezogene Informationen.
Häufig gestellte Fragen
Warum gibt ein einfacher Abruf keine Produkte von Walmart zurück?
Weil Walmart sein Suchraster clientseitig mit JavaScript aufbaut. Das anfängliche HTML ist eine Hülle, die sich erst füllt, nachdem die Skripte der Seite in einem Browser laufen, sodass eine rohe HTTP-Anfrage Status 200 zurückgibt, während die Listings leer sind. Um echte Daten zu erhalten, müssen Sie die Seite zuerst rendern, was das JS-Token der Crawling API für Sie übernimmt.
Benötige ich das normale Token oder das JS-Token für Walmart?
Das JS-Token. Das normale Token ruft statisches HTML ab, was bei Walmart dieselbe leere Hülle wie ein einfacher Abruf ist. Das JS-Token rendert die Seite in einem echten Browser, bevor es das HTML zurückgibt, sodass die Produktkarten vorhanden sind, wenn BeautifulSoup sie parst.
Wie scrape ich jede Seite einer Walmart-Suche?
Walmart paginiert mit einem &page=-Parameter in der Such-URL. Erhöhen Sie ihn in einer Schleife, scrapen Sie jede Seite mit demselben Parser und stoppen Sie, wenn eine Seite keine Karten zurückgibt. Begrenzen Sie die Seitenanzahl und fügen Sie eine kurze Verzögerung zwischen Anfragen hinzu, um den Lauf zu verteilen und nicht gedrosselt zu werden.
Meine Selektoren geben None zurück. Was hat sich geändert?
Höchstwahrscheinlich Walmarts Markup. Seine Utility-Klassennamen wie span.f2 für den Preis und span.w_iUH7 für den Bewertungsstring ändern sich ohne Vorankündigung, und die Karten-Container-Attribute verschieben sich gelegentlich auch. Prüfen Sie eine Live-Suchseite in den Dev Tools Ihres Browsers, bevorzugen Sie die haltbareren data-automation-id-Marker, wo Sie können, und aktualisieren Sie die Selektoren. Periodische Pflege ist normal für jeden Produktions-Scraper.
Kann ich Bestell-, Konto- oder Checkout-Daten von Walmart scrapen?
Nein, und dieser Leitfaden behandelt das nicht. Bestellverlauf, Konto-Details und Checkout-Flows sitzen hinter einem Login und sind keine öffentlichen Daten. Login-gesperrte Inhalte zu scrapen oder Authentifizierung zu umgehen, um sie zu erreichen, ist hier nicht im Rahmen und verstößt gegen Walmarts Bedingungen. Für sanktionierten Zugriff auf umfangreichere Daten ist eine offizielle Walmart-API oder eine Partnervereinbarung der richtige Weg.
Wie vermeide ich das Blockiertwerden beim Scrapen von Walmart?
Halten Sie Ihre Anfragerate pro IP niedrig, fügen Sie eine Verzögerung zwischen Seiten hinzu, variieren Sie Ihre Anfragen statt einen Begriff zu wiederholen, und routen Sie durch rotierende Residential-IPs, sodass keine einzelne Adresse ein Ratenlimit auslöst. Die Crawling API verwaltet Rotation und einen vertrauenswürdigen IP-Pool für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, in den Sie investieren sollten. Beachten Sie die Statuscodes und treten Sie zurück, wenn Sie anfangen, Herausforderungen zu sehen.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
