Package: antiblock-scrapy
antiblock-scrapyMecanismos antibloqueios para o Scrapy.FuncionalidadesScrapy já vem com vários recursos antibloqueios que só precisam ser configurados, bem como muitos outros implementados por terceiros (alguns deles listados abaixo).Os recursos implementados foram:Rotacionador de user-agentsRotacionar de IPs via proxy TorInstalaçãoManeira mais fácil:pipinstallantiblock-scrapyInstalação e configuração do TorÉ necessário configurar oTor. Primeiramente, instale-o:sudoapt-getinstalltorPare sua execução para realizar configurações:sudoservicetorstopAbra seu arquivo de configuração como root, disponível em/etc/tor/torrc, por exemplo, usando o nano:sudonano/etc/tor/torrcColoque as linhas abaixo e salve:ControlPort 9051
CookieAuthentication 0Reinicie o Tor:sudoservicetorstartÉ possível verificar o IP de sua máquina e comparar com o do Tor da seguinte forma:Para ver seu IP:curlhttp://icanhazip.com/Para ver o IP do TOR:torifycurlhttp://icanhazip.com/Proxy do Tor não são suportados pelo Scrapy. Para contornar esse problema, é necessário o uso de um intermediário, nesse caso oPrivoxy.O servidor proxy do Tor se encontra, por padrão, no endereço 127.0.0.1:9050Instalação e configuração doPrivoxy:Instalar:sudoaptinstallprivoxyPare sua execução:sudoserviceprivoxystopConfigurá-lo para usar Tor, abra seu arquivo de configuração:sudonano/etc/privoxy/configAdicione as seguintes linhas:forward-socks5t/127.0.0.1:9050.Inicie-o:service privoxy startPor padrão, privoxy executará no endereço 127.0.0.1:8118Teste:torifycurlhttp://icanhazip.com/curl-x127.0.0.1:8118http://icanhazip.com/O IP mostrado nos dois passos acima deve ser o mesmo.Rotação de IPs via TorConfigure o middleware no arquivo de configuração de seu projeto (settings.py):DOWNLOADER_MIDDLEWARES={...,'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':110,'antiblock_scrapy.middlewares.TorProxyMiddleware':100}Habilite o uso da extensão:TOR_IPROTATOR_ENABLED=TrueTOR_IPROTATOR_CHANGE_AFTER=#número de requisições feitas em um mesmo endereço IPPor padrão, um IP poderá ser reutilizado após 10 usos de outros. Esse valor pode ser alterado pela variável TOR_IPROTATOR_ALLOW_REUSE_IP_AFTER, como abaixo:TOR_IPROTATOR_ALLOW_REUSE_IP_AFTER=#Um número grande demais pode tornar mais lento recuperar um novo IP para uso ou nem encontrar. Se o valor for 0, não haverá registro de IPs usados.Rotação de IPs via lista de proxiesRotacionar IPs via Tor pode tornar o processo de coleta lento. Para isso existem ferramentas de terceiros que rotacionam uma lista de proxies dada, possivelmente deixando a coleta mais rápida (em comparação ao Tor), como:https://github.com/xiaowangwindow/scrapy-rotated-proxyhttps://github.com/TeamHG-Memex/scrapy-rotating-proxiesRotação de user-agentsNo arquivo de configuração de seu projeto Scrapy, adicione as seguintes linhas (settings.py):DOWNLOADER_MIDDLEWARES={...,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,'antiblock_scrapy.middlewares.RotateUserAgentMiddleware':500,}Defina a lista de user-agents, ative o módulo e defina um uso mínimo e máximo de cada user-agent (o uso de um user-agent será aleatório entre esses números) (settings.py):USER_AGENTS=['user-agent-1','user-agent-2',...,'user-agent-n']ROTATE_USER_AGENT_ENABLED=TrueMIN_USER_AGENT_USAGE=#uso mínimo de user-agentMAX_USER_AGENT_USAGE=#uso máximo de user-agentÉ possível conferir o user-agent usado no site:https://www.whatismybrowser.com/detect/what-is-my-user-agentAtrasos entre requisiçõesEssa funcionalidade já é disponível por padrão ao Scrapy por meio deDOWNLOAD_DELAY.Por padrão:O valor de DOWNLOAD_DELAY é de 0.25 segundosO tempo entre requisições não é fixo, um valor entre 0.5 * DOWNLOAD_DELAY e 1.5 * DOWNLOAD_DELAY é escolhido entre cada requisiçãoPara alterar o atraso entre requisição, faça (emsettings.py):DOWNLOAD_DELAY=# tem em segundos entre requisiçõesPara forçar que o tempo entre requisições seja fixo, ao contrário do padrão aleatório, faça (emsettings.py):RANDOMIZE_DOWNLOAD_DELAY=FalseAutoThrottleUma opção mais avançada de colocar atrasos entre requisições é oAutoThrottle. Ela alterará a velocidade entre requisições de acordo com a latência de resposta do servidor e a capacidade de processamento da engine de maneira automática.Por padrão, essa configuração está desativada. Mas pode ser ativada por meio do seguinte comando (emsettings.py):AUTOTHROTTLE_ENABLED=TrueÉ necessário definir um delay inicial que será ajustado ao longo das requisições automaticamente. Defina-o por meio do comando abaixo, o default de 5.0 segundos (emsettings.py):AUTOTHROTTLE_START_DELAY=#delay inicialDefina também um delay máximo, o default de 60.0 segundos (emsettings.py):AUTOTHROTTLE_MAX_DELAY=#delay máximoO atraso das próximas requisições será ajustado para um valor respeitando DOWNLOAD_DELAY e AUTOTHROTTLE_MAX_DELAY, levando em conta a média de requisições paralelas enviadas ao servidor que, por padrão, é 1.0. Esse valor pode ser ajustado pelo comando abaixo (emsettings.py):AUTOTHROTTLE_TARGET_CONCURRENCY=#média de requisições concorrentesMais detalhes podem ser encontradosaqui.Gerenciamento de cookiesScrapy já possui mecanismos de gerencialmente de cookies e detalhes podem ser encontradosaqui.Por exemplo, caso possua os cookies de acesso de um site que é necessário login, uma das possíveis abordagens é criar um Spider como o abaixo:importscrapy# Cookies de login di siteCOOKIES=[{},...,{}]classLoginSpider(scrapy.Spider):name='foo'defstart_requests(self):urls=['site-com-login-1','site-com-login-2',...,'site-com-login-n']forurlinurls:yieldscrapy.Request(url='site-que-precisa-login',cookies=COOKIES,callback=self.parse)defparse(self,response):...Outras formas de lidar como cookies como, por exemplo, cada requisição com seu próprio cookie, podem ser feitas usandocookiejar, mais detalhesaqui.Bibliotecas de terceiros permitempersistência de cookiese outros recursos, comoscrapy-cookies.