Proxies rotativos para web scraping: configuração e armadilhas
Um proxy rotativo muda o endereço IP pelo qual o seu tráfego sai, seja a cada requisição, seja depois de um intervalo definido. É uma das ferramentas mais comuns no web scraping e uma das mais mal usadas. Rotacionar pouco demais e um único endereço recebe limite de taxa. Rotacionar demais e o tráfego deixa de parecer um visitante. Este guia explica os dois modelos de rotação, mostra uma configuração funcional em Python com novas tentativas para proxies inativos e explica como um campo de proxy se encaixa na resolução de captchas.
Rotação versus sessões fixas
Um serviço de proxy rotativo entrega endereços de duas formas:
- Rotação por requisição. Cada requisição recebe um novo endereço de saída. Isso serve para grandes rastreamentos de muitas páginas não relacionadas, em que nenhuma página precisa da anterior.
- Sessões fixas. Um endereço é mantido por um tempo definido, muitas vezes alguns minutos, ou até você liberá-lo. Isso serve para qualquer coisa que tenha estado: um login, um carrinho de compras, uma lista paginada em que os cookies importam.
Um visitante real mantém um endereço durante toda a visita. As sessões fixas imitam esse comportamento, então costumam ser o padrão melhor quando um site usa cookies ou sessões. Use a rotação por requisição para rastreamento sem estado.
Um pool rotativo básico em Python
O exemplo abaixo mantém um pool de URLs de proxy, roda por eles em sequência e passa para o próximo quando um falha. Guarde as credenciais em variáveis de ambiente, nunca no código-fonte.
import itertools
import os
import requests
# As URLs de proxy vêm do ambiente, por exemplo:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # falha de autenticação no proxy
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # proxy morto ou lento: tente o próximo
raise RuntimeError(f"all attempts failed for {url}: {last_error}")
Dois detalhes importam aqui. Primeiro, um proxy morto deve ser tentado de novo em outro endereço, e não no mesmo. Segundo, uma requisição que falha com erro de autenticação deve parar e ser reportada, em vez de consumir todo o pool.
Monitore a saúde dos proxies
Um rodízio simples continua mandando tráfego para um proxy que começou a falhar. Mantenha uma pontuação simples para cada endereço: conte as falhas recentes e remova o endereço do pool por um período de resfriamento assim que ele ultrapassar um limite. Depois, traga-o de volta e observe-o novamente. Assim, o seu scraper gasta as requisições na parte saudável do pool.
Registre o proxy usado em cada resultado. Quando um site começa a devolver bloqueios, você vai querer saber se a culpa é de um endereço, de uma região ou de todo o pool.
Controle o ritmo do pool
A rotação distribui a carga entre endereços, mas cada endereço ainda tem um limite de taxa. Defina um atraso por endereço e um teto global de requisições por segundo para o pool inteiro. Rotação não é licença para enviar mais tráfego. É uma forma de manter o tráfego de cada endereço dentro de limites razoáveis.
Erros comuns
A maioria dos problemas de rotação vem de alguns hábitos. Trocar o endereço no meio de um login ou de um checkout quebra a sessão e deixa o site desconfiado. Uma resposta 429 é um limite de taxa do site, e não um proxy quebrado, então trocar de endereço e tentar de novo imediatamente só espalha o problema. Trocar o endereço a cada requisição mantendo os mesmos cookies também é inconsistente, já que os cookies foram emitidos para outro visitante. Por fim, um pool que nunca é verificado vai se encher silenciosamente de endereços mortos, e a sua taxa de erro vai subir sem uma causa aparente. Verifique o pool em uma agenda e remova o que falha.
Proxies e resolução de captcha
Algumas tarefas de captcha podem usar o proxy que o seu scraper usa. Você o passa no campo opcional proxy, no formato http://user:pass@host:port, e a resolução acontece pelo mesmo caminho de rede que a requisição da página. Tarefas proxyless ignoram esse campo por completo. Qual escolher depende de o site vincular o captcha ao endereço de rede, e essa troca é explicada em proxy versus resolução sem proxy.
Dois pontos práticos:
- Use o mesmo proxy para a requisição da página e para a resolução do captcha quando o site verifica o endereço. Misturar endereços pode fazer o token falhar.
- Os tokens expiram rápido. Solicite o token logo antes de enviar o formulário, e não muito antes. Veja expiração de token de captcha.
O tipo de captcha ativo na Scarnox hoje é o PopularCaptcha. O guia de PopularCaptcha em Python mostra a requisição e como enviar o token devolvido.
Escolhendo os seus proxies
O tipo de endereço que você rotaciona importa tanto quanto a própria rotação. Endereços de data center são rápidos e baratos por requisição, mas costumam ser pontuados baixo. Endereços residenciais são pontuados melhor e são mais lentos. O guia proxies residenciais vs datacenter compara os dois em profundidade, e o conselho ali vale para o pool que você monta aqui.
Faça scraping com responsabilidade
- Leia o
robots.txte os termos dos sites que você raspa. - Use proxies para distribuir uma carga legítima, e não para contornar uma restrição que o dono definiu.
- Use apenas serviços de proxy cujos endereços sejam obtidos com consentimento. Rotear por dispositivos de pessoas que não concordaram não é aceitável.
- Mantenha as credenciais fora do código e dos logs.
Próximos passos
- Proxies residenciais vs datacenter
- Como não ser bloqueado no scraping
- Proxy versus resolução sem proxy
- Tentativas e tratamento de erros que funcionam em produção
Comece com crédito de teste grátis, sem cartão: crie uma conta e teste o fluxo de PopularCaptcha com o seu próprio proxy. Para as tarifas atuais, veja a página de preços.