Scarnox · Blog

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:

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:

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

Próximos passos

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.