Uma coleta que funcionava bem começa a devolver 429 Too Many Requests. É o servidor dizendo, sem ambiguidade, que você passou do ritmo aceito. A reação instintiva — tentar de novo na hora, ou trocar de IP — às vezes piora a situação. O primeiro passo é descobrir o que está sendo limitado.
O que o 429 quer dizer
O código 429 indica que o cliente enviou requisições demais num intervalo de tempo. Não é erro do seu código nem queda do site: é um controle de ritmo.
Muitos servidores enviam junto o cabeçalho Retry-After, com o tempo de espera antes da próxima tentativa — em segundos ou como uma data. Quando ele vem, é a informação mais valiosa da resposta.
Primeiro: o limite é por quê?
| O limite é aplicado por | Sinal típico | Proxy ajuda? |
|---|---|---|
| Endereço IP | 429 some ao mudar de rede; outros IPs seguem normais | Sim, distribuindo o volume |
| Conta ou login | 429 acompanha a conta em qualquer rede | Não |
| Chave ou token de API | 429 aparece para a chave, venha de onde vier | Não |
| Janela global do serviço | Todos os clientes recebem 429 no mesmo período | Não |
Um teste rápido: rode a mesma requisição, no mesmo momento, a partir de outra rede. Se lá passa e daqui não, o limite provavelmente é por endereço.
Espera progressiva: o que fazer em qualquer caso
Seja qual for a causa, a coleta precisa reagir ao 429 sem martelar o servidor:
import time, random, requests
def pegar(url, proxies, tentativas=5):
espera = 2
for _ in range(tentativas):
r = requests.get(url, proxies=proxies, timeout=30)
if r.status_code != 429:
return r
retry = r.headers.get("Retry-After")
pausa = int(retry) if retry and retry.isdigit() else espera
time.sleep(pausa + random.uniform(0, 1))
espera *= 2
return r
O que o código faz:
- Respeita o Retry-After quando o servidor informa.
- Sem Retry-After, dobra a espera a cada tentativa.
- Adiciona uma variação aleatória pequena, para várias tarefas não voltarem todas no mesmo instante.
- Para depois de algumas tentativas, em vez de insistir para sempre.
Quando distribuir entre IPs resolve
Se o limite é por endereço, concentrar toda a coleta num único IP é o que gera o 429. Distribuir as requisições entre muitos endereços reduz a taxa em cada um:
- Páginas públicas, sem login → residencial rotativo por GB, que troca o endereço por requisição ou por sessão.
- Destino que aceita IPv6 → lote de IPv6, com a rotação feita pela sua aplicação.
- Destino que aceita datacenter e volume alto → lote de IPv4 MIX.
Mesmo distribuindo, mantenha a espera progressiva: ela protege a coleta quando um endereço específico é limitado.
Quando não troque de IP
- Rotinas logadas. Trocar de IP no meio da sessão faz a conta parecer pular de lugar. Aqui a resposta é fila e espera com IP fixo.
- API com chave. O limite é da chave. Mais IPs só geram mais 429.
- Termos do serviço. Se o site limita coleta em termos de uso ou robots, distribuir IPs para contornar isso não é ajuste técnico. Respeite robots, termos e lei — e a nossa política de uso aceitável.
Cuidado com o consumo
No residencial a cobrança é por GB. Uma coleta que repete requisições por causa do 429 paga pelo tráfego das tentativas. Espera bem feita e requisições mais leves reduzem o custo — os ajustes estão em scraping por GB.
Resumo
- Leia o Retry-After e implemente espera progressiva.
- Descubra se o limite é por IP, conta, chave ou global.
- Só no limite por IP, distribua entre endereços.
- Em rotina logada, IP fixo com fila.
Qual produto usar para cada tipo de coleta, e como escolher entre residencial, IPv6 e datacenter, está em proxy para web scraping.