Resposta rápida
O que 429 Too Many Requests significa com um proxy?
429 Too Many Requests significa que o site está limitando sua taxa: você enviou mais requisições do que aceitam por janela de tempo. A solução é enviar menos, não esconder mais. Com proxies residenciais CrawlRelay, respeite o cabeçalho Retry-After, limite a concorrência por host e faça backoff exponencial com jitter aleatório. Rotacionar IPs para exceder limites publicados quebra a maioria dos termos de uso.
429 Too Many Requests de relance
| Erro | 429 Too Many Requests |
|---|---|
| Tipo | Código de status HTTP (4xx, erro do cliente) |
| Enviado por | O site alvo ou seu gateway de API |
| Definido em | RFC 6585, section 4 (Retry-After: RFC 9110, section 10.2.3) |
| Tentar novamente? | Sim, após o intervalo Retry-After ou um backoff exponencial |
| Primeira verificação | Leia o cabeçalho Retry-After e suas requisições por segundo por host |
O que 429 Too Many Requests significa?
RFC 6585 introduziu 429 para limitação de taxa. O servidor pode adicionar um cabeçalho Retry-After, seja um número de segundos ou uma data HTTP, dizendo quando voltar. APIs adicionam cabeçalhos próprios, por exemplo X-RateLimit-Remaining.
Um 429 é a resposta mais educada que um site pode dar a um scraper. Indica que o conteúdo está disponível, só não na velocidade atual. Sites que ignoram seus 429 normalmente escalam para 403, CAPTCHAs ou bloqueios permanentes.
Como a 429 aparece em Python, curl, Node.js e navegadores?
A mesma falha aparece de forma diferente em cada ferramenta. Estas são as mensagens para buscar nos seus logs:
- Python requests / httpx:
status_code == 429, frequentemente comRetry-After: 30 - Scrapy: tratado por
RetryMiddleware, pois 429 está no padrãoRETRY_HTTP_CODES - curl:
HTTP/2 429seguido porretry-after:nos cabeçalhos da resposta - APIs: corpo JSON como
{"error": "rate_limited"}
O que causa a 429?
Mais provável inicialmente:
- Concorrência alta por host. Cinquenta trabalhadores paralelos num domínio parecem ataque para a maioria dos sites.
- Sem atraso entre requisições, ou atraso fixo que sincroniza muitos trabalhadores no mesmo instante.
- Repetições sem backoff. Uma tempestade de tentativas após o primeiro 429 multiplica a carga.
- Limites compartilhados. Alguns sites contam requisições por conta, chave de API ou cookie de sessão, não por IP.
- Pontos finais pesados. URLs de busca e filtro geralmente têm limites mais rígidos que páginas estáticas.
Como diagnosticar a 429 passo a passo?
- Registre o valor de
Retry-Aftere quaisquer cabeçalhos de limitação de taxa no primeiro 429. - Meça sua taxa real de requisições por host, não a total.
- Verifique se o limite segue o IP, cookie ou chave API: altere um por vez.
- Leia a documentação da API ou robots.txt do site; uma linha
Crawl-delayindica o ritmo esperado.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLComo corrigir a 429?
- Respeite Retry-After. Aguarde ao menos o tempo pedido pelo servidor.
- Limite a concorrência por host, não só globalmente. Scrapy tem
CONCURRENT_REQUESTS_PER_DOMAINeAUTOTHROTTLE_ENABLED. - Backoff exponencial com jitter: 1 s, 2 s, 4 s etc., mais uma fração aleatória, com limite máximo.
- Busque menos. Cache respostas, envie
If-Modified-SinceouIf-None-Match, pule páginas sem alteração. - Use a API oficial quando o site oferecer; limites geralmente documentados.
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))Devo tentar novamente após a 429?
Sim, 429 deve ser refeito depois. Aguarde o intervalo Retry-After se o servidor enviar; senão use backoff exponencial com jitter e limite. Conte 429 consecutivos por host e reduza a concorrência quando aumentar. A função Python abaixo faz o básico.
Como 429 Too Many Requests se aplica ao CrawlRelay?
Um 429 passado via CrawlRelay carrega cabeçalhos e corpo do alvo: o limite é do site, .a dosagem por host é sua tarefa. Use sessões sticky se o site contar requisições por sessão, para manter seu ritmo mensurável; veja o guia de concorrência para números iniciais.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS via CONNECT) e porta 7778 (SOCKS5). Formato do usuário: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Relacionado: 403 Forbidden · 503 Service Unavailable · Guia de concorrência.
429 Too Many Requests: perguntas que desenvolvedores fazem
Devo rotacionar IPs para evitar 429?
Não. Um 429 é pedido do site para desacelerar. Espalhar a mesma taxa por mais IPs para driblar limites por IP é evasão, proibida por maioria dos termos de uso. Rotação serve para distribuir carga e localização, não para exceder limites publicados. Reduza sua taxa e use cache.
Quanto tempo devo esperar após um 429?
Espere o número de segundos no cabeçalho Retry-After, ou até a data indicada. Sem cabeçalho, comece com um ou dois segundos e dobre o tempo após cada novo 429, com um extra aleatório e limite próximo a um minuto. Retome com taxa menor, não com a que causou o 429.
Por que recebo 429 com poucas requisições por minuto?
O limite pode ser por conta, cookie ou chave API, não por IP, ou o ponto final pode ser custoso, como página de busca. Alguns sites aplicam limites baixos a clientes classificados como bots. Verifique cabeçalhos de resposta, documentação API e peça acesso ao site se precisar de mais.
Outros erros de proxy nesta referência
Códigos de status HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Erros no navegador e cliente
Erros de conexão e TLS
Proxies residenciais com documentação que cobre os casos de falha
CrawlRelay proxies residenciais a partir de US$ 0,50/GB, tráfego que nunca expira.