Fortgeschrittenes Web Scraping: Rate Limits, Sessions, Retries und Rotation, ohne Websites zu überlasten
Veröffentlicht am · 6 Min. Lesezeit
Ein Scraper, der bei zehn Seiten funktioniert, gerät bei zehntausend oft ins Stocken: 429-Fehler, Captchas und leere Seiten, die mit 200 antworten. Das Problem ist fast nie die IP, sondern die Art, wie die Anfragen bei der Website ankommen. Dieser Artikel baut auf den Grundlagen aus [Web Scraping mit Proxys](/blog/web-scraping-mit-proxys) auf und geht einen Schritt weiter: wie Sie eine Datenerfassung aufbauen, die dauerhaft läuft und die besuchten Websites wenig belastet.
Die Signale der Website lesen
Websites teilen ihre Grenzen auf verschiedene Weise mit, und ein robuster Scraper erkennt sie alle:
- 429 Too Many Requests: Sie haben das akzeptierte Tempo überschritten. Oft kommt der Header Retry-After mit, der angibt, wie lange Sie warten sollen: eine Anzahl Sekunden oder ein Datum. Siehe auch Fehler 429.
- 503 Service Unavailable: Der Server ist überlastet oder wird gewartet. Auch hier kann Retry-After vorhanden sein.
- 403 Forbidden: Der Zugriff wird verweigert. Dieselbe Anfrage zu wiederholen hilft meist nicht: Prüfen Sie Header, Session und Tempo.
- Kontingent-Header: Manche APIs und Websites geben die verbleibenden Anfragen mit Headern wie X-RateLimit-Remaining an. Wenn es sie gibt, nutzen Sie sie, um vor dem Limit langsamer zu werden.
- Stille Sperren: Die Antwort ist 200, enthält aber ein Captcha, eine Einwilligungsseite oder eine leere Liste. Erkennbar sind sie nur am Inhalt.
Parallelität pro Domain statt Anfragen pro Sekunde
Wie stark eine Website belastet wird, hängt davon ab, wie viele Anfragen Sie gleichzeitig an sie offen haben, nicht von der Gesamtzahl pro Stunde. Deshalb ist die Parallelität pro Domain der erste Parameter, den Sie einstellen sollten: wie viele parallele Anfragen an dieselbe Website gehen.
- Klein anfangen: eine oder zwei parallele Anfragen pro Domain, mit unterschiedlich langen Pausen dazwischen.
- Tempo an die Antwortzeiten anpassen: Antworten die Seiten langsamer, steht der Server unter Last, und Sie sollten bremsen.
- robots.txt respektieren: Die Zugriffsregeln sind standardisiert (RFC 9309). Die Direktive Crawl-delay gehört nicht zum Standard und wird von Google ignoriert, aber wenn eine Website sie setzt, ist das ein klarer Hinweis auf das gewünschte Tempo.
- Über die Zeit verteilen: Ein langsamer, gleichmäßiger Durchlauf in der Nacht ist besser als eine Welle zur Stoßzeit der Website.
In Scrapy erreichen Sie das mit der Erweiterung AutoThrottle (AUTOTHROTTLE_ENABLED), die die Verzögerung an die Latenz der Website anpasst, zusammen mit CONCURRENT_REQUESTS_PER_DOMAIN, DOWNLOAD_DELAY und ROBOTSTXT_OBEY.
Sessions: wann Sie dieselbe IP behalten
Für eine Website ist eine Session ein stimmiges Ganzes: dieselbe IP, dieselben Cookies, derselbe User Agent und dieselbe Sprache. Ändert sich eines davon mittendrin, wirkt es, als hätte jemand anderes die Session übernommen.
- Behalten Sie dieselbe IP, wenn die Website Login, Warenkorb, gespeicherte Filter oder Paginierung mit Token nutzt: Das ist eine Sticky Session.
- Wechseln Sie die IP zwischen zwei Sessions, nicht währenddessen: Session beenden, IP rotieren, mit neuen Cookies neu starten.
- Ein Proxy pro Workflow: Erfassen Sie Daten von mehreren Websites parallel, geben Sie jedem Workflow einen eigenen Proxy, damit eine Rotation die anderen nicht unterbricht.
Die ganze Überlegung, wann Sie rotieren sollten und wann nicht, finden Sie in IP-Rotation.
Retries richtig gemacht: Backoff, Jitter und Obergrenze
- Wiederholen Sie nur, was sinnvoll ist: Timeouts, Netzwerkfehler, 429, 502, 503 und 504. Ein 404 oder 403 bleibt, wie er ist.
- Halten Sie Retry-After ein, wenn der Header vorhanden ist: Die Website sagt Ihnen, wie lange Sie warten sollen.
- Sonst exponentielles Backoff mit Jitter: wachsende Wartezeiten (5, 10, 20, 40 Sekunden) mit einem Zufallsanteil, damit nicht mehrere Prozesse im selben Moment erneut anfragen.
- Setzen Sie eine Obergrenze: eine maximale Zahl an Versuchen und eine maximale Wartezeit. Danach speichern Sie die URL und machen weiter.
- Pause pro Domain: Liegen die Fehler auf einer Website über einer Schwelle (zum Beispiel 10 % der letzten hundert Anfragen), stoppen Sie die gesamte Arbeit an dieser Website für einige Minuten, statt weiterzumachen.
Rotation mit Bedacht
Bei ProxyHub wechseln Sie die IP über den Rotationslink, die API oder die automatische Rotation. Link und API antworten, sobald der Wechsel abgeschlossen ist, mit der neuen IP, und ein Proxy kann seine IP höchstens einmal alle 60 Sekunden wechseln.
- Rotieren Sie zwischen zwei Durchläufen, nicht bei jeder Anfrage: Jede neue Session beginnt mit einer neuen IP.
- Nutzen Sie bei hohen Volumen mehrere Proxys parallel: Jeder hat seine eigene dedizierte IP, und während einer wechselt, laufen die anderen weiter.
- Nach einem Limit erst bremsen, dann rotieren: Begrenzt Sie eine Website, warten Sie die angegebene Zeit ab und machen Sie langsamer weiter. Die IP zu wechseln und im selben Tempo fortzufahren, führt zum selben Ergebnis.
Weniger Last für die Website, weniger Arbeit für Sie
- Bedingte Anfragen: Speichern Sie ETag und Last-Modified und senden Sie If-None-Match oder If-Modified-Since. Hat sich die Seite nicht geändert, antwortet der Server mit 304, ohne Inhalt.
- Sitemap: Um Seiten zu finden, nutzen Sie die Sitemap der Website, statt allen Links zu folgen.
- Komprimierung: Akzeptieren Sie gzip oder br im Header Accept-Encoding.
- Nur das Nötige: Blockieren Sie in automatisierten Browsern Bilder, Schriften und Videos. Oft kommen die Daten aus einem JSON-Aufruf, den Sie direkt lesen können.
- Inkrementelle Erfassung: Laden Sie nur neue oder geänderte Seiten, nicht bei jedem Durchlauf die ganze Website.
Mit Playwright genügt eine Zeile, um schwere Ressourcen zu blockieren:
page.route("**/*.{png,jpg,jpeg,gif,webp,woff,woff2,mp4}", lambda route: route.abort())Die Proxy-Einrichtung in Playwright erklärt die Anleitung Playwright.
Python-Beispiel: Retry-After, Backoff und Rotation
Ein Grundgerüst, das Retry-After einhält, Backoff mit Jitter nutzt und die IP erst nach einem wiederholten Limit wechselt, unter Berücksichtigung der 60 Sekunden zwischen zwei Wechseln:
import random, time, requests
from email.utils import parsedate_to_datetime
PROXY = "http://BENUTZER:PASSWORT@HOST:PORT"
ROTATE = "ROTATIONSLINK"
EXPECTED = 'class="price"' # Element, das die Seite enthalten muss
session = requests.Session()
session.proxies = {"http": PROXY, "https": PROXY}
last_rotation = 0.0
def retry_after(r):
v = r.headers.get("Retry-After", "")
if v.isdigit():
return int(v)
try:
return max(0, parsedate_to_datetime(v).timestamp() - time.time())
except (TypeError, ValueError):
return None
def rotate():
global last_rotation
if time.time() - last_rotation >= 60: # ein Wechsel pro Minute und Proxy
requests.get(ROTATE, timeout=30) # antwortet mit der neuen IP
last_rotation = time.time()
session.cookies.clear() # neue Session, neue Cookies
def fetch(url, tries=5):
for attempt in range(tries):
try:
r = session.get(url, timeout=30)
except (requests.ConnectionError, requests.Timeout):
time.sleep(min(60, 2 ** attempt) + random.random())
continue
if r.status_code == 200 and EXPECTED in r.text:
return r.text
if r.status_code == 200: # stille Sperre (Captcha, leere Seite)
wait = min(120, 10 * 2 ** attempt)
elif r.status_code in (429, 502, 503, 504):
wait = retry_after(r) or min(120, 5 * 2 ** attempt)
else:
r.raise_for_status() # 403, 404…: erneut versuchen bringt nichts
return r.text
if attempt >= 1:
rotate() # wiederholtes Limit: neue Session
time.sleep(wait + random.uniform(0, 3)) # jitter
raise RuntimeError(f"Zu viele Versuche: {url}")Dasselbe Muster funktioniert in Node.js und in No-Code-Tools: Bibliothek und Syntax ändern sich, die Regeln nicht. Läuft Ihre Arbeit automatisch, finden Sie weitere Tipps auf der Seite Proxys für Automatisierung und Bots.
Häufige Fragen
Wie viele Anfragen pro Sekunde kann ich stellen?
Es gibt keine Zahl, die für alle Websites gilt. Beginnen Sie mit einer oder zwei parallelen Anfragen pro Domain und Pausen von einigen Sekunden, und erhöhen Sie nur, solange Fehler und Antwortzeiten stabil bleiben. Gibt die Website Retry-After oder Crawl-delay an, halten Sie sich an diese Werte.
Muss ich die IP bei jeder Anfrage wechseln?
Nein: Ein IP-Wechsel mitten in der Session bricht Logins, Warenkörbe und Paginierung ab und senkt die Last auf der Website nicht. Wechseln Sie die IP zwischen zwei Sessions; bei ProxyHub kann jeder Proxy das einmal alle 60 Sekunden, und bei hohen Volumen nutzen Sie besser mehrere Proxys parallel.
Woran erkenne ich, dass die Website mich begrenzt, obwohl sie mit 200 antwortet?
Prüfen Sie den Inhalt: Fehlt das gesuchte Element, erscheint ein Captcha oder ist die Seite deutlich kürzer als üblich, behandeln Sie sie als Fehler. Erfassen Sie diese Fälle gesondert: Sie sind das erste Zeichen, dass Ihr Tempo zu hoch ist.
Testen Sie einen mobilen 5G-Proxy
Dediziertes Smartphone, unbegrenzter Traffic, echte Mobilfunk-IPs. In wenigen Sekunden aktiv.
Tarife ansehenOder wählen Sie das Land:
