So richten Sie Captcha-Proxy-Rotation in Python und Node ein

captcha proxy rotation - How to Set Up CAPTCHA Proxy Rotation in Python and Node

Captcha-Proxy-Rotation bauen Sie in Ihrem eigenen Code. Der Captcha-Löser nimmt einen Proxy pro Auftrag und nutzt ihn nur für diesen Auftrag, der Pool, die Rotationsstrategie und die Retry-Logik liegen also alle auf Ihrer Seite. Zwei Regeln erledigen den Großteil der Arbeit: Binden Sie eine IP an eine Sitzung, statt bei jedem Aufruf zu rotieren, und rotieren Sie erst nach einem Fehlschlag. Diese Anleitung zeigt die genaue Proxy-Struktur in jedem SDK, das rohe API-Paar dahinter und den einen Captcha-Typ, bei dem ein Proxy stillschweigend ignoriert wird.

Proxys gelten für drei Captcha-Familien, nicht für alle vier

Beginnen wir mit der Einschränkung, denn sie spart einen Nachmittag Fehlersuche. CapSkip löst vier Captcha-Familien, und Proxys funktionieren bei dreien davon: reCAPTCHA, Turnstile und GeeTest. Bild-Captchas nehmen keinen an.

reCAPTCHA zählt hier nur einmal. v2 Checkbox, Invisible, Enterprise und v3 sind Optionen desselben Solve-Aufrufs und keine eigenen Typen, deshalb verhalten sie sich bei Proxys alle gleich.

TypProxy unterstütztWarum
reCAPTCHA v2 und v3, einschließlich EnterpriseJaBeim Lösen geht eine Anfrage über den Proxy an Google
Cloudflare TurnstileJaDasselbe, gegenüber Cloudflare
GeeTest v3JaDasselbe, gegenüber dem GeeTest-API-Server
Bild oder OCRNeinDas Bild liegt bereits vor, es geht also keine Anfrage nach außen

Einen Proxy an einen Bildauftrag zu übergeben ist kein Fehler. Er wird angenommen und ignoriert, was schlimmer ist, denn ein Rotationsfehler erzeugt dort überhaupt kein Signal. Wenn Sie Bild-Captchas über denselben Wrapper leiten wie alles andere, lassen Sie das proxy-Argument auf diesem Pfad weg.

Die Proxy-Struktur in jedem SDK

Jedes SDK erwartet dasselbe Objekt mit zwei Feldern: einen Typ und eine URI. Die URI besteht entweder aus Host und Port oder aus Zugangsdaten gefolgt von Host und Port.

# pip install capskip
from capskip import CapSkip

solver = CapSkip(host="127.0.0.1", port=8080)

# The proxy applies to this one solve, nothing is remembered.
result = solver.recaptcha(
    sitekey="YOUR_SITEKEY",
    url="https://example.com/page-with-recaptcha",
    proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)

print(result["code"])   # token, solved through that IP

Node erwartet dasselbe Objekt als options-Argument.

// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

const result = await solver.turnstile(
  'YOUR_SITEKEY',
  'https://example.com/page-with-turnstile',
  { proxy: { type: 'SOCKS5', uri: '1.2.3.4:1080' } },
);

console.log(result.code, result.userAgent);  // send both back

PHP verschachtelt es im options-Array unter dem Schlüssel proxy, und .NET übergibt ein Proxy-Objekt, das aus denselben zwei Werten gebaut wird. Die vier erlaubten Typwerte sind überall gleich: HTTP, HTTPS, SOCKS5 und SOCKS5H. SOCKS5H löst DNS am Proxy auf statt lokal, und genau das brauchen Sie, wenn das Ziel je nach Region unterschiedlich aufgelöst wird.

Binden Sie einen Proxy pro Sitzung, nicht pro Anfrage

Der Instinkt sagt, für jede Lösung eine frische IP zu ziehen. Das ist die falsche Voreinstellung, und genau das lässt Sitzungen auffliegen.

Eine geschützte Seite bindet ein Token an den Kontext, in dem es ausgestellt wurde. Wenn Ihr Crawler die Seite von einer IP lädt und das Token von einer anderen gelöst wird, sieht die Website eine Diskrepanz zwischen Browsersitzung und Verifizierung. Manche Seiten ignorieren das. Cloudflare und reCAPTCHA Enterprise nicht: Dort wird das Token als minderwertig eingestuft oder scheitert ganz.

