JSON-Daten aus XHR-Requests extrahieren

XHR-Requests-auslesen-JSON-extrahieren-cover

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 mit requests)
  • 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.

Mein Name ist Kadek und ich bin ein Student aus Indonesien und studiere derzeit Informatik in Deutschland. Dieser Blog dient als Plattform, auf der ich mein Wissen zu Themen wie Web Scraping, Screen Scraping, Web Data Mining, Web Harvesting, Web Data Extraction und Web Data Parsing teilen kann.