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

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.
| Typ | Proxy unterstützt | Warum |
|---|---|---|
| reCAPTCHA v2 und v3, einschließlich Enterprise | Ja | Beim Lösen geht eine Anfrage über den Proxy an Google |
| Cloudflare Turnstile | Ja | Dasselbe, gegenüber Cloudflare |
| GeeTest v3 | Ja | Dasselbe, gegenüber dem GeeTest-API-Server |
| Bild oder OCR | Nein | Das 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 IPNode 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 backPHP 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 lastDrei 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.
| Feld | Wert | Standard |
|---|---|---|
| proxy | IP:PORT oder login:pass@IP:PORT | Keine |
| proxytype | HTTP, HTTPS, SOCKS5 oder SOCKS5H | HTTP |
# 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
| Symptom | Ursache | Beheben |
|---|---|---|
| Lösungen gelingen, Tokens werden abgelehnt | Die Seite wurde von einer anderen IP geholt als der, von der gelöst wurde | Einen Proxy für Abruf, Lösen und Absenden festlegen |
ERROR_CAPTCHA_UNSOLVABLE nur auf einer IP | Dieser Exit-Node ist beim Ziel gesperrt | Aus dem Pool entfernen und mit dem nächsten erneut versuchen |
| Zeitüberschreitungen bei jedem Auftrag mit Proxy | proxytype passt nicht zum Proxy | Das Feld ausdrücklich senden, nicht auf die HTTP-Voreinstellung setzen |
| Der Proxy scheint nichts zu bewirken | Der Auftrag ist ein Bild-Captcha | Erwartet. Proxys gelten für die anderen drei Familien |
| Läuft lokal, scheitert im Container | DNS wird innerhalb des Netzwerks anders aufgelöst | SOCKS5H 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.
