Criando um web crawler (web crawling) com scrapy
1- Introdução
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.
2- Vamos ao código!
Passo 1- Instale o scrapy em seu computador via PIP ou Conda
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
Resultados
Resolvi criar um exemplo de crawl no site das casas bahia e minerei alguns
eletrodomesticos (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?
Post a Comment