Um servidor proxy HTTP atua como intermediário entre seu script de web scraping e o site alvo. Em vez de o seu spider do Scrapy se conectar diretamente ao alvo, ele se conecta ao servidor proxy, que então encaminha a requisição ao alvo. Isso permite mascarar seu endereço IP, contornar restrições geográficas e evitar bloqueios em sites que usam medidas anti-scraping. Este artigo traz um guia prático para configurar e rotacionar proxies usando middleware do Scrapy.
Configurando proxies no Scrapy com middleware
O sistema de middleware do Scrapy oferece uma forma flexível de tratar requisições e respostas. Podemos usar esse sistema para implementar suporte a proxy. O processo envolve criar um middleware personalizado que intercepta as requisições e atribui um servidor proxy a elas.
Criando um middleware de proxy personalizado
Primeiro, crie um novo arquivo Python (por exemplo, proxy_middleware.py) no seu projeto Scrapy. Esse arquivo vai conter o código do seu middleware de proxy personalizado.
import random
class ProxyMiddleware:
def __init__(self, proxies):
self.proxies = proxies
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.getlist('PROXIES'))
def process_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
print(f"Using proxy: {proxy}")
def process_response(self, request, response, spider):
# Opcional: trate os códigos de resposta para tentar novamente com outro proxy
if response.status in [403, 429]:
print(f"Proxy {request.meta['proxy']} blocked, retrying with another proxy.")
return self._retry_request(request, spider)
return response
def _retry_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
new_request = request.copy()
return new_request
Explicação:
__init__(self, proxies): O construtor recebe uma lista de proxies como entrada.from_crawler(cls, crawler): Esse método de classe é usado pelo Scrapy para criar uma instância do middleware. Ele obtém a lista de proxies das configurações do Scrapy.process_request(self, request, spider): Esse método é chamado antes de o Scrapy enviar uma requisição. Ele seleciona aleatoriamente um proxy da lista e o atribui ao atributometa['proxy']da requisição. Isso diz ao Scrapy para usar o proxy especificado nessa requisição.process_response(self, request, response, spider): Esse método permite tratar a resposta recebida do servidor. Aqui, ele verifica códigos de status como 403 (Forbidden) ou 429 (Too Many Requests), que geralmente indicam que o proxy está bloqueado. Se um código de bloqueio for encontrado, a requisição é repetida com um proxy diferente._retry_request(self, request, spider): Esse método cria uma nova requisição com um proxy diferente atribuído.
Configurando as settings do Scrapy
Em seguida, você precisa configurar as settings do Scrapy para habilitar o middleware e fornecer uma lista de proxies. Abra o arquivo settings.py e adicione o seguinte:
# settings.py
# Habilita o ProxyMiddleware
DOWNLOADER_MIDDLEWARES = {
'your_project_name.proxy_middleware.ProxyMiddleware': 350, # Ajuste a prioridade conforme necessário
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, # Desabilita o HttpProxyMiddleware padrão
}
# Lista de proxies
PROXIES = [
'http://user1:[email protected]:8080',
'http://user2:[email protected]:8080',
'http://user3:[email protected]:8080',
'https://user4:[email protected]:8080',
]
# Tente várias vezes, já que proxies falham com frequência
RETRY_TIMES = 10
# Repita na maioria dos códigos de erro, já que proxies falham muito
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408]
# Desabilita o middleware de user agent padrão e usa um personalizado
DOWNLOADER_MIDDLEWARES.update({
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})
# Obedece às regras do robots.txt
ROBOTSTXT_OBEY = False
Explicação:
DOWNLOADER_MIDDLEWARES: Esse dicionário habilita e configura os downloader middlewares. A chave é o caminho para a sua classe de middleware, e o valor é a prioridade do middleware. Números menores indicam prioridade maior (o middleware é executado antes). OHttpProxyMiddlewarepadrão é desabilitado para evitar conflitos com o middleware personalizado.PROXIES: Essa lista contém os servidores proxy que você quer usar. O formato éprotocol://user:password@host:port. É possível usar proxies HTTP e HTTPS. Se não forem necessários usuário e senha, o formato é simplesmenteprotocol://host:port.RETRY_TIMESeRETRY_HTTP_CODES: Essas configurações ajustam o middleware de retry do Scrapy. Como os proxies podem ser instáveis, é boa prática aumentar o número de tentativas e incluir códigos de erro HTTP comuns que possam indicar um problema de proxy.DOWNLOADER_MIDDLEWARES.update(...): Essa parte desabilita o middleware de User Agent padrão e habilita oscrapy_user_agentspara rotacionar User Agents. Isso ajuda a evitar que seu scraper seja identificado com facilidade. Você precisará instalar oscrapy_user_agentscompip install scrapy-user-agents.
Executando o spider
Agora você pode rodar seu spider do Scrapy normalmente. O middleware vai atribuir um proxy a cada requisição automaticamente.
scrapy crawl your_spider_name
Estratégias de rotação de proxies
Rotacionar proxies é essencial para evitar que seu scraper seja bloqueado. Veja algumas estratégias comuns:
- Seleção aleatória: Como implementado no exemplo acima, escolher aleatoriamente um proxy da lista para cada requisição. É a abordagem mais simples, mas pode não ser a mais eficaz.
- Rotação sequencial: Percorrer a lista de proxies em ordem sequencial. Isso é útil quando você quer garantir que cada proxy seja usado o mesmo número de vezes.
- Rotação inteligente: Implementar uma lógica que acompanhe o desempenho de cada proxy e priorize os que estão funcionando bem. Isso pode envolver o monitoramento de tempos de resposta, taxas de erro e outras métricas.
- Uso de uma API de proxy: Utilizar a API de um serviço de proxy que cuide automaticamente da rotação e do gerenciamento. Esses serviços costumam oferecer recursos como geo-targeting e gestão de reputação de endereços IP.
Rotação sequencial de proxies
Veja um exemplo de implementação de rotação sequencial de proxies no seu middleware:
import itertools
class SequentialProxyMiddleware:
def __init__(self, proxies):
self.proxies = itertools.cycle(proxies) # Usa cycle para rotacionar os proxies
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.getlist('PROXIES'))
def process_request(self, request, spider):
proxy = next(self.proxies) # Pega o próximo proxy do ciclo
request.meta['proxy'] = proxy
print(f"Using proxy: {proxy}")
def process_response(self, request, response, spider):
if response.status in [403, 429]:
print(f"Proxy {request.meta['proxy']} blocked, rotating to the next proxy.")
return self._retry_request(request, spider)
return response
def _retry_request(self, request, spider):
proxy = next(self.proxies)
request.meta['proxy'] = proxy
new_request = request.copy()
return new_request
Mudança principal:
itertools.cycle(proxies): Isso cria um iterador que percorre a lista de proxies indefinidamente. A funçãonext()é usada para obter o próximo proxy da sequência.
Lembre-se de atualizar a configuração DOWNLOADER_MIDDLEWARES para apontar para o SequentialProxyMiddleware.
Integração com API de proxy
Integrar-se a uma API de proxy normalmente envolve fazer requisições à API para obter um proxy e tratar a autenticação e as respostas de erro da API. Os detalhes dependem da API escolhida. Muitos provedores de proxy oferecem SDKs em Python para simplificar esse processo.
Tipos de proxy
Veja uma comparação entre os diferentes tipos de proxy:
| Recurso | Proxy HTTP | Proxy HTTPS | Proxy SOCKS |
|---|---|---|---|
| Protocolo | HTTP | HTTPS | SOCKS (várias versões) |
| Criptografia | Sem criptografia entre cliente e proxy | Criptografia entre cliente e proxy | A criptografia depende da versão do SOCKS |
| Casos de uso | Navegação web, scraping de sites HTTP | Navegação web, scraping de sites HTTPS | Uso geral, suporta vários protocolos |
| Anonimato | Pode ser menos anônimo | Pode ser mais anônimo | Pode ser altamente anônimo |
| Configuração | Normalmente configurado no navegador | Normalmente configurado no navegador | Requer cliente ou biblioteca SOCKS |
| URL de exemplo | http://host:port |
https://host:port |
socks5://host:port ou socks4://host:port |
| Autenticação | Autenticação básica (usuário/senha) | Autenticação básica (usuário/senha) | Suporta autenticação por usuário/senha |
Problemas comuns e solução de problemas
- Proxies não funcionam: Verifique se o servidor proxy está online e acessível. Confira as credenciais de autenticação do proxy (usuário e senha). Garanta que o formato do proxy no
settings.pyestá correto. - Proxies bloqueados: Implemente rotação de proxies e considere usar um serviço de proxy com um pool grande de endereços IP. Monitore os códigos de resposta (403, 429) e repita as requisições automaticamente com proxies diferentes.
- Desempenho lento: Escolha proxies geograficamente próximos ao servidor alvo. Teste diferentes provedores de proxy até encontrar um com desempenho confiável.
- Erros de HTTPS: Confirme que seu proxy suporta conexões HTTPS. Alguns proxies HTTP só suportam tráfego HTTP.
- Vazamentos de DNS: Use um proxy SOCKS ou configure seu sistema para usar o servidor DNS do proxy, evitando vazamentos de DNS.
Conclusão
Configurar e rotacionar proxies no Scrapy é essencial para construir scrapers robustos e confiáveis. Usando middleware personalizado, aplicando estratégias de rotação eficazes e entendendo os diferentes tipos de proxy, você reduz bastante o risco de ser bloqueado e melhora o desempenho dos seus projetos de scraping. Lembre-se de monitorar seus proxies continuamente e de adaptar a estratégia conforme necessário para manter a eficiência ideal de scraping.
Lembre-se de testar seus proxies com regularidade e monitorar o desempenho deles para garantir que seu scraper continue funcionando bem. Considere usar um serviço de gerenciamento de proxies para recursos mais avançados e uma administração mais simples.
