Retry-Logik & Fehlerhandling beim Scraping – so geh ich damit um
Ausgangspunkt
Selbst bei stabilen Proxys und guten Headern können beim Scraping Fehler auftreten: Server überlastet, IP gebannt, JSON kaputt oder Timeout.
Ziel war es, ein robustes Retry-System zu bauen, das Fehler erkennt, reagiert und nicht zu aggressiv ist.
⚠️ Typische Fehler beim Scraping
- 403 Forbidden – meist IP blockiert oder falscher Header
- 429 Too Many Requests – zu schnell, kein Delay
- TimeoutError – Seite zu langsam, Server überlastet
- JSONDecodeError – keine gültige Antwort, leere Response
⚙️ Retry mit httpx & Backoff
Ich nutze eine eigene kleine Retry-Schleife mit zufälligem Delay. So kann ich bei bestimmten Fehlern gezielt erneut versuchen – mit Pausen.
import httpx import time import random def fetch_with_retry(url, max_attempts=5): for attempt in range(1, max_attempts + 1): try: r = httpx.get(url, timeout=10) r.raise_for_status() # HTTPError bei 4xx/5xx return r except (httpx.HTTPStatusError, httpx.TimeoutException) as e: print(f"Fehler: {e} (Versuch {attempt})") delay = random.uniform(2, 5) time.sleep(delay) return None
Fehler gezielt behandeln
try: r = fetch_with_retry("https://example.com/api") data = r.json() except httpx.HTTPStatusError as e: print("Blockiert oder gesperrt") except httpx.TimeoutException: print("Server nicht erreichbar") except ValueError: print("Antwort ist kein gültiges JSON")
Fortschritt loggen
Besonders bei großen Listen hilfreich – wenn du z. B. 1.000 Produkte scrapest:
- Fehler zählen
- Erfolgreiche Saves loggen
- Letzte erfolgreiche ID speichern
Wann abbrechen?
- Wenn 5x in Folge Timeout → evtl. Proxy tot
- Bei 403 sofort wechseln (IP, Header)
- Bei JSON-Fehler → oft reicht schon 1 Retry mit Delay
Fazit
Retry-Logik und Fehlerbehandlung sind das Rückgrat jeder Scraping-Routine. Wer schlau wiederholt und nicht sofort abbricht, kriegt mehr Daten mit weniger Blockaden – und erkennt frühzeitig, wenn etwas wirklich nicht funktioniert.
Code getestet mit httpx in Python, Stand April 2025.