Sem KYC — sem ID, sem selfie, sem documentos. Pague com cripto: BTC, USDT, USDC, ETH, SOL, LTC
Idioma: Português
Comece agora

Guia · crawl responsável · 2026

403, 429 e CAPTCHAs: responda, não evade

Um 403, um 429 ou um CAPTCHA é o site falando com seu crawler. A resposta certa quase sempre é desacelerar, ler as regras ou perguntar; a errada é disfarçar o crawler. Veja como construir a resposta certa no código.

Última atualização: · 6 min de leitura

Resposta rápida

Como um scraper deve lidar com respostas 403, 429 e CAPTCHA?

Trate-os como sinais, não obstáculos. Em um 429, espere Retry-After e reduza sua taxa naquele host. Em um 403, tente novamente uma vez após uma pausa, depois pare e verifique as regras do site. Em um CAPTCHA, pare aquele host: não resolva automaticamente. CrawlRelay proxies residenciais, a partir de US$ 0,50/GB, distribuem a carga e definem a localização; eles não são um jeito de burlar a decisão do site. Sem KYC. Pague com cripto.

Os três sinais em resumo

429 Muitas SolicitaçõesVocê está rápido demais. Respeite Retry-After, recue, reduza concorrência por host
403 ForbiddenEssa requisição foi recusada. Tente uma vez após a pausa, depois pare e revise
Página de CAPTCHA ou desafioO site quer saber se você é humano. Pare o host e desacelere
Padrão para regras de crawlrobots.txt, RFC 9309; Crawl-delay é uma extensão comum
O que não suportamosSolução de CAPTCHA, plugins furtivos, falsificação de fingerprint

O que cada sinal está dizendo para meu crawler?

  • 429 é o mais educado: o conteúdo está disponível, mas não na sua velocidade. RFC 6585 define isso, geralmente com cabeçalho Retry-After dizendo quando retornar.
  • 403 é uma recusa dessa requisição. Pode ser corrigível (país errado, cabeçalhos ausentes, muito rápido) ou final (o site não permite acesso automatizado a esse conteúdo).
  • Um CAPTCHA ou página de desafio, frequentemente com status 403 ou 503, significa que o gerenciamento de bots do site duvida do seu tráfego. É uma escalada: o passo após ignorar 429s.

Todos os três são sinais crescentes. Sites que veem seus 429s ignorados escalam para 403s e desafios, depois para bloqueios longos em faixas IP, o que prejudica todos os usuários dessas faixas.

O que meu crawler deve fazer para cada sinal?

SinalPrimeira respostaSe continuarPare quando
429Espere Retry-After ou recue exponencialmente com jitterReduza pela metade a concorrência naquele hostRetry-After cresce ou 429s persistem em uma requisição por vez
403Uma tentativa após uma pausa, mesmo paísCompare com um navegador do mesmo país; verifique robots.txt e termosUm segundo 403 no mesmo padrão de URL
CAPTCHA / desafioPausar host por vários minutosRetomar em taxa muito menorDesafio retorna em baixa taxa: site não quer acesso automatizado
503 com Retry-AfterEspere como pedidoPausar hostA maioria das requisições falha por vários minutos

Como construir um crawler que responde corretamente?

Coloque as regras no fetcher, não em cada spider. Este envia uma requisição por vez por host, respeita robots.txt e seu Crawl-delay, espera Retry-After e para de perguntar após três recusas seguidas no host. Trata um 4xx no robots.txt como permissão e um 5xx como disallow total, conforme RFC 9309.

Python: um fetcher educado
import time
import urllib.robotparser
from urllib.parse import urlsplit

import requests

PROXY = "http://USERNAME-country-us:[email protected]:7777"
USER_AGENT = "ExampleCrawler/1.0 (+https://example.com/crawler-info)"


class PoliteFetcher:
    """One request at a time per host; robots.txt, Crawl-delay and Retry-After honoured."""

    def __init__(self, min_interval=1.0, max_refusals=3):
        self.min_interval, self.max_refusals = min_interval, max_refusals
        self.http = requests.Session()
        self.http.proxies = {"http": PROXY, "https": PROXY}
        self.http.headers["User-Agent"] = USER_AGENT
        self.robots, self.next_time, self.refusals = {}, {}, {}

    def _robots(self, root):
        if root not in self.robots:
            rp = urllib.robotparser.RobotFileParser(root + "/robots.txt")
            try:
                r = self.http.get(root + "/robots.txt", timeout=(10, 30))
                if r.status_code >= 500:
                    rp.parse(["User-agent: *", "Disallow: /"])  # unreachable: assume disallow
                else:
                    rp.parse(r.text.splitlines() if r.status_code == 200 else [])  # 4xx: allowed
            except requests.RequestException:
                rp.parse(["User-agent: *", "Disallow: /"])
            self.robots[root] = rp
        return self.robots[root]

    def get(self, url):
        scheme, host = urlsplit(url)[:2]
        if self.refusals.get(host, 0) >= self.max_refusals:
            return None  # this host said no: stop asking
        rp = self._robots("%s://%s" % (scheme, host))
        if not rp.can_fetch(USER_AGENT, url):
            return None
        delay = max(self.min_interval, rp.crawl_delay(USER_AGENT) or 0)
        wait = self.next_time.get(host, 0) - time.monotonic()
        if wait > 0:
            time.sleep(wait)
        r = self.http.get(url, timeout=(10, 30))
        pause = delay
        if r.status_code in (429, 503):
            retry_after = r.headers.get("Retry-After", "")
            pause = max(delay, int(retry_after) if retry_after.isdigit() else 60)
        refused = r.status_code in (403, 429) or "captcha" in r.text[:5000].lower()
        self.refusals[host] = self.refusals.get(host, 0) + 1 if refused else 0
        self.next_time[host] = time.monotonic() + pause
        return r


