CaptchaNo
[ INTEGRAÇÃO ]

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.

Scrapy · Python
# 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

  1. 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.
  2. 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.
  3. 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 SE ENCAIXA ]

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.

  1. 01
    Detecte em process_response

    Procure um data-sitekey ou uma página de desafio conhecida no corpo da resposta.

  2. 02
    Resolva

    Chame a API com a sitekey, response.url e o proxy de request.meta.

  3. 03
    Repita com o token

    Retorne uma FormRequest com o token, ou a requisição original com o cookie resolvido.

  4. 04
    Mantenha 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.

[ ARMADILHAS ]

Onde as integrações costumam dar errado

Bloquear o reactor

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.

Rotação de proxy

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.

Loops de retentativa

Limite as retentativas por URL. Uma página que apresenta desafio toda vez está dizendo para você desacelerar.

[ FAQ ]

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.

[ LEIA A SEGUIR ]

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.

Ver nossos planos
Você é um agente de IA? Veja as opções de configuração →