Rotierende Proxys fürs Scraping: Einrichtung und Fallstricke
Ein rotierender Proxy wechselt die IP-Adresse, von der dein Datenverkehr ausgeht, entweder bei jeder Anfrage oder nach einem festen Intervall. Er ist eines der häufigsten Werkzeuge beim Web-Scraping und eines der am häufigsten falsch eingesetzten. Rotierst du zu wenig, wird eine einzelne Adresse ratenbegrenzt. Rotierst du zu viel, sieht der Verkehr überhaupt nicht mehr nach einem Besucher aus. Dieser Leitfaden erklärt die beiden Rotationsmodelle, zeigt ein funktionierendes Python-Setup mit Wiederholungen für tote Proxys und behandelt, wie ein Proxy-Feld zum Captcha-Lösen passt.
Rotierende versus stabile Sitzungen
Ein rotierender Proxy-Dienst gibt Adressen auf zwei Arten aus:
- Rotation pro Anfrage. Jede Anfrage bekommt eine neue Ausgangsadresse. Das passt zu großen Crawls vieler unzusammenhängender Seiten, bei denen keine Seite die vorherige braucht.
- Stabile Sitzungen. Eine Adresse wird für eine festgelegte Zeit behalten, oft einige Minuten, oder bis du sie freigibst. Das passt zu allem, was Zustand braucht: einem Login, einem Warenkorb, einer paginierten Liste, bei der Cookies eine Rolle spielen.
Ein echter Besucher behält eine Adresse für einen ganzen Besuch. Stabile Sitzungen bilden dieses Verhalten nach, daher sind sie meist der bessere Standard, wenn eine Seite Cookies oder Sitzungen nutzt. Verwende Rotation pro Anfrage für zustandsloses Crawlen.
Ein einfacher rotierender Pool in Python
Das folgende Beispiel hält einen Pool von Proxy-URLs vor, rotiert durch sie und wechselt weiter, wenn einer ausfällt. Halte Zugangsdaten in Umgebungsvariablen, niemals im Quellcode.
import itertools
import os
import requests
# Proxy-URLs kommen aus der Umgebung, zum Beispiel:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # Proxy-Authentifizierung fehlgeschlagen
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # toter oder langsamer Proxy: den nächsten versuchen
raise RuntimeError(f"all attempts failed for {url}: {last_error}")
Zwei Details sind hier wichtig. Erstens sollte ein toter Proxy auf einer anderen Adresse erneut versucht werden, nicht auf derselben. Zweitens sollte eine Anfrage, die mit einem Authentifizierungsfehler scheitert, stoppen und gemeldet werden, statt den ganzen Pool durchzuprobieren.
Die Gesundheit des Proxys überwachen
Ein einfaches Round-Robin schickt weiterhin Verkehr an einen Proxy, der zu versagen beginnt. Führe für jede Adresse einen einfachen Score: Zähle aktuelle Fehlschläge, und nimm eine Adresse für eine Abkühlzeit aus dem Pool, sobald sie eine Schwelle überschreitet. Nimm sie später wieder auf und beobachte sie erneut. Dein Scraper verteilt seine Anfragen dann auf den gesunden Teil des Pools.
Protokolliere den verwendeten Proxy bei jedem Ergebnis. Wenn eine Seite anfängt, Sperren zurückzugeben, willst du wissen, ob eine Adresse, eine Region oder der ganze Pool dafür verantwortlich ist.
Den Pool takten
Rotation verteilt die Last auf Adressen, aber jede Adresse hat weiterhin eine Rate. Lege eine Verzögerung pro Adresse fest und eine globale Obergrenze für die Anfragen pro Sekunde über den ganzen Pool. Rotation ist keine Erlaubnis, mehr Verkehr zu senden. Sie ist ein Weg, den Verkehr einer einzelnen Adresse in vernünftigen Grenzen zu halten.
Häufige Fehler
Die meisten Probleme mit Rotation kommen von wenigen Gewohnheiten. Wenn du die Adresse mitten in einem Login oder einem Bestellvorgang wechselst, bricht die Sitzung und die Seite wird misstrauisch. Eine 429-Antwort ist eine Ratenbegrenzung durch die Seite, kein kaputter Proxy, daher bringt es nur mehr Ärger, sofort auf eine neue Adresse zu wechseln und erneut zu senden. Die Adresse bei jeder Anfrage zu wechseln, während du dieselben Cookies behältst, ist ebenfalls inkonsistent, denn die Cookies wurden einem anderen Besucher ausgestellt. Und ein Pool, der nie geprüft wird, füllt sich leise mit toten Adressen, und deine Fehlerquote steigt ohne erkennbaren Grund. Prüfe den Pool nach einem Zeitplan und entferne, was ausfällt.
Proxys und Captcha-Lösung
Manche Captcha-Tasks können den Proxy nutzen, den dein Scraper verwendet. Du übergibst ihn im optionalen Feld proxy in der Form http://user:pass@host:port, und die Lösung läuft über denselben Netzwerkpfad, den dein Seitenaufruf nutzt. Proxyless-Tasks lassen dieses Feld ganz weg. Welchen du wählst, hängt davon ab, ob die Seite das Captcha an die Netzwerkadresse bindet. Dieser Kompromiss wird in Proxy gegen proxyless beim Captcha-Lösen erklärt.
Zwei praktische Punkte:
- Verwende für den Seitenaufruf und die Captcha-Lösung denselben Proxy, wenn die Seite die Adresse prüft. Gemischte Adressen können dazu führen, dass das Token fehlschlägt.
- Tokens laufen schnell ab. Fordere das Token kurz vor dem Absenden des Formulars an, nicht lange vorher. Siehe Ablauf von Captcha-Tokens.
Der aktuell live verfügbare Captcha-Typ bei Scarnox ist PopularCaptcha. Der PopularCaptcha-Python-Leitfaden zeigt die Anfrage und wie du das zurückgegebene Token absendest.
Die richtigen Proxys auswählen
Der Typ der Adressen, die du rotierst, ist genauso wichtig wie die Rotation selbst. Rechenzentrums-Adressen sind pro Anfrage schnell und günstig, werden aber oft niedrig bewertet. Residential-Adressen werden besser bewertet und sind langsamer. Der Leitfaden Residential- vs. Datacenter-Proxys vergleicht sie ausführlich, und die dortigen Empfehlungen gelten auch für den Pool, den du hier aufbaust.
Verantwortungsvoll scrapen
- Lies
robots.txtund die Nutzungsbedingungen der Seiten, die du scrapst. - Verwende Proxys, um legitime Last zu verteilen, nicht um eine Einschränkung zu umgehen, die der Betreiber gesetzt hat.
- Verwende nur Proxy-Dienste, deren Adressen mit Einverständnis beschafft werden. Der Datenverkehr über Geräte von Menschen, die dem nicht zugestimmt haben, ist nicht akzeptabel.
- Halte Zugangsdaten aus Code und Logs heraus.
Nächste Schritte
- Residential- vs. Datacenter-Proxys
- Scrapen ohne blockiert zu werden
- Proxy gegen proxyless beim Captcha-Lösen
- Wiederholungen und Fehlerbehandlung für den Produktivbetrieb
Starte mit kostenlosem Testguthaben, ohne Karte: Konto erstellen und teste den PopularCaptcha-Ablauf mit deinem eigenen Proxy. Aktuelle Preise findest du auf der Preisseite.