fetcher = PoliteFetcher()
resp = fetcher.get("https://example.com/")
print(resp.status_code if resp is not None else "skipped")

O que corrige um 403 legitimamente?

Várias causas de 403 podem ser resolvidas do seu lado, e corrigir é justo:

  • País errado. Muitos sites servem uma região. Mire no país correto com -country-<code>.
  • Cabeçalhos incompletos. Envie Accept, Accept-Language e um user agent honesto com URL de contato. User agents tipo navegador em cliente HTTP puro são inconsistentes e frequentemente recusados.
  • Seu ritmo. Um 403 que começa após N requisições indica problema de taxa; desacelere.

O que não é correção: rodar user agents para parecer várias pessoas, falsificar fingerprints ou trocar IPs para fugir de bloqueio proposto pelo site. Se o site filtra faixas de hospedagem para barrar tráfego automatizado, um IP residencial não autoriza esse acesso.

Por que não simplesmente resolver os CAPTCHAs?

Porque um CAPTCHA é o site fazendo uma pergunta à qual você responderia falsamente. Resolver automaticamente transforma um rastreador educado em uma ferramenta criada para burlar um controle de acesso, o que aumenta seu risco legal: os casos nos EUA em 2026 sobre scraping de busca, Google x SerpApi e Reddit x SerpApi e outros, baseiam-se em alegações de que os réus contornaram um sistema anti-bot sob a regra anti-burlar do DMCA. Os tribunais ainda não decidiram a questão, mas o risco é real.

CrawlRelay não suporta a resolução de CAPTCHA nem a evasão de detecção de bots, e sua Política de Uso Aceitável as proíbe pelo gateway. Se você precisa de dados protegidos por um desafio, peça acesso ao site, use a API dele ou licencie os dados.

Quando devo contatar o site em vez disso?

Quando você precisa de mais do que os padrões permitem. Muitos sites oferecem uma API, um feed de dados, um programa de parceiros ou simplesmente um limite maior para um rastreador que se identifique e explique seu propósito. Coloque uma URL de contato no seu user agent, mantenha uma página que descreva seu rastreador e como optar por não participar, e responda rapidamente às denúncias de abuso. Um rastreador que pode ser contatado recebe avisos antes de bloqueios.

403, 429 e CAPTCHAs: perguntas

Proxies residenciais evitam CAPTCHAs?

Não conte com isso. Uma saída residencial muda qual IP o site vê, não o que seu rastreador faz: os CAPTCHAs causados pelo seu ritmo ou comportamento permanecem, e são intencionais. Se os desafios continuam mesmo com uma baixa taxa de requisições, o site não quer acesso automatizado a esse conteúdo.

Quanto tempo devo esperar após um 429 sem Retry-After?

Comece com alguns segundos e dobre a espera a cada novo 429, com um extra aleatório e limite de cerca de um minuto. Quando as solicitações forem bem-sucedidas novamente, retome com uma taxa menor do que a que causou o 429, aumentando lentamente enquanto a taxa de erro permanecer constante.

É permitido rotacionar IPs para evitar limites de taxa?

A rotação distribui a carga entre as saídas e permite escolher localizações, o que é normal. Usar a rotação para ficar abaixo de um limite por IP enquanto mantém uma taxa que o site recusou é evasão. A maioria dos termos de uso proíbe, assim como nossa Política de Uso Aceitável.

Qual user agent meu scraper deve enviar?

O seu próprio: um nome, uma versão e uma URL que explique o rastreador e como contactá-lo, como ExampleCrawler/1.0 (+https://example.com/crawler-info). Não use nomes de outros rastreadores como Googlebot ou GPTBot.

Fontes (4)
  1. RFC 9309: Protocolo de Exclusão de Robôs — IETF (2022-09)
  2. RFC 6585: Códigos Adicionais de Status HTTP (429) — IETF (2012-04)
  3. Reddit x SerpApi LLC — Loeb & Loeb (2026-08)
  4. Google x SerpApi: o tribunal aceitou nossa moção para rejeitar — SerpApi (2026-07-21)

Proxies residenciais para rastreadores educados

US$ 1,50 por 1 GB, US$ 0,50/GB a partir de 50 GB.

A partir de US$ 0,50/GB · sem KYC

Comece agora