Guia do Scrapy · 1 min de leitura

Como usar proxies com Scrapy

Scrapy roteia cada solicitação através de um proxy de uma das três maneiras: uma chave meta por solicitação, uma variável de ambiente ou um middleware de downloader rotativo. Aqui está cada um, com código funcional para proxies autenticados s4m.

Três maneiras de o Scrapy se comunicar com um proxy

Scrapy fornece um HttpProxyMiddleware que está habilitado por padrão. Ele lê o proxy de um dos dois lugares: a chave proxy no dicionário meta de uma requisição, ou as variáveis de ambiente padrão http_proxy / https_proxy. Para um proxy fixo durante toda a raspagem, a variável de ambiente é o caminho mais rápido; para controle e rotação por requisição, defina request.meta["proxy"] você mesmo, geralmente a partir de um middleware de downloader personalizado.

A autenticação é a parte que as pessoas esquecem. O Scrapy não lê USER:PASS@ da URL do proxy como o curl faz — ele espera um cabeçalho Proxy-Authorization. A abordagem limpa é construir esse cabeçalho uma vez e anexá-lo no seu middleware. Proxies s4m se autenticam com USER:PASS contra proxy.s4m.online, HTTP na porta 3128 (a combinação natural para o middleware de proxy HTTP do Scrapy). Para SOCKS5, você deve usar um bridge local de SOCKS para HTTP, mas para a maioria das raspagens, o endpoint HTTP é mais simples. Saiba mais na página do proxy, e veja outros guias de raspagem.

Um middleware de proxy rotativo

Coloque isso em middlewares.py, ative-o em settings.py, e cada solicitação escolhe um proxy do seu pool com o cabeçalho de autenticação correto.

python
# middlewares.py
import base64
import random

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
PROXIES = [f"http://{HOST}:3128"]  # add more endpoints/ports to rotate

class S4mProxyMiddleware:
    def _auth_header(self):
        raw = f"{USER}:{PASS}".encode()
        return b"Basic " + base64.b64encode(raw)

    def process_request(self, request, spider):
        request.meta["proxy"] = random.choice(PROXIES)
        # Scrapy needs the Proxy-Authorization header explicitly:
        request.headers[b"Proxy-Authorization"] = self._auth_header()

# settings.py
DOWNLOADER_MIDDLEWARES = {
    # keep Scrapy's built-in proxy middleware after ours
    "myproject.middlewares.S4mProxyMiddleware": 350,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
CONCURRENT_REQUESTS = 8
DOWNLOAD_DELAY = 0.5
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]

Conecte-o

De um projeto limpo a uma rastreação por proxy.

Adicione o middleware

Cole a classe S4mProxyMiddleware no middlewares.py do seu projeto e substitua USER, PASS e HOST pelas suas credenciais e endpoint do s4m.

Ative nas configurações

Registre-o em DOWNLOADER_MIDDLEWARES com uma prioridade abaixo do HttpProxyMiddleware do Scrapy (um número menor é executado primeiro), para que seu proxy e cabeçalho sejam configurados antes que o middleware embutido seja executado.

Ajuste a cortesia

Defina DOWNLOAD_DELAY e CONCURRENT_REQUESTS para ficar abaixo do limite de taxa do alvo, e habilite RETRY_HTTP_CODES para 429 e 5xx para que bloqueios transitórios sejam tentados novamente automaticamente.

Verifique o IP de saída

Adicione uma primeira solicitação a um ponto final de eco de IP como https://api.ipify.org e registre a resposta para confirmar que sua coleta está realmente saindo pelo proxy.

Rotação, tentativas e honestidade

Para rotação real, coloque vários endpoints em PROXIES e deixe process_request escolher um por solicitação; combine isso com o middleware de retry embutido do Scrapy para que um 429 ou 503 seja refeito em uma nova escolha. Mantenha DOWNLOAD_DELAY diferente de zero e a concorrência modesta — um crawler que desacelera é muito mais difícil de bloquear do que um que corre.

Duas advertências honestas. Primeiro, proxies s4m são datacenter, não residenciais: excelentes para APIs, testes e sites moderadamente defendidos, mas sistemas anti-bot agressivos podem sinalizar faixas de datacenter. Segundo, a rotação não é uma licença para ignorar as regras de um site — leia robots.txt e seus termos. Quando você precisa de uma saída consistente para uma lista de permissões, adicione um IP pessoal dedicado em vez de rotacionar. Verifique saídas e portas com as ferramentas, e prototipe contra a lista de proxies gratuitos antes de comprometer o tráfego.

FAQ

Perguntas, respondidas

Por que o Scrapy não captura meu USER:PASS da URL do proxy?

Ao contrário do curl, o HttpProxyMiddleware do Scrapy não analisa credenciais da URL. Você deve definir um cabeçalho Proxy-Authorization você mesmo — construa um cabeçalho de autenticação básica a partir de USER:PASS como mostrado no exemplo do middleware.

O Scrapy pode usar um proxy SOCKS5?

Não nativamente através do HttpProxyMiddleware, que é orientado a HTTP. Use o endpoint HTTP na porta 3128 para Scrapy, ou execute uma ponte local de SOCKS para HTTP se você precisar especificamente de SOCKS5.

Como faço para rotacionar proxies por solicitação?

Coloque vários pontos de extremidade de proxy em uma lista e escolha um em process_request, definindo request.meta["proxy"] a cada vez. Combine isso com o middleware de retry do Scrapy para que uma solicitação bloqueada tente novamente com uma nova escolha.

Esses são proxies residenciais?

Não. Os proxies s4m são proxies SOCKS5 e HTTP de datacenter autenticados, pagos conforme o uso. Eles atendem à maioria das raspagens, embora alvos fortemente defendidos possam sinalizar faixas de IP de datacenter.

Escale seus crawls Scrapy

Proxies de datacenter autenticados em proxy.s4m.online, pagamento conforme o uso, prontos para rotacionar através de um middleware Scrapy. Adicione um IP dedicado quando um alvo espera uma saída consistente.

As pessoas encontraram esta página pesquisando por

Frases de busca reais que esta página responde — os links abrem a página que as cobre em profundidade.