Configurar proxies no Scrapy é o principal método para contornar o rate limiting baseado em IP e as proteções anti-bot, distribuindo as requisições por um pool de endereços IP únicos. Uma implementação eficaz envolve usar a arquitetura de middleware do Scrapy para injetar as credenciais de proxy no atributo meta de cada objeto Request, garantindo que o servidor alvo perceba o tráfego como vindo de vários usuários distintos, e não de um único crawler.
A Necessidade de Proxies no Web Scraping Moderno
O Scrapy é um framework assíncrono projetado para crawling de alta performance, mas sua velocidade padrão é o seu maior risco diante dos sistemas anti-scraping modernos. Sem uma camada de proxy, um spider do Scrapy consegue facilmente fazer centenas de requisições por minuto a partir de um único endereço IP, disparando bloqueios imediatos de Web Application Firewalls (WAFs) como Cloudflare, Akamai ou DataDome.
Implementar uma estratégia de proxy robusta com um provedor como o GProxy cumpre três funções críticas:
- Rotação de IP: Impede que o servidor alvo identifique um padrão de requisições vindas de uma única origem.
- Geo-targeting: Permite que o spider acesse conteúdo específico de uma região roteando o tráfego por nós de saída em países ou cidades específicos.
- Distribuição de Requisições: Viabiliza maior concorrência ao espalhar a carga, o que é essencial para projetos de extração de dados em larga escala com milhões de URLs.
Para scraping em nível empresarial, contar com proxies gratuitos ou públicos é receita para o fracasso. Esses IPs em geral já estão em blacklists e não oferecem criptografia. Proxies residenciais de alta qualidade da GProxy fornecem a legitimidade de endereços reais atribuídos por ISPs, tornando seu tráfego Scrapy indistinguível do comportamento orgânico de usuários.

Configuração Básica de Proxy no Scrapy
A maneira mais simples de usar um proxy no Scrapy é passar a URL do proxy diretamente no parâmetro meta de um scrapy.Request. O HttpProxyMiddleware nativo do Scrapy (habilitado por padrão) procura a chave proxy nos metadados da requisição.
import scrapy
class SimpleProxySpider(scrapy.Spider):
name = "proxy_spider"
def start_requests(self):
# Formato: http://user:password@proxy_host:proxy_port
proxy_url = "http://username:[email protected]:7000"
urls = ["https://httpbin.org/ip"]
for url in urls:
yield scrapy.Request(
url=url,
callback=self.parse,
meta={'proxy': proxy_url}
)
def parse(self, response):
self.logger.info(f"Response from IP: {response.text}")
Embora esse método funcione para scripts pequenos, ele é ineficiente em projetos de larga escala porque exige gerenciar manualmente a string do proxy dentro da lógica do spider. Isso viola o princípio de separação de responsabilidades, em que o spider deveria cuidar da lógica de parsing enquanto a infraestrutura cuida do roteamento das requisições.
Automatizando a Rotação de Proxies com Middleware Customizado
Para escalar de verdade, mova a lógica de proxy para middlewares.py. Isso permite anexar automaticamente um proxy a cada requisição de saída sem alterar seus spiders. É especialmente útil ao usar os endpoints residenciais rotativos da GProxy, em que um único ponto de entrada cuida da rotação no backend.
Passo 1: Criar o Middleware
No seu projeto Scrapy, abra middlewares.py e defina uma classe para tratar a atribuição do proxy:
class GProxyMiddleware:
def __init__(self, proxy_url):
self.proxy_url = proxy_url
@classmethod
def from_crawler(cls, crawler):
return cls(
proxy_url=crawler.settings.get('GPROXY_URL')
)
def process_request(self, request, spider):
# Define o proxy apenas se ainda não estiver definido
if 'proxy' not in request.meta:
request.meta['proxy'] = self.proxy_url
Passo 2: Atualizar o settings.py
Você precisa habilitar seu middleware customizado e desabilitar o HttpProxyMiddleware padrão se estiver lidando com lógica complexa, embora normalmente seu middleware customizado consiga funcionar junto com ele. Defina a prioridade abaixo de 750 (o padrão do HttpProxyMiddleware) para garantir que ele rode antes.
# settings.py
GPROXY_URL = "http://username:[email protected]:7000"
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.GProxyMiddleware': 400,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
}
Comparando Tipos de Proxy para Spiders do Scrapy
A escolha do tipo de proxy impacta significativamente a taxa de sucesso e o custo-benefício das suas operações de scraping. A tabela a seguir compara as três principais categorias de proxy usadas em ambientes Scrapy.
| Tipo de Proxy | Nível de Anonimato | Velocidade | Custo | Melhor Caso de Uso |
|---|---|---|---|---|
| Datacenter | Médio | Muito Alta | Baixo | Scraping de alta velocidade em sites com segurança básica. |
| Residencial Estático | Alto | Alta | Médio | Manter sessões ou gerenciar contas de redes sociais. |
| Residencial Rotativo | O mais alto | Moderada | Alto | Contornar anti-bot agressivo (Amazon, Google, etc.). |
Para a maioria dos usuários do Scrapy, os Proxies Residenciais Rotativos são o padrão-ouro. Eles fornecem um novo IP de um pool de milhões a cada requisição, tornando estatisticamente impossível que um servidor alvo bana toda a sua operação com base em padrões de IP.

