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.