Quase todo framework de scraping permite configurar um proxy. Bem menos deles gerenciam os proxies para você: fazendo a rotação, aposentando os bloqueados e mantendo uma sessão em um único IP. Se você usa proxies residenciais, saber qual parte o framework cuida e qual parte o gateway cuida economiza muito código de ligação.
Este guia compara seis ferramentas comuns em três perguntas: como você configura o proxy, se a ferramenta faz a rotação de proxies sozinha e se ela vincula uma sessão a um proxy. Depois mostra a pequena quantidade de código que cada uma precisa por trás de um gateway rotativo.
A resposta curta
| Ferramenta | Linguagem | Como você configura o proxy | Faz rotação sozinha | Vincula uma sessão a um proxy |
|---|---|---|---|---|
| Crawlee | Node.js | ProxyConfiguration | Sim: round robin, função personalizada, camadas | Sim, através do seu pool de sessões |
| Scrapy | Python | request.meta["proxy"] ou variáveis de ambiente | Não, precisa do seu próprio middleware | Não |
| Colly | Go | SetProxy ou SetProxyFunc | Sim: alternador round-robin | Não |
| Playwright | Node.js, Python, Java, .NET | No início ou por contexto de navegador | Não | Por contexto |
| Puppeteer | Node.js | Flag de inicialização ou por contexto de navegador | Não | Por contexto |
| Selenium | Vários | Opção do navegador inteiro | Não | Não |
Crawlee é o único que trata proxies como algo a ser gerenciado em vez de uma configuração. As ferramentas de navegador oferecem isolamento por contexto, que é a base para sessões, mas a lógica de rotação é sua.
Crawlee: proxies como um recurso gerenciado
O ProxyConfiguration do Crawlee recebe uma lista de URLs de proxy e faz a rotação entre elas “de forma round-robin”. Em vez de uma lista, você pode passar uma função que escolhe o proxy para cada requisição. Um terceiro modo, proxies em camadas, começa com a camada mais barata (geralmente nenhum proxy), sobe uma camada quando um site bloqueia o crawler e volta a descer quando a camada inferior volta a funcionar.
A parte que mais importa são as sessões. Quando o crawler roda com seu pool de sessões, cada sessão mantém o mesmo proxy: nas palavras da documentação, chamadas posteriores “com o mesmo sessionId sempre retornarão a mesma proxyUrl”. Quando o Crawlee decide que uma sessão está bloqueada, ele a aposenta, e a próxima sessão recebe um proxy diferente. Os cookies seguem a sessão, então o IP e os cookies permanecem juntos.
Scrapy: um proxy por requisição, a rotação é sua
O HttpProxyMiddleware do Scrapy lê o proxy de request.meta["proxy"], e recorre às variáveis de ambiente http_proxy e https_proxy. As credenciais podem ficar na URL, como em http://username:password@host:port. Isso é tudo o que ele faz. Escolher um proxy diferente por requisição, perceber bloqueios e descansar proxies mortos ficam por sua conta ou de uma extensão como o scrapy-rotating-proxies, que lê uma lista de proxies e trata respostas não-200 ou vazias como bloqueios por padrão.
Nosso guia de integração com Scrapy cobre a configuração básica, e o post sobre rotação de proxies residenciais no Scrapy aprofunda o assunto do middleware.
Colly: um alternador round-robin simples
Colly, o framework em Go, tem o SetProxy para um único proxy e o SetProxyFunc para uma função que escolhe um por requisição. Seu pacote proxy inclui o RoundRobinProxySwitcher, que “faz a rotação de ProxyURLs a cada requisição” e aceita URLs http, https e socks5. Não há conceito de sessão: se duas requisições precisam compartilhar um IP, você decide isso na sua própria função.
Playwright e Puppeteer: isolamento por contexto
As ferramentas de automação de navegador não fazem rotação de nada, mas permitem que cada contexto de navegador use seu próprio proxy, o que é como você executa muitas sessões separadas em um único navegador.
- Playwright recebe uma opção
proxycomserver,usernameepassword, tanto no início para o navegador inteiro quanto emnewContext()para um único contexto. Veja nosso guia de integração com Playwright para a configuração completa. - Puppeteer configura um proxy com a flag de inicialização
--proxy-server, ou por contexto comcreateBrowserContext({ proxyServer }). Nenhum dos dois recebe credenciais: você responde ao desafio de login do proxy compage.authenticate().
Dê a cada contexto sua própria sessão e você terá um IP e um conjunto de cookies por contexto, que é o que um fluxo com login exige.
Selenium: o navegador inteiro, e desajeitado com senhas
Selenium configura o proxy através de opções do navegador, então ele se aplica ao navegador inteiro. Com o Chrome, o caminho usual é o switch --proxy-server, que não tem espaço para um nome de usuário e senha. As soluções alternativas comuns são uma pequena extensão de navegador que responde ao desafio de login, ou um proxy de encaminhamento local sem senha que repassa o tráfego ao seu provedor com credenciais. Selenium Wire, antes a solução popular, foi arquivado em 3 de janeiro de 2024 e não é mais mantido.
O que um gateway rotativo muda
A rotação dos frameworks foi pensada para listas de proxies: uma centena de pares IP:porta que você percorre, testa e aposenta. Um gateway rotativo residencial funciona de forma diferente. Você se conecta a um único host e porta, e o gateway escolhe o IP de saída. Isso tira a maior parte do trabalho do seu código:
- A rotação acontece no gateway, então uma única URL de proxy já é suficiente. Uma lista round-robin de uma única entrada é apenas uma configuração.
- As sessões são solicitadas no nome de usuário. Com Shifter você adiciona
sid-<id>para manter um IP de saída fixo ettl-<seconds>para dizer por quanto tempo mantê-lo, como explicado em proxies estáticos vs rotativos. - A localização também faz parte do nome de usuário, então um crawler pode direcionar para um país ou cidade por requisição sem uma segunda lista de proxies.
Assim, o trabalho do framework se reduz a uma coisa: mapear sua própria ideia de sessão para o ID de sessão no nome de usuário do proxy.
Montando a solução
Crawlee. Passe uma função que monta o nome de usuário a partir do ID de sessão do Crawlee. IDs de sessão podem conter caracteres como underscores, então mantenha apenas letras e dígitos:
import { CheerioCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
newUrlFunction: (sessionId) => {
const sid = sessionId
? `-sid-${String(sessionId).replace(/[^a-zA-Z0-9]/g, '')}-ttl-600`
: '';
return `http://customer-USERNAME${sid}:PASSWORD@p.shifter.io:443`;
},
});
const crawler = new CheerioCrawler({
proxyConfiguration,
useSessionPool: true,
persistCookiesPerSession: true,
async requestHandler({ request, $ }) {
console.log(request.url, $('title').text());
},
});
await crawler.run(['https://example.com/']);
Quando o Crawlee aposenta uma sessão bloqueada, o próximo ID de sessão gera por conta própria um novo IP fixo.
Scrapy. Um pequeno middleware de download configura o proxy antes do próprio middleware de proxy do Scrapy rodar. Requisições que carregam um valor session em meta compartilham um IP; as demais fazem rotação:
# middlewares.py
class GatewayProxyMiddleware:
def process_request(self, request, spider):
sid = request.meta.get("session")
user = "customer-USERNAME"
if sid:
user += f"-sid-{sid}-ttl-600"
request.meta["proxy"] = f"http://{user}:PASSWORD@p.shifter.io:443"
# settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.GatewayProxyMiddleware": 350,
}
Playwright. Um contexto por sessão:
const context = await browser.newContext({
proxy: {
server: 'http://p.shifter.io:443',
username: 'customer-USERNAME-sid-cart1-ttl-600',
password: 'PASSWORD',
},
});
Qual escolher
Escolha o framework pelo site e pela equipe, não pelos seus recursos de proxy. Crawlee é a escolha mais forte quando você quer bloqueio, sessões e camadas de proxy gerenciados para você em Node.js. Scrapy continua sendo a forma mais rápida de rastrear grandes quantidades de páginas HTML simples em Python, e sua lacuna de proxy é um middleware de dez linhas. Playwright ou Puppeteer são as ferramentas certas quando as páginas precisam de um navegador de verdade, e os contextos oferecem sessões limpas. Selenium também funciona, com mais esforço em torno das credenciais.
Por trás de um gateway rotativo, todos os seis se reduzem ao mesmo padrão: uma única URL de proxy, e um ID de sessão no nome de usuário sempre que as requisições precisarem compartilhar um IP. Para saber mais sobre como colocar isso em prática em um crawler de produção, veja nosso caso de uso de web scraping.
Fontes e referências
- Crawlee, guia de gerenciamento de proxy: crawlee.dev
- Scrapy, referência de middleware de download (HttpProxyMiddleware): docs.scrapy.org
- scrapy-rotating-proxies: github.com
- Colly, pacote proxy: pkg.go.dev
- Playwright, network e HTTP proxy: playwright.dev
- Puppeteer, BrowserContextOptions: pptr.dev
- Repositório do Selenium Wire (arquivado em 3 de janeiro de 2024): github.com