Hoje nós vamos criar um web crawler python usando algumas ferramentas (bibliotecas) como o scrapy. Se você já pensou que seria legal poder extrair dados da web para seus projetos de data science, esse post é pra você!
O data science é um dos assuntos mais comentados dentro da ciência da computação, mas como o próprio nome já diz, os dados se tornaram o centro das atenções e estão mais valiosos do que nunca. As bases de dados que antes eram consideradas apenas como repositório e um gasto para as empresas, hoje são fonte de conhecimento e ao serem trabalhadas se tornam-se informações valiosas para os gestores.
Um dos maiores problemas dessa área é obter, tratar (pré-processar) os dados brutos. Isso é muito difícil dado que muitas vezes não existem APIs amigáveis para extração dos dados. Geralmente, as empresas que não querem compartilhar seus dados acabam dificultando a vida das pessoas que desejam obter esses dados para aplicar algoritmos de machine learning.
Nesse contexto, os desenvolvedores produziram abordagens diferentes para obter os dados que precisam realizando o web scrapping (ou web crawling). Essa técnica consiste em configurar spyders que irão visitar as páginas da web e extrair dados. Nesse tutorial vamos mostrar o que você precisa fazer para criar um webcrowler que pega informações de um site e extrai para um arquivo CSV.
Codificando passo a passo um web crawler Python
Passo 1- Instale o scrapy em seu computador via PIP ou Conda
Para criar um web crawler com python, primeiramente você precisa instalar o scrapy em sua máquina via PIP ou Conda. Esses repositórios são os melhores para realizar a instalação. Não deixe de ver também o installation guide dos mantenedores da ferramenta.
// instalando usando o pip
pip install scrapy
// instalando usando o conda
conda install -c conda-forge scrapy
NOTA: caso seu computador precise do Visual Studio build tools, você terá de baixar no site da microsoft e instalar.
Passo 2: Crie o projeto utilizando o scrapy
O scrapy não é apenas uma biblioteca que podemos dar um import e sair usando. Essa ferramenta necessita que seja criada uma estrutura de pastas e arquivos em que você precisará configurar suas spyders para visitar as páginas e extrair os dados. Após instalado você precisa ir até a pasta que você deseja trabalhar e rodar o seguinte comando:
scrapy startproject nomedoprojeto
Ao rodar o comando a ferramenta criará uma pasta contendo arquivos básicos para seu crowler.
Passo 3: crie sua primeira Spyder
Navegue no terminal até a pasta do projeto usando cd nomedoprojeto
scrapy genspyder sp1 dominio.exemplo
Esse comando irá gerar uma “aranha” que realizara o crowl no site.
Passo 4: configurando sua spyder
Para esse passo você precisará dizer a sua spyder onde ela deverá pegar os dados. Veja um exemplo de como realizar isso.
import scrapy
from stackOverflowCrowler.items import StackoverflowcrowlerItem
class Sp1Spider(scrapy.Spider):
name = 'sp1'
allowed_domains = ['dominio.exemplo.com']
start_urls = ['https://dominio.exemplo.com/']
def start_requests(self):
yield scrapy.Request('https://dominio.exemplo.com/questions/11827176/', self.parse)
yield scrapy.Request('https://dominio.exemplo.com/questions/11827175/', self.parse)
yield scrapy.Request('https://dominio.exemplo.com/questions/11827174/', self.parse)
def parse(self, response):
for h1 in response.xpath('//*[@id="question-header"]/h1/a').getall():
yield StackoverflowcrowlerItem(titulo=h1)
for href in response.xpath('//*[@id="question-header"]/h1/a').getall():
yield scrapy.Request(response.urljoin(href), self.parse)
Passo 5: Faça o crawler funcionar
Para fazer seu crowler buscar os dados e salvar tudo em csv utilize o comando:
scrapy crawl sp1 -o YourFileName -t csv
Tá curtindo nossos tutoriais sobre Python? Se liga então nesse aqui no qual eu ensino como você pode chamar o Python dentro do Excel e aproveitar pra integrar os dois mundos!
Resultados do nosso web crawler
Resolvi criar um exemplo de crawl no site das Casas Bahia e minerei alguns Eletrodomésticos (nome, ratings, quantidade de avaliações). Esse exemplo está no nosso repositório no Github. O resultado após a mineração de dados o scrapy forneceu o seguinte resultado:
[
{
"nome":"Refrigerador Consul CRD37EB com Prateleiras Removíveis e Reguláveis Branco - 334L",
"rating":"Avaliação dos usuários: 5",
"numberOfRatings:":"(2505)"
},
{
"nome":"Refrigerador Electrolux DFN41 Frost Free com Painel de Controle Externo 371L - Branco",
"rating":"(2505)",
"numberOfRatings:":"(1309)"
},
{
"nome":"Refrigerador Consul Frost Free CRM39AB Duplex com Prateleiras Altura Flex Branca – 340L",
"rating":"Avaliação dos usuários: 4,5",
"numberOfRatings:":"(1299)"
},
{
"nome":"Refrigerador Brastemp BRM44HB Frost Free com Compartimento para Latas e Long Necks Branco - 375L",
"rating":"(1309)",
"numberOfRatings:":"(1556)"
},
{
"nome":"Refrigerador Electrolux DFX41 Frost Free com Turbo Congelamento 371L - Inox",
"rating":"Avaliação dos usuários: 4,5",
"numberOfRatings:":"(759)"
}
]
Quer ver o meu projeto completo?
Olá Vinicius.
Beleza?
Sou novo no Python e tentei rodar o seu projeto pelas versões que estão no GIT e obtive o seguinte erro.
Exception has occurred: ModuleNotFoundError
No module named ‘casasbahia’
File “/home/menin/prjpython/webcrawler/Web Crawler/casasbahia/casasbahia/spiders/eletro.py”, line 2, in
from casasbahia.items import CasasbahiaItem
Você pode me dar uma dica do que devo estar fazendo errado?
Muito obrigado
Opa, beleza!
Cara, provavelmente ele não está encontrando o path do projeto. Sugiro que você dê uma olhadinha nesse artigo aqui que pode te ajudar.
Mas assim, pra resumir, você precisa indicar para o Python qual é a pasta raiz do projeto. Para isso você precisa setar essa variável chamada PYTHONPATH. Se você estiver usando usando algum editor daora, tipo o Pycharm ou o Spyder eles geralmente já tem uma opção que gerencia esse path.
Veja se consegue encontrar o gerenciador de PYTHONPATH. No Spyder, ele se parece com isso:
Para acessar, clique no ícone com o símbolo do Python, fica na parte superior do editor geralmente.
Obrigado Vinicius.
O problema foi resolvido.
Agora rodando o programa não gera informação no arquivo de saída.
Peço desculpas estar te atrapalhando, mas como são meus primeiros passos na linguagem, estou utilizando o teu exemplo como um excelente ponto de partida.
Será que esse exemplo dos links ainda é válido? Se não for, você poderia me ajudar com essa adequação?
Não custa pedir rsrsrs
Muito Obrigado
Olá!!!
Cara, é muito comum que os sites de grandes empresas mudem constantemente. Provavelmente o exemplo que eu fiz não é mais válido por conta dessas mudanças.
Acho que os passos que eu seguiria seriam:
• veja essa sugestão de vídeo.
• Veja esse → Caso não se dê bem com o inglês.
Abraços