Scarnox · Blog

Web scraping e captchas: por que aparecem e o que fazer

Um captcha aparece durante o scraping quando um site decide que uma requisição parece automatizada. Os gatilhos habituais são muitas requisições em pouco tempo, um endereço IP com reputação ruim, sinais de navegador ausentes ou um acesso a uma página que o site protege mais de perto do que o restante. A resposta prática tem três etapas, nesta ordem: reduzir os gatilhos, detectar o captcha no código e resolver o captcha que você não consegue evitar. Este guia cobre cada etapa e aponta para os guias detalhados sobre o restante.

Por que os sites mostram captchas a scrapers

Um site tem pouca forma de diferenciar uma pessoa de um script no momento em que uma página é solicitada, então ele observa padrões. Um scraper costuma se destacar porque:

Qualquer um desses pode bastar. O captcha é a forma que o site tem de pedir uma etapa semelhante à humana antes de servir mais páginas. Reduzir o padrão costuma reduzir os captchas, o que é mais barato do que resolvê-los.

Detecte o captcha no código

Antes de resolver qualquer coisa, verifique se a página que você recebeu é de fato a página de captcha. Um teste simples procura a marcação do widget e lê o sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

As strings h-captcha e g-recaptcha são apenas a marcação que uma página usa, então isso é um sinal, e não uma garantia. Se o sitekey não aparecer, veja como encontrar o sitekey de um captcha.

Resolva quando não puder evitar

Quando um widget PopularCaptcha está na página e você tem o sitekey, você pode pedir um token à API da Scarnox com uma única requisição POST e enviá-lo no campo h-captcha-response. A função completa, com tratamento de erros, está em resolva um captcha em Python com uma requisição. Use o token imediatamente, porque ele expira após cerca de dois minutos. Os detalhes de tempo estão em token de captcha expirado.

O suporte ativo da Scarnox hoje é o PopularCaptcha, sem proxy e com proxy próprio. O reCAPTCHA v2 e v3, o Cloudflare Turnstile, o GeeTest, o AWS WAF e o Arkose estão em breve. Se o seu alvo usa algum deles, os guias de captcha explicam as opções gerais, mas não construa um fluxo de produção sobre uma resolução que ainda não está ativa.

Uma sequência de decisão para cada página bloqueada

Quando o seu scraper encontra um captcha, uma ordem simples de decisão mantém o trabalho honesto e o volume de requisições baixo:

  1. Existe uma fonte de dados que você possa usar no lugar? Se uma API, um feed ou uma exportação cobre os campos de que você precisa, mude para ela e pare de requisitar essa página.
  2. **O robots.txt permite o caminho?** Se não, pule-o. Não resolva um captcha em uma página que você foi solicitado a deixar em paz.
  3. Você enviou muito, muito rápido? Pause por mais tempo, reduza a sua taxa e verifique de novo mais tarde. Muitos captchas somem com um ritmo mais lento.
  4. O captcha é de um tipo ativo? Se for PopularCaptcha, a resolução deste guia se aplica. Se for um tipo que está em breve, mantenha o trabalho pausado e acompanhe o lançamento.
  5. A página é uma que você tem permissão para automatizar? Se a resposta não estiver clara, pergunte ao dono do site antes de continuar.

A quarta etapa é a mais frequentemente pulada. Um solver só é útil quando o tipo de captcha é suportado, e um trabalho que tenta de novo um tipo não suportado desperdiça tempo e requisições.

Trate o captcha dentro de um trabalho, não em um loop

Coloque a resolução dentro do caminho de código que precisa do token, para que o trabalho possa registrar cada captcha, parar quando uma página continua falhando e seguir em frente. Um laço sem limite que fica pedindo a página de captcha é a forma mais rápida de fazer o firewall de um site bloquear o seu endereço para sempre.

Monitore as falhas

Mantenha a contagem de páginas que devolvem um captcha, agrupada por URL e por horário do dia. Um captcha que aparece apenas em uma seção do site, ou apenas depois de um certo número de requisições, mostra onde está o gatilho. Essa informação é mais útil do que um solver mais rápido, porque mostra o que mudar.

O que não fazer

Faça scraping com responsabilidade

Próximos passos