Die Einheit der Rotation ist also die Sitzung, nicht der Aufruf. Ein Proxy holt die Seite, löst das Captcha und sendet das Formular ab. Die nächste Sitzung nimmt den nächsten Proxy.

# pip install capskip
import itertools

# One entry per exit IP. Round-robin, not random:
# random picks repeat, and a repeat is what a rate limiter sees.
POOL = [
    {"type": "HTTPS", "uri": "user:[email protected]:3128"},
    {"type": "HTTPS", "uri": "user:[email protected]:3128"},
    {"type": "SOCKS5H", "uri": "user:[email protected]:1080"},
]

pool = itertools.cycle(POOL)

def new_session():
    """Hand the same proxy to the HTTP client and the solver."""
    return next(pool)

Round Robin schlägt hier die zufällige Auswahl aus einem Grund: Zufälliges Ziehen aus einem kleinen Pool wiederholt dieselbe IP oft genug direkt hintereinander, um aufzufallen, und aufeinanderfolgende Anfragen von einem Exit-Node sind genau das Muster, auf das Rate Limiter achten.

Bei Fehlschlägen rotieren, nicht nach der Uhr

Die zweite Regel betrifft den Zeitpunkt des Wechsels. Alle N Anfragen zu rotieren wirft funktionierende IPs weg und hält kaputte für bis zu N weitere Aufrufe im Umlauf. Rotieren Sie stattdessen auf Basis von Belegen.

# pip install capskip
from capskip import CapSkip
from capskip import ApiException, NetworkException, TimeoutException

solver = CapSkip(host="127.0.0.1", port=8080)

def solve_with_retry(sitekey, url, attempts=3):
    last = None
    for _ in range(attempts):
        proxy = new_session()
        try:
            return solver.recaptcha(sitekey=sitekey, url=url, proxy=proxy)
        except (ApiException, NetworkException, TimeoutException) as err:
            # Burn this IP for the run and take the next one.
            last = err
    raise last

Drei Versuche sind für die meisten Pools die richtige Obergrenze. Wenn ein sitekey auf drei verschiedenen IPs scheitert, liegt es nicht am Proxy: Der sitekey ist veraltet, die Seiten-URL ist falsch, oder die Website hat ihre Challenge geändert. Ein vierter Versuch verbraucht nur Lösungskapazität, um das zu bestätigen.

Welche Exception Sie fangen, sagt Ihnen, was passiert ist. Eine NetworkException bedeutet, dass der Solver nicht erreichbar war oder der Auftrag abgefragt wurde, bevor er fertig war. Eine TimeoutException bedeutet, dass das Abfragefenster abgelaufen ist. Eine ApiException trägt einen zurückgegebenen Fehlercode, und genau die lohnt es sich mit angehängtem Proxy zu protokollieren, denn so finden Sie den einen toten Exit-Node in einem Pool von vierzig.

Die rohe API: proxy und proxytype

Ohne SDK sind es zwei zusätzliche Formularfelder beim Submit-Aufruf. Das SDK-Objekt bildet sich direkt darauf ab.

FeldWertStandard
proxyIP:PORT oder login:pass@IP:PORTKeine
proxytypeHTTP, HTTPS, SOCKS5 oder SOCKS5HHTTP
# No install step. curl is already on your machine.
curl -X POST http://127.0.0.1:8080/in.php \
  -d "key=YOUR_API_KEY" \
  -d "method=userrecaptcha" \
  -d "googlekey=YOUR_SITEKEY" \
  -d "pageurl=https://example.com/page-with-recaptcha" \
  -d "proxy=user:[email protected]:3128" \
  -d "proxytype=HTTPS"

OK|2122988149   # submitted, and it will solve through that IP

Die Voreinstellung für proxytype ist HTTP, ein HTTPS- oder SOCKS5-Proxy, der ohne dieses Feld gesendet wird, wird also als einfacher HTTP-Proxy angewählt und schlägt fehl. Senden Sie das Feld jedes Mal mit, statt darauf zu vertrauen, dass die Voreinstellung zu Ihrem Pool passt.

