Raspagem Educada Que Ainda Escala: Um Guia de Limitação de Taxa
Martelar um site faz você ser banido; rastrear uma solicitação de cada vez não leva a lugar nenhum. O meio escalável é o ritmo adaptativo por domínio, distribuído em IPs limpos — educado para o site, rápido para você.
Quase metade de todo o tráfego da internet agora é automatizado, e os sites sabem disso. A limitação de taxa é sua primeira e mais básica defesa — um limite de velocidade que decide quanto você pode pegar e quão rápido. A tentação é tratá-la como um obstáculo a ser rompido com força bruta, mas isso faz você ser banido. O erro oposto, rastrear uma solicitação cuidadosa de cada vez, não leva a lugar nenhum em escala. A resposta escalável é raspagem educada: ritme cada alvo como um usuário pesado, mas legítimo, distribuir a carga em IPs limpos e deixar as próprias respostas do site ajustarem sua velocidade. É assim que você se mantém rápido sem se tornar o tráfego que bloqueia todos.
Saiba qual limite você está atingindo
Os servidores contam suas solicitações contra um identificador — geralmente seu IP, às vezes uma chave de API ou conta — em uma janela de tempo, e agem quando você ultrapassa um limite. Os três modelos comuns se comportam de maneira diferente: uma janela fixa conta solicitações por minuto de calendário; um balde de tokens lhe dá um número fixo de tokens (digamos 100 por minuto) e gasta um por solicitação, forçando uma espera quando o balde esvazia; uma janela deslizante conta nos últimos 60 segundos rolantes a qualquer instante. O resultado prático é que um surto é mais perigoso do que um fluxo constante — dez solicitações em um segundo podem disparar um limite que cem distribuídas em um minuto não disparariam.
Os limites também vêm em sabores. Limites suaves são gentis: o servidor desacelera você ou retorna 429 Too Many Requests com um cabeçalho Retry-After dizendo exatamente quanto tempo esperar (o Erro 1015 do Cloudflare é isso). Alguns sites toleram pequenos surtos — permitindo 100 por minuto, mas apenas limitando a 120 — enquanto outros limitam cedo, digamos a 15 por minuto, e apenas bloqueiam rigidamente a 30. Limites rígidos são tetos estritos: uma API que permite 1.000 solicitações por hora bloqueia você completamente uma vez que você excede. Empurre um limite suave repetidamente e ele escala: 429 torna-se 403, depois uma proibição temporária de minutos a horas cuja janela cresce a cada vez que você a dispara, e finalmente uma lista negra permanente do seu IP ou sub-rede inteira.
Leia a resposta, não adivinhe
A maior atualização para um scraper é reagir ao que o servidor lhe diz em vez de disparar uma taxa fixa. Aprenda o vocabulário: 429 significa desacelerar e honrar Retry-After; 403 significa que essa identidade está marcada, então rotacione em vez de tentar novamente; 503 é frequentemente um desafio ou rejeição temporária; e um 200 que retorna uma página CAPTCHA é um bloqueio suave, não um sucesso. Trate cada um de forma diferente. O movimento errado — tentar novamente o mesmo IP queimado em um 403, ou ignorar Retry-After e continuar em um 429 — é o que transforma um aviso suave em uma proibição permanente. Nossos mergulhos profundos em corrigir 429s cobrem o manuseio de respostas em detalhes.
import time, requests
def polite_get(session, url, max_tries=4):
for attempt in range(max_tries):
r = session.get(url, timeout=20)
if r.status_code == 200 and "captcha" not in r.text.lower():
return r
if r.status_code == 429: # obey the server
wait = int(r.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
if r.status_code in (403, 503): # this exit is burned
rotate_ip(session) # fresh IP, then retry
time.sleep(2 ** attempt) # exponential backoff
continue
return r
return None

Orçamento de solicitações por domínio
Um crawler que toca muitos sites nunca deve aplicar uma taxa global a todos eles. Um pequeno blog e um mercado fortalecido toleram cargas muito diferentes, então dê a cada domínio seu próprio orçamento. Um balde de tokens por host é o padrão limpo: atribua uma taxa conservadora por domínio, reabasteça ao longo do tempo e deixe solicitações para diferentes hosts rodarem em paralelo enquanto solicitações para o mesmo host permanecem dentro de seu limite. Comece devagar em um novo alvo e deixe os códigos de resposta dizerem se você pode acelerar.
import time
from collections import defaultdict
class DomainLimiter:
def __init__(self, per_min=30):
self.gap = 60.0 / per_min # min seconds between hits per host
self.last = defaultdict(float)
def wait(self, host):
now = time.time()
delay = self.gap - (now - self.last[host])
if delay > 0:
time.sleep(delay)
self.last[host] = time.time()
# 30 req/min to any single host; different hosts proceed independently
limiter = DomainLimiter(per_min=30)
limiter.wait("example.com")
Distribua a carga para que cada IP permaneça educado
Aqui está o movimento que reconcilia "educado" com "escala": a educação é medida por IP, mas sua taxa de transferência total é a soma em IPs. Se um alvo tolera 30 solicitações por minuto por endereço, um IP limita você a 30 — mas dez IPs limpos, cada um fazendo 30, dão a você 300 por minuto enquanto cada saída individual permanece cortês. Um gateway residencial rotativo faz isso automaticamente, fornecendo um IP fresco por solicitação em mais de 90 milhões de endereços para que nenhuma saída única pareça agressiva. Isso não é um truque para martelar mais forte; é distribuir carga genuína para que nenhum servidor suporte um pico suspeito. Os fundamentos da rotação de IPs estão em o que é rotação de IP e por que é crucial.
Distribua a carga em IPs rotativos limpos
Tome menos, armazene mais, escolha suas horas
A solicitação mais educada é a que você nunca envia. Três hábitos reduzem a carga sem custar dados. Primeiro, armazene agressivamente e use solicitações condicionais — envie If-Modified-Since ou If-None-Match para que uma página inalterada retorne um pequeno 304 em vez do corpo completo, poupando o servidor e sua largura de banda. Segundo, orce a concorrência deliberadamente: um semáforo limitando solicitações em andamento por domínio impede você de estourar acidentalmente. Terceiro, agende trabalhos pesados para as horas de menor movimento do alvo, quando seu tráfego é uma parte menor do deles e menos propenso a disparar um limite. Combinados, esses hábitos podem reduzir pela metade as solicitações que um trabalho precisa — a disciplina por trás de nossa lista de verificação anti-ban.
Mais uma coisa que vale a pena dizer claramente: verifique robots.txt e respeite as expectativas de rastreamento declaradas de um site. A educação não é apenas autopreservação — ser um bom cidadão mantém a web aberta para todos. Nosso guia sobre robots.txt na prática cobre o que ele faz e não faz vincular.

Perguntas frequentes
Como evito a limitação de taxa ao fazer scraping?
Ritme cada domínio com seu próprio orçamento de solicitações, respeite Retry-After em 429s, recue exponencialmente e distribua a carga em um pool rotativo de IPs limpos para que nenhum endereço único pareça agressivo. Adicione cache e solicitações condicionais para enviar menos solicitações no total e agende trabalhos pesados para as horas de menor movimento do alvo.
O que significa HTTP 429 e como devo lidar com isso?
429 Too Many Requests é um limite de taxa suave — o servidor está pedindo para você desacelerar, não banindo você. Leia o cabeçalho Retry-After e espere exatamente esse tempo antes de tentar novamente; se estiver ausente, recue exponencialmente. Nunca ignore e continue martelando, porque 429s repetidos escalam para 403s e depois para proibições temporárias ou permanentes.
Quantas solicitações por minuto são seguras?
Não há um número universal — depende inteiramente do alvo. Um site pequeno pode tolerar apenas algumas solicitações por minuto; um grande, muito mais. Comece de forma conservadora (digamos 20–30 por minuto por IP), fique atento a 429s e ajuste a partir das respostas. Escale a taxa de transferência total adicionando IPs, não aumentando a taxa em um único.
Proxies rotativos são considerados indelicados?
Não quando usados para distribuir carga genuína. A rotação mantém cada IP individual dentro de uma taxa cortês enquanto sua taxa de transferência agregada cresce — o servidor nunca vê um pico suspeito de nenhum endereço. Torna-se indelicado apenas se você usá-lo para exceder o que o site pode razoavelmente lidar no total; ritme o agregado, não apenas a taxa por IP.
Educado e escalável não são opostos. Leia os sinais, respeite Retry-After, orce por domínio, armazene o que puder e distribua o restante em IPs rotativos limpos. Você acaba mais rápido do que o scraper imprudente — porque você é quem nunca é banido.