Lidando com Autenticação e Segurança do Proxy
A maioria dos serviços de proxy premium, incluindo o GProxy, exige autenticação. O Scrapy suporta dois métodos principais para isso: Autenticação na URL e Cabeçalhos Proxy-Authorization.
Autenticação na URL
É o método mostrado nos exemplos anteriores: http://user:pass@host:port. É fácil de implementar, mas pode dar problema se sua senha tiver caracteres especiais. Se a senha incluir símbolos como @ ou :, você precisa fazer URL-encode neles.
Autenticação por Cabeçalho
Para uma abordagem mais limpa, especialmente com credenciais complexas, você pode usar o cabeçalho Proxy-Authorization. Isso envolve codificar em Base64 a sua string username:password.
import base64
class SecureProxyMiddleware:
def process_request(self, request, spider):
user_pass = "username:password"
encoded_user_pass = base64.b64encode(user_pass.encode('utf-8')).decode('utf-8')
request.meta['proxy'] = "http://gate.gproxy.com:7000"
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
Estratégias Avançadas: Gerenciamento de Sessão e Retentativas
Ao fazer scraping de sites que exigem login ou um checkout de várias etapas, rotacionar o IP a cada requisição vai quebrar a sessão. Nesses casos, você precisa de "sticky sessions".
Implementando Sticky Sessions
A GProxy permite manter o mesmo IP por um período determinado adicionando um ID de sessão à string do seu usuário (ex.: user-username-session-12345:password). No Scrapy, você pode gerenciar isso associando um ID de sessão a uma instância específica de spider ou a um segmento específico do crawl.
Lidando com Falhas de Proxy
Nenhum pool de proxies é 100% estável. Algumas requisições inevitavelmente vão dar timeout ou retornar erro 502/503. Você deve configurar o middleware de retry do Scrapy para tratar isso com elegância. No seu settings.py, ajuste as configurações de retry para garantir que o spider não desista de uma URL só porque um nó de proxy específico falhou.
RETRY_ENABLED = True
RETRY_TIMES = 5 # Aumente as retentativas para estabilidade do proxy
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]
Quando ocorre uma retentativa, se você estiver usando um endpoint de proxy rotativo, a próxima tentativa passa automaticamente por um IP diferente, o que muitas vezes resolve o problema na hora.
Otimizando a Performance: Concorrência e Delays
Um erro comum é manter as configurações padrão do Scrapy enquanto se usa um pool grande de proxies. Por padrão, o Scrapy limita a concorrência a 16 requisições. Se você tem acesso a um pool residencial massivo da GProxy, pode aumentar esse número com segurança para melhorar a vazão.
- CONCURRENT_REQUESTS: Aumente para 32, 64 ou até 128, dependendo da sua CPU e da banda de rede.
- DOWNLOAD_DELAY: Usando proxies residenciais de alta qualidade, você muitas vezes pode reduzir o
DOWNLOAD_DELAYpara 0 ou um valor bem pequeno (ex.: 0.2), já que a rotação de IP cuida do ritmo "humano". - AUTOTHROTTLE_ENABLED: Habilite para deixar o Scrapy ajustar dinamicamente a velocidade do crawling conforme a latência do proxy e o tempo de resposta do servidor alvo.
# Otimização do settings.py para o GProxy
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_DOMAIN = 50
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 10
Monitorando e Depurando o Tráfego de Proxy
Para garantir que seus proxies estão funcionando como esperado, registre periodicamente o IP de saída. Isso é vital para verificar se a rotação está realmente acontecendo. Você pode criar um simples Spider Signal ou um LogFormatter para acompanhar quais IPs estão sendo usados e suas respectivas taxas de sucesso.
Se você notar uma taxa alta de erros 403 (Forbidden), isso normalmente indica que seu User-Agent ou os cabeçalhos do navegador não batem com o fingerprint esperado pelo servidor, ou que seus proxies estão sendo detectados como IPs de datacenter. Migrar para IPs residenciais da GProxy e usar o pacote scrapy-user-agents para rotacionar cabeçalhos junto com os IPs costuma resolver isso.
Principais Conclusões
Configurar proxies no Scrapy não é só evitar bloqueios; é construir um pipeline de extração de dados resiliente e escalável. Ao mover a lógica de proxy para middlewares e aproveitar pools residenciais de alta qualidade, você aumenta muito a longevidade dos seus scrapers.
- Use Middleware: Nunca deixe proxies hardcoded nos spiders; use
middlewares.pypara uma arquitetura mais limpa e fácil de manter. - Priorize IPs Residenciais: Para qualquer site com ao menos proteção anti-bot básica, os proxies residenciais da GProxy oferecem uma taxa de sucesso muito maior que as alternativas de datacenter.
- Ajuste as Retentativas: Defina
RETRY_TIMESpara pelo menos 5 e inclua os códigos de erro 429 e 503 para aproveitar ao máximo a rotação de IP durante as falhas. - Combine Cabeçalhos com IPs: Sempre rotacione suas strings de User-Agent junto com os proxies para evitar incompatibilidades de fingerprinting que levam a bloqueios instantâneos.
Leia também
Proxies para o A-Parser: configuração para parsing de buscadores
Proxies para Xrumer: quais escolher e como configurar
Proxies para o Key Collector: configuração e rotação
Binom Tracker: configuração de proxy para arbitragem de tráfego
VKDog Pro: auto-posting e grabbing de conteúdo no VK
