Respeitando as regras da Web
Introdução ao robots.txt
O robots.txt é como um manual de instruções que você coloca no seu site para orientar os robôs de busca sobre quais páginas eles podem ou não visitar. Assim, você pode proteger áreas privadas do seu site, como páginas de login ou arquivos confidenciais. Imagine que é como colocar uma placa na porta da sala de um escritório, dizendo "Não perturbe".
Introdução a user-agent
O user-agent é como um cartão de visita para os robôs. Quando um robô visita o seu site, ele se identifica enviando um user-agent, que contém informações sobre ele, como o seu nome e o serviço que ele representa. Isso permite que você personalize as regras do robots.txt para diferentes tipos de robôs.
Interação entre robots.txt e user-agent
A combinação do robots.txt e do user-agent é poderosa. Imagine que você queira permitir que o Googlebot explore todo o seu site, mas bloquear um robô específico que você sabe que causa problemas. Você pode adicionar uma regra no seu robots.txt que diga: "Permita o acesso a todas as páginas para o Googlebot, mas bloqueie o acesso a todas as páginas para o robô X".
Estratégias para contornar o bloqueio
O primeiro passo é analisar o arquivo robots.txt do site que você deseja realizar a raspagem de dados. No caso do Shop Ecommerce o robot.txt tem as seguintes regras:
- O asterisco (*) indica que a regra se aplica a todos os agentes de usuário (ou bots). Isso significa que qualquer bot que visite o site, independentemente de sua identidade, deve seguir as regras especificadas.
- A diretiva
Disallowespecifica quais partes do site não podem ser acessadas pelo bot. No caso dessa regra, está sendo indicado que nenhuma URL que comece com/ecommerce/pode ser acessada.
A combinação das regras especificadas indicam que todos os bots estão proibidos de acessar qualquer URL que comece com /ecommerce/.
Os administradores do site desejam controlar e proteger o acesso a todas as páginas do site ou reduzir a carga no servidor.
Há formas conservadores e menos invasivas de contornar bloqueios, como por exemplo a configuração de user-agent e respeito de regras como acesso as páginas autorizadas.
Você pode explorar outros robots.txt como da Google, OLX e Magazine Luiza.
No caso do site Shop Ecommerce é preciso notar que o mesmo foi criado para fins didáticos e de aprendizagem de Web Scraping. Assim, seu bloqueio é extremo para treinarmos habilidades e estratégias. De forma geral, os sites reais mantém atualizado os robots.txt para garantir que os robôs de busca indexem as páginas corretas e seguindo regras.
Como analisado no robots.txt do Shop Ecommerce, apenas configurar user-agent e respeitar as regras do robots.txt não seria suficiente para conseguirmos acessar e extrair os dados do site.
Portanto, iremos ajustar as configurações do Scrapy de forma gradual e testar (executar a spider) para validarmos até onde precisamos enganar o site para termos o acesso permitido.
Configurando o Scrapy
O arquivo settings.py permite personalização do comportamento dos componentes do Scrapy, incluíndo os próprios spiders. Neste momento, iremos focar nas configurações que se relacionam com a forma como o Scrapy interage com os sites, como simular diferentes navegadores e como a spider vai agir com as regras do robots.txt encontrado no site.
Configurando o user-agent no Scrapy
Ajustaremos configurações do User-Agent para simular diferentes navegadores e assim contornar possíveis bloqueios. Primeiro, vamos analisar qual o user-agent atual do nosso projeto interagindo pelo shell do Scrapy.
- Inicia uma sessão interativa do shell do Scrapy. Uma ferramenta poderosa para testar e depurar a extração de dados de páginas da web.
Agora iremos consultar o user-agent que é enviado quando acessamos o site Shop Ecommerce através da spider.
- Inicia uma sessão interativa do shell do Scrapy. Uma ferramenta poderosa para testar e depurar a extração de dados de páginas da web.
| scrapy shell | |
|---|---|
Ops! Como estamos utilizando as configurações padrão do Scrapy, o user-agent enviado pela spider é o padrão do framework, incluindo a versão do Scrapy utilizada. Dessa forma, o site alvo pode identificar facilmente que a requisição provém de um crawler. Assim, os sites têm a capacidade de bloquear nossas ações de acesso e raspagem de dados.
Vamos contornar essa situação configurando o user-agent do projeto para que a spider se identifique como um usuário comum. Ao simular um acesso via navegador, aumentamos as chances de obter os dados desejados, já que a requisição será semelhante à de um acesso humano.
No arquivo settings.py vamos habilitar USER_AGENT e colocar um valor real.
Esse user-agent diz ao site que a requisição está sendo feita por um navegador Firefox na versão 108.0, através de um sistema operacional Ubuntu Linux de 64 bits.
Vamos executar a spider novamente e analisar se ainda estamos sendo bloqueados.
Como esperado, no contexto deste site, o robots.txt bloqueia qualquer user-agent, e essa medida não foi suficiente para permitir que nosso crawler acessasse o Shop Ecommerce. No entanto, é uma boa prática configurar o user-agent em todo projeto de Scrapy e web scraping.
Ao configurar o user-agent para simular um navegador Chrome, por exemplo, podemos contornar algumas restrições do site que bloqueiam requests de bots. Ao utilizar proxies, podemos distribuir as requisições por diferentes IPs, dificultando o bloqueio da nossa aplicação.
Configuração do robots.txt no Scrapy
Por padrão, o Scrapy respeita as regras definidas no arquivo robots.txt de cada site, verificando-o antes de acessar qualquer página e só faz requisições permitidas por esse arquivo.
Vamos ajustar a configuração do projeto para permitir ao Scrapy ignorar as regras do robots.txt no arquivo settings.py.
Nosso objetivo é extrair os dados sem causar danos ao site. Portanto, iremos fazer outras configurações para mitigar sobrecarga no servidor e simular um comportamento de usuário humano.
Vamos adicionar atraso nas requisições e ajustar dinamicamente a frequência de requisições de acordo com a capacidade de resposta do servidor utilizando a extensão autothrottle do Scrapy.
DOWNLOAD_DELAY = 3 # (1)!
AUTOTHROTTLE_ENABLED = True # (2)!
AUTOTHROTTLE_START_DELAY = 5 # (3)!
AUTOTHROTTLE_MAX_DELAY = 60 # (4)!
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # (5)!
- Define um atraso fixo (em segundos) entre cada requisição ao mesmo domínio/site.
- Habilita extensão autothrottle do Scrapy que ajusta automaticamente a taxa de requisições com base na resposta do servidor, podendo aumentar ou diminuir o atraso entre as requisições a depender da demanda.
- Delay inicial de 5 segundos
- Delay máximo de 60 segundos
- Média de requisições simultâneas
Se as configurações realizadas não fossem suficientes para para contornar o bloqueio de acesso da spider ao site, uma alternativa seria adicionar middlewares personalizados para realizar tarefas específicas, como rotacionar user-agent e os proxies ou lidar com erros de forma mais robusta.
Vamos a mais um teste de execução da nossa spider:
O trecho do log indica que a spider fez uma requisição bem-sucedida para a URL especificada (status 200). Não há erros ou problemas reportados até aqui.
Uhuuu! Agora estamos com tudo pronto para começar a extrair os dados do Shop Ecommerce e desenvolver a lógica da spider.