Scarnox · Blog

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:

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:

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

Nächste Schritte

Starte mit kostenlosem Testguthaben, ohne Karte: Konto erstellen und teste den PopularCaptcha-Ablauf mit deinem eigenen Proxy. Aktuelle Preise findest du auf der Preisseite.