JSON-Daten aus XHR-Requests extrahieren – mein Praxisbeispiel
Ausgangspunkt
Ich wollte Produktdaten von einer E-Commerce-Seite extrahieren – Preis, Name, Verfügbarkeit. Beim klassischen HTML-Scraping (z. B. mit BeautifulSoup) war das DOM allerdings leer. Keine Daten sichtbar, nur ein paar Platzhalter.
Im Browser war aber alles da. Verdacht: Die Daten werden per JavaScript nachgeladen – typischerweise über eine XHR-Request mit JSON-Antwort.
⚙️ Mein Werkzeug
Ziel war es, nicht den ganzen Browser zu automatisieren, sondern die direkte Datenquelle zu finden und sie per HTTP abzufragen. Ich habe folgendes verwendet:
- Browser DevTools (Netzwerk-Tab, XHR-Filter)
- Python +
httpx
(geht auch mitrequests
) - JSON-Analyse & Header-Reverse-Engineering
Probleme & Beobachtungen
- Die Seite zeigte im HTML keine Inhalte – alles kam asynchron.
- XHR-Request hatte einen kryptischen Endpoint wie
/api/v3/productinfo?sku=123456
- Ohne passende Headers (v. a. User-Agent, Accept, Referer) →
403 Forbidden
- Einige Parameter wie
session_id
waren nötig, aber statisch
Lösung
1. XHR-Request in DevTools nachverfolgt
Im Browser (Chrome oder Firefox → DevTools → Netzwerk → XHR) die richtige Anfrage identifiziert. Darin war die komplette JSON-Nutzlast mit den Produktdaten.
2. URL, Headers & Query-Parameter kopiert
Rechtsklick auf Request → „Als cURL kopieren“ → umgewandelt in Python + httpx
.
3. Minimaler Python-Code
import httpx headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...", "Accept": "application/json, text/plain, */*", "Referer": "https://zielseite.de/produkt/123456", } url = "https://zielseite.de/api/v3/productinfo?sku=123456" r = httpx.get(url, headers=headers) data = r.json() print(data)
4. JSON analysiert
Die Antwort enthielt:
data["price"]["value"]
data["availability"]["status"]
data["product"]["title"]
Was ich gelernt habe
- XHRs sind oft die einfachere Alternative zu DOM-Scraping
- Ohne Header kopieren geht oft gar nichts
- „Als cURL kopieren“ ist Gold wert beim Nachbauen
- Man spart sich Headless-Browser, wenn die API öffentlich genug ist
Bonus: Wenn’s nicht klappt
Manche XHR-Requests enthalten dynamische Tokens (CSRF, session_id), die bei jedem Seitenaufruf neu generiert werden. Dann kann es sein, dass man doch einen echten Browser braucht – z. B. Playwright oder Puppeteer – um den Token vorab zu holen.
Fazit
Wenn eine Seite nach dem Laden leer aussieht, lohnt sich fast immer ein Blick in den Netzwerk-Tab. Oft liegen die echten Daten in einer JSON-Antwort – und sind leichter zu holen, als man denkt.
Test & Code vom 04/2025 – kann sich je nach Zielseite ändern.