Retry-Logik & Fehlerhandling beim Scraping

Retry-Logik & Fehlerhandling cover

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.

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.