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

> Como lidar com erros 403, 429 e CAPTCHAs ao scrapar: o que cada sinal significa, um crawler Python educado com robots.txt e Retry-After, o que evitar.

- URL: https://crawlrelay.com/pt/guides/403-429-captcha/
- Última atualização: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

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.

**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

| Atributo | Valor |
| --- | --- |
| 429 Muitas Solicitações | Você está rápido demais. Respeite Retry-After, recue, reduza concorrência por host |
| 403 Forbidden | Essa requisição foi recusada. Tente uma vez após a pausa, depois pare e revise |
| Página de CAPTCHA ou desafio | O site quer saber se você é humano. Pare o host e desacelere |
| Padrão para regras de crawl | robots.txt, RFC 9309; Crawl-delay é uma extensão comum |
| O que não suportamos | Soluçã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?

| Sinal | Primeira resposta | Se continuar | Pare quando |
| --- | --- | --- | --- |
| 429 | Espere Retry-After ou recue exponencialmente com jitter | Reduza pela metade a concorrência naquele host | Retry-After cresce ou 429s persistem em uma requisição por vez |
| 403 | Uma tentativa após uma pausa, mesmo país | Compare com um navegador do mesmo país; verifique robots.txt e termos | Um segundo 403 no mesmo padrão de URL |
| CAPTCHA / desafio | Pausar host por vários minutos | Retomar em taxa muito menor | Desafio retorna em baixa taxa: site não quer acesso automatizado |
| 503 com Retry-After | Espere como pedido | Pausar host | A 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*

```python
import time
import urllib.robotparser
from urllib.parse import urlsplit

import requests

PROXY = "http://USERNAME-country-us:PASSWORD@gw.crawlrelay.com: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](https://crawlrelay.com/pt/acceptable-use/) 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

1. [RFC 9309: Protocolo de Exclusão de Robôs](https://www.rfc-editor.org/rfc/rfc9309.html) — IETF (2022-09)
2. [RFC 6585: Códigos Adicionais de Status HTTP (429)](https://www.rfc-editor.org/rfc/rfc6585) — IETF (2012-04)
3. [Reddit x SerpApi LLC](https://www.loeb.com/en/insights/publications/2026/08/reddit-v-serpapi-llc) — Loeb & Loeb (2026-08)
4. [Google x SerpApi: o tribunal aceitou nossa moção para rejeitar](https://serpapi.com/blog/google-v-serpapi-the-court-granted-our-motion-to-dismiss/) — SerpApi (2026-07-21)

**Proxies residenciais para rastreadores educados** US$ 1,50 por 1 GB, US$ 0,50/GB a partir de 50 GB. [Veja os preços](https://crawlrelay.com/pt/pricing/) · [Referência de erros](https://crawlrelay.com/pt/docs/errors/)

---

CrawlRelay: CrawlRelay é um serviço proxy residencial rotativo e proxies móveis 4G/5G para desenvolvedores, para scrapers e pipelines de dados de IA: tráfego pay-as-you-go que não expira a partir de US$ 0,50/GB, pago com cripto, sem upload de documento. Sem KYC — sem ID, sem selfie, sem documentos. Pague com cripto.
