Pular para o conteúdo
Guides 7 min de leitura 1079 visualizações

Configuração de proxy no Scrapy

Configure o Scrapy com middleware de proxy para web scraping eficiente. Rotacione proxies para evitar bloqueios de IP e manter o anonimato. Veja como!

Python Parsing
Configuração de proxy no Scrapy

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 atributo meta['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). O HttpProxyMiddleware padrã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 é simplesmente protocol://host:port.
  • RETRY_TIMES e RETRY_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 o scrapy_user_agents para rotacionar User Agents. Isso ajuda a evitar que seu scraper seja identificado com facilidade. Você precisará instalar o scrapy_user_agents com pip 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ção next() é 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.py está 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.

Atualizado: 19.05.2026
Voltar à categoria

Leia também

Experimente nossos proxies

20,000+ proxies em 100+ países do mundo

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.