[Estudo da Madruga] — Desenvolvendo um Scraping com Python e Elasticsearch — Parte 2/3

Vinicius Gasparini
Vinicius Gasparini
Published in
5 min readMar 13, 2018

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.

Mão no Massa… trocadilho sem graça! 😝

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.

Categoria principal da matéria
Texto da matéria

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.

Arquivo items.py

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.

Parece a tela da matrix

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.

--

--