Captcha Solver für
Scrapy
Lösen Sie die Challenge innerhalb des Laufs, statt den Job scheitern zu lassen. Ein lauffähiges Python-Beispiel und die drei Faktoren, die über die Annahme Ihres Tokens entscheiden.
# middlewares.py
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
class CaptchaNoMiddleware:
def process_response(self, request, response, spider):
sitekey = response.css("[data-sitekey]::attr(data-sitekey)").get()
if not sitekey:
return response
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": response.url})
return request.replace(
method="POST",
body=f"g-recaptcha-response={solution['token']}",
headers={"Content-Type": "application/x-www-form-urlencoded"},
dont_filter=True,
)Was über die Annahme des Tokens entscheidet
- Reichen Sie Ihren Proxy durch. Das Token sollte hinter derselben Exit-IP erzeugt werden, von der es auch abgeschickt wird. Bei sitzungsbasiert bewertenden Systemen ist das Pflicht, keine Optimierung.
- Verwenden Sie denselben User-Agent. Turnstile und mehrere Anti-Bot-Systeme binden das Token an einen User-Agent. Wir geben den verwendeten zurück, damit Sie ihn exakt übernehmen können.
- Fordern Sie spät an. Tokens laufen nach etwa 120 Sekunden ab. Fordern Sie eines erst an, wenn Sie zum Absenden bereit sind.
Blockierend oder Polling
Das Beispiel nutzt ?wait=60, sodass der Aufruf die fertige Lösung zurückgibt und Ihr Scrapy-Schritt linear bleibt. Wenn Sie keine Verbindung offen halten möchten, lassen Sie den Parameter weg, speichern die zurückgegebene id und fragen GET /v1/task/{id} alle fünf Sekunden ab. Ein bezahltes Token bleibt zehn Minuten lang abrufbar, eine abgebrochene Verbindung kostet Sie also nicht die Lösung.
Kosten
$0.00598 pro erfolgreicher reCAPTCHA-v2-Lösung, fehlgeschlagene Lösungen werden nie berechnet. Unter Preise finden Sie jeden Challenge-Typ, in der API-Referenz das vollständige Request-Format.
So fügt sich die Lösung in Scrapy ein
Scrapy hat keinen Browser, das Captcha wird daher in einer Downloader-Middleware behandelt: Challenge in der Response erkennen, lösen und den Request mit dem Token oder Cookie wiederholen.
- 01In process_response erkennen
Suchen Sie im Response-Body nach einem data-sitekey oder einer bekannten Challenge-Seite.
- 02Lösen
Rufen Sie die API mit dem Sitekey, response.url und dem Proxy aus request.meta auf.
- 03Mit dem Token wiederholen
Geben Sie einen FormRequest mit dem Token zurück oder den ursprünglichen Request mit dem gelösten Cookie.
- 04Cookie-Jar behalten
Lassen Sie die Cookie-Middleware von Scrapy die freigegebene Sitzung für die nächsten Requests behalten.
So kommt das Token in die Seite
Die Middleware fügt das Token zu den Formulardaten hinzu oder setzt das zurückgegebene Cookie und gibt dann einen neuen Request zurück.
Woran Integrationen meistens scheitern
Ein synchroner HTTP-Aufruf in einer Middleware bremst jeden Request aus. Nutzen Sie für die Lösung einen asynchronen Client oder einen Thread.
Rotiert eine Proxy-Middleware die IP pro Request, fixieren Sie die IP für die Wiederholung, damit sie zur Lösung passt.
Begrenzen Sie Wiederholungen pro URL. Eine Seite, die jedes Mal eine Challenge zeigt, sagt Ihnen, dass Sie langsamer werden sollten.
FAQ zu Captchas mit Scrapy
Kann Scrapy JavaScript-Challenges lösen?
Scrapy führt kein JavaScript aus. Für Token-Challenges brauchen Sie nur Sitekey und URL; bei sitzungsbasierten Systemen wie DataDome senden Sie die Challenge-URL und erhalten ein Cookie, das Scrapy wiederverwenden kann.
Sollte ich stattdessen scrapy-playwright nutzen?
Nur wenn die Seite JavaScript braucht, um ihren Inhalt zu rendern. Für Token-basierte Captchas ist der Middleware-Ansatz schlanker und schneller als ein Browser pro Request.
Wo sollte die Middleware sitzen?
Nach der Proxy-Middleware und vor der Retry-Middleware, damit sie den verwendeten Proxy sieht und ihre eigenen Wiederholungen nicht doppelt gezählt werden.
Wie vermeide ich, für wiederholte Lösungen zu zahlen?
Behalten Sie Cookies zwischen Requests und drosseln Sie den Crawl. Eine freigegebene Sitzung bleibt oft über viele Seiten frei, und berechnet werden nur erfolgreiche Lösungen.
Hilfreiche Anleitungen
Bereit zum Loslegen?
Starten Sie mit einer kostenlosen 3-tägigen Testphase und zahlen Sie danach pro erfolgreicher Lösung, wenn Ihr Traffic wächst. Für die Testphase ist keine Karte nötig.