Solucionador de captcha para
Scrapy
Resolva o desafio dentro da execução em vez de deixar o job falhar. Um exemplo funcional em Python e os três fatores que decidem se o seu token é aceito.
# 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,
)O que decide se o token é aceito
- Repasse seu proxy. O token deve ser gerado por trás do mesmo IP de saída que o envia. Em sistemas que avaliam a sessão, isso é obrigatório, não uma otimização.
- Use o mesmo user agent. O Turnstile e vários sistemas anti-bot vinculam o token a um user agent. Retornamos o que foi usado para que você possa reutilizá-lo exatamente.
- Solicite no último momento. Os tokens expiram em cerca de 120 segundos. Peça um quando estiver pronto para enviar.
Bloqueante ou polling
O exemplo usa ?wait=60, então a chamada retorna a resolução pronta e a sua etapa no Scrapy continua linear. Se você preferir não manter uma conexão aberta, remova o parâmetro, guarde o id retornado e faça polling em GET /v1/task/{id} a cada cinco segundos. Um token pelo qual você já pagou continua disponível por dez minutos, então uma conexão perdida não faz você perder a resolução.
Custo
$0.00598 por resolução bem-sucedida de reCAPTCHA v2, e resoluções que falham nunca são cobradas. Veja os preços de todos os tipos de desafio ou a referência da API para o formato completo da requisição.
Como a resolução se encaixa no Scrapy
O Scrapy não tem navegador, então o captcha é tratado em um downloader middleware: detecte o desafio na resposta, resolva e repita a requisição com o token ou o cookie.
- 01Detecte em process_response
Procure um data-sitekey ou uma página de desafio conhecida no corpo da resposta.
- 02Resolva
Chame a API com a sitekey, response.url e o proxy de request.meta.
- 03Repita com o token
Retorne uma FormRequest com o token, ou a requisição original com o cookie resolvido.
- 04Mantenha o cookie jar
Deixe o middleware de cookies do Scrapy manter a sessão liberada para as próximas requisições.
Colocando o token na página
O middleware adiciona o token aos dados do formulário ou define o cookie retornado e, em seguida, retorna uma nova Request.
Onde as integrações costumam dar errado
Uma chamada HTTP síncrona em um middleware trava todas as requisições. Use um cliente assíncrono ou uma thread para a resolução.
Se um middleware de proxy alterna IPs a cada requisição, fixe o IP na nova tentativa para que ele corresponda ao da resolução.
Limite as retentativas por URL. Uma página que apresenta desafio toda vez está dizendo para você desacelerar.
Perguntas frequentes sobre captcha no Scrapy
O Scrapy consegue resolver desafios em JavaScript?
O Scrapy não executa JavaScript. Para desafios baseados em token, você só precisa da sitekey e da URL; para sistemas que avaliam a sessão, como o DataDome, você envia a URL do desafio e recebe um cookie que o Scrapy pode reutilizar.
Devo usar o scrapy-playwright?
Só se a página precisar de JavaScript para renderizar o conteúdo. Para captchas baseados em token, a abordagem com middleware é mais leve e mais rápida do que rodar um navegador por requisição.
Onde o middleware deve ficar?
Depois do middleware de proxy e antes do middleware de retry, para que ele veja o proxy que será usado e suas próprias retentativas não sejam contadas em dobro.
Como evitar pagar por resoluções repetidas?
Mantenha os cookies entre requisições e controle o ritmo do crawl. Uma sessão liberada costuma continuar liberada por muitas páginas, e você só paga por resoluções bem-sucedidas.
Guias que ajudam
Pronto para começar?
Comece com um teste grátis de 3 dias e depois pague por resolução bem-sucedida conforme seu tráfego cresce. Não é preciso cartão para o teste.