[Estudo da Madruga] — Desenvolvendo um Scraping com Python e Elasticsearch — Parte 2/3
Continuando com a segunda história da série estudo da madruga, vamos analisar o código html do site do G1, utilizando o shell do Scrapy, definir quais informações iremos coletar, programar nosso spider e efetivamente coletar os primeiros dados. Ficou empolgado?
Sim? Então vamos colocar a mão na massa.
O que queremos?
Queremos coletar a categoria principal das notícias, a url e todo o texto. Simples assim! 😀
Onde encontramos as informações?
Quando você clica em alguma matéria no site do G1, ele exibe uma página padrão para todas as notícias. É nesta página que vamos coletar os dados que queremos.
Como?
Vamos programar nosso spider para acessar a página inicial do G1 http://g1.com.br e a partir desta pagina extrair todas as urls que serão analisadas. Para cada url encontrada o spider ira acessa-la, verificar se existe as informações que queremos e coletar mais urls. Esse processo ficará em looping até que toda a pilha de urls encontradas sejam acessadas.
O código
Vamos seguir a mesma lógica da primeira história da série. Primeiro eu mostro o código e na sequência eu explico.
Quando executamos o comando genspider o Scrapy criou a PrimeiroscrapyItem(), aqui definimos de forma organizada os itens que serão extraídos, dessa forma podemos acessar esses dados de qualquer parte do projeto, fazer o tratamento e armazenandos em banco de dados.
O objetivo principal da técnica de scraping e extrair dados de forma estruturada de origem desestruturadas, por exemplo, páginas web.
Aqui é onde a mágica acontece
Eu adicionei algumas marcações no código para ficar fácil de explicar cada parte do código.
Explicação
[1] Classe que contém as propriedades que iremos extrair
[2] Classe do Scrapy que vamos utilizar. Mais abaixo eu explico com mais detalhe cada uma.
[3] Para cada spider dentro do projeto é definido um nome único. Isso permite configurar vários spiders dentro de um único projeto.
[4] Configurando esse parâmetro informamos para o spider que ele só poderá acessar as páginas desse domínio. Isso é necessário em nosso projeto, pois o nosso spider irá fazer uma busca de links nas páginas analisadas, mas pode ser que contenham link de outros domínios, por exemplo, link de banner de propaganda.
[5] Aqui definimos a url que nosso spider irá iniciar a busca.
[6] SgmlLinkExtractor() é um objeto que tem o propósito de achar urls dentro das páginas acessadas. Podemos definir algumas regras para a extração dos itens através do objeto Rule(). Nós estamos definindo algumas;
- Função de callback que será executada para cada url encontrada
- Follow=True para que além de coletar o conteúdo definido, busque outras urls dentro da pagina acessada.
[7] Função de callback que será executada para todas as urls encontradas
[8] Após acessar a página precisamos navegar entre as tags html até encontrar o tão preciso dado. Podemos fazer isso de várias formas utilizando algumas bibliotecas disponíveis como;
- BeautifulSoup
- lxml
Mas, o Scrapy tem seu próprio mecanismo de extração de dados. HtmlXPathSelector() permite “selecionar” parte do HTML utilizando Xpath.
Xpath é uma linguagem usada para selecionar “nos” XML e pode ser usada com HTML, não é lindo isso. Dito isso, vamos instanciar um objeto da classe HtmlXPathSelector()
[9] Lembra da classe que implementamos dentro do arquivo items.py, então, é aqui que vamos utilizar ela. Vamos instanciamos um objeto chamado item da classe PrimeiroscrapyItem()
[10] Legal, até aqui tudo tranquilo. Agora chegou a hora de coletar os dados efetivamente.
- item[‘url’] = Precisamos saber qual a url que estamos coletando os dados, para fazer isso utilizamos o método “url” do objeto response.
- item[‘categoria’] = Aqui nós temos um problema. Precisamos coletar a categoria principal do site Ex:. Economia, Tecnologia, etc. Mas dentro do HTML não temos um ponto fixo que podemos coletar essa informação, então, a solução mais plausível foi quebrar a string da url e pegar o texto após a barra “g1.globo.com.br/” que sempre será a categoria principal do conteúdo.
- item[‘conteudo’] = Deixei esse por último pois é o mais emocionante. Precisamos também coletar todo o conteúdo da notícia. Usando a linguagem Xpath, vamos navegar até o item e usar uma marcação que contém no HTML, no caso do G1 temos a tag “//article”. Como só queremos os textos, utilizamos a função normalize-space() que irá retirar todas as tags HTML deixando somente os textos. Lindo, não é?
Shell do Scrapy
O shell do Scrapy permite você analisar a sua extração de dados sem precisar rodar todo seu código, isso facilita muito, pois, você pode testar seus Xpath de forma rápida e implementar no seu código só depois que tiver estiver funcionando.
Para executar o Shell é muito simple, veja o código abaixo.
Tente executar o shell para esta pagina.
Quando finalizar a execucao vai aparecer o console do Python, digite o codigo:
- response.xpath(‘normalize-space(//article)’).extract_first()
Ele vai extrair todos os textos da notícia. Esse comando e o mesmo que configuramos no nosso spider.
Veja na próxima história…
Na ultima parte desta história, iremos fazer uma pequena introdução aos conceitos do Elasticsearch, configurar o Scrapy para gravar nossos dados, realizar alguns tratamento de dados e aprender sobre alguns parâmetros bastante úteis para o nosso dia a dia.