Solucionador de captchas para
Scrapy
Resuelve el desafío dentro de la ejecución en lugar de dejar que falle el trabajo. Un ejemplo funcional en Python y las tres cosas que deciden si se acepta tu token.
# 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,
)Qué decide si se acepta el token
- Pasa tu proxy. El token debe generarse detrás de la misma IP de salida que lo envía. En los sistemas que evalúan la sesión esto es obligatorio, no una optimización.
- Usa el mismo user agent. Turnstile y varios sistemas antibot vinculan el token a un user agent. Te devolvemos el que se usó para que puedas reproducirlo exactamente.
- Pídelo tarde. Los tokens caducan en unos 120 segundos. Solicita uno cuando estés listo para enviar.
Bloqueante o con sondeo
El ejemplo usa ?wait=60, así que la llamada devuelve la resolución terminada y tu paso de Scrapy sigue siendo lineal. Si prefieres no mantener una conexión abierta, quita el parámetro, guarda el id devuelto y consulta GET /v1/task/{id} cada cinco segundos. Un token que ya pagaste se puede recuperar durante diez minutos, así que una conexión caída no te hace perder la resolución.
Costo
$0.00598 por cada resolución exitosa de reCAPTCHA v2; las resoluciones fallidas nunca se cobran. Consulta los precios de cada tipo de desafío o la referencia de la API para ver la estructura completa de la solicitud.
Cómo encaja la resolución en Scrapy
Scrapy no tiene navegador, así que el captcha se gestiona en un downloader middleware: detecta el desafío en la respuesta, resuelve y reintenta la petición con el token o la cookie.
- 01Detecta en process_response
Busca un data-sitekey o una página de desafío conocida en el cuerpo de la respuesta.
- 02Resuelve
Llama a la API con la sitekey, response.url y el proxy de request.meta.
- 03Reintenta con el token
Devuelve una FormRequest con el token, o la petición original con la cookie obtenida.
- 04Conserva el cookie jar
Deja que el cookie middleware de Scrapy conserve la sesión validada para las siguientes peticiones.
Cómo meter el token en la página
El middleware añade el token a los datos del formulario o establece la cookie devuelta, y luego devuelve una nueva Request.
Dónde suelen fallar las integraciones
Una llamada HTTP síncrona en un middleware detiene todas las peticiones. Usa un cliente asíncrono o un hilo para la resolución.
Si un middleware de proxy rota la IP en cada petición, fija la IP para el reintento de modo que coincida con la resolución.
Limita los reintentos por URL. Una página que te desafía cada vez te está diciendo que vayas más despacio.
Preguntas frecuentes sobre captchas en Scrapy
¿Puede Scrapy resolver desafíos de JavaScript?
Scrapy no ejecuta JavaScript. Para los desafíos de token solo necesitas la sitekey y la URL; para sistemas que evalúan la sesión, como DataDome, envías la URL del desafío y recibes una cookie que Scrapy puede reutilizar.
¿Debería usar scrapy-playwright en su lugar?
Solo si la página necesita JavaScript para renderizar su contenido. Para captchas basados en tokens, el enfoque con middleware es más ligero y rápido que ejecutar un navegador por petición.
¿Dónde debe ir el middleware?
Después del middleware de proxy y antes del middleware de reintentos, para que vea el proxy que se usará y sus propios reintentos no se cuenten dos veces.
¿Cómo evito pagar por resoluciones repetidas?
Conserva las cookies entre peticiones y regula el ritmo del rastreo. Una sesión validada suele seguir siéndolo durante muchas páginas, y solo se te cobran las resoluciones exitosas.
Guías útiles
¿Listo para construir?
Empieza con una prueba gratuita de 3 días y luego paga por cada resolución exitosa a medida que crece tu tráfico. No necesitas tarjeta para la prueba.