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_idwaren 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.