Tauschen Sie den Host aus, und derselbe Aufruf funktioniert gegen eine gemeinsam genutzte Instanz. CapSkip lauscht im lokalen Modus standardmäßig auf 127.0.0.1, und die Verbindungseinstellungen bieten auch einen Server-Modus, in dem es auf Ihrer Netzwerk- oder öffentlichen IP-Adresse lauscht, sodass andere Rechner die API erreichen. Betreiben Sie es auf einem VPS, und ein einziger Löser bedient jeden Worker in Ihrer Crawl-Flotte. An der Proxy-Handhabung ändert sich nichts: Der Proxy gilt weiterhin pro Job, und der Pool liegt weiterhin in Ihrem eigenen Code.

Häufige Fehler und was sie bedeuten

SymptomUrsacheBeheben
Lösungen gelingen, Tokens werden abgelehntDie Seite wurde von einer anderen IP geholt als der, von der gelöst wurdeEinen Proxy für Abruf, Lösen und Absenden festlegen
ERROR_CAPTCHA_UNSOLVABLE nur auf einer IPDieser Exit-Node ist beim Ziel gesperrtAus dem Pool entfernen und mit dem nächsten erneut versuchen
Zeitüberschreitungen bei jedem Auftrag mit Proxyproxytype passt nicht zum ProxyDas Feld ausdrücklich senden, nicht auf die HTTP-Voreinstellung setzen
Der Proxy scheint nichts zu bewirkenDer Auftrag ist ein Bild-CaptchaErwartet. Proxys gelten für die anderen drei Familien
Läuft lokal, scheitert im ContainerDNS wird innerhalb des Netzwerks anders aufgelöstSOCKS5H verwenden, damit der Proxy den Hostnamen auflöst

Vollständige Parameterdetails zu jedem Typ finden Sie in der API-Dokumentation.

FAQ

Brauche ich überhaupt einen Proxy, um Captchas zu lösen?

Nein. Das Lösen ohne Proxy funktioniert bei den meisten Websites und ist ein bewegliches Teil weniger. Fügen Sie Proxys hinzu, wenn das Ziel geografisch beschränkt ist, wenn es nach IP drosselt oder wenn Tokens abgelehnt werden, obwohl das Lösen sauber läuft. Fangen Sie ohne an und fügen Sie einen hinzu, um ein beobachtetes Problem zu beheben.

Residential- oder Datacenter-Proxys?

Datacenter-IPs sind schneller und günstiger, und sie sind auf Websites in Ordnung, die nur drosseln. Residential-IPs zählen, wenn das Ziel das Netzwerk selbst bewertet, was auf Cloudflare-geschützten Seiten und bei reCAPTCHA Enterprise üblich ist. Beides in einem Pool zu mischen funktioniert: zuerst Datacenter probieren, bei Fehlschlag auf Residential zurückfallen.

Was ist der Unterschied zwischen SOCKS5 und SOCKS5H?

SOCKS5 löst den Hostnamen auf Ihrem Rechner auf und sendet die resultierende IP an den Proxy. SOCKS5H sendet den Hostnamen und lässt ihn vom Proxy auflösen. Verwenden Sie SOCKS5H, wenn die Website je nach Region unterschiedliche Adressen zurückgibt oder wenn Ihr lokaler Resolver das Ziel überhaupt nicht sieht.

Bremst der Proxy das Lösen aus?

Ein wenig, und es hängt eher vom Exit-Node ab als vom Solver. Das Polling selbst bleibt davon unberührt: Die SDKs starten bei 250 Millisekunden und gehen bis zur Obergrenze pollingInterval zurück, eine schnelle Lösung kommt also weiterhin schnell zurück. Ein langsamer Proxy zeigt sich als längere Zeit bis zur ersten erfolgreichen Abfrage, nicht als zusätzlicher Polling-Aufwand.

Die Kurzfassung

Binden Sie einen Proxy pro Sitzung, rotieren Sie, wenn eine Lösung fehlschlägt, statt nach Zeitplan, senden Sie proxytype immer mit, und lassen Sie den Proxy bei Bildaufträgen ganz weg. Da das Lösen selbst lokal abläuft, nämlich als unbegrenzter Captcha-Löser, kostet ein erneuter Versuch nichts außer Proxy-Bandbreite, was Rotation bei Fehlschlag günstig genug macht, um die Standardstrategie zu sein. Für die größere Pipeline, in der das Ganze steckt, siehe Captcha-Lösen für Web Scraping, das die Sitzungsverwaltung von Anfang bis Ende abdeckt. Der Python-Integrationsleitfaden enthält die clientseitige Einrichtung.