O que é Web Scraping?

Web Scraping é uma técnica de mineração de dados utilizada para coletar dados de sites da internet. Para exemplificar, imagine que você quer observar a flutuação dos preços dos ventiladores perto da Black Friday. Para isso, você precisa coletar os preços dos ventiladores que são disponibilizados nos sites de lojas de eletrodomésticos em um certo período de tempo. Através dessa técnica, você pode coletar esses dados e fazer sua análise.

HTML

As páginas dos sites são arquivos escritos com HTML, Hypertext Markup Language, que são interpretados pelo navegador e organizadas visualmente para você. A estilização normalmente é feita a partir de CSS, Cascading Style Sheets, mas não será o foco nessa oficina. Para o entendimento de como mineirar dados de uma página Web, é necessário que você saiba o básico de HTML.

HTML, como seu próprio nome diz, é uma línguagem de marcação de hipertexto. Isso quer dizer que, de um modo geral, HTML é um modo de escrita que é sintaticamente distiguível. Cada elemento do HTML é definido por uma tag, e entre ela há o conteúdo do elemento.

<html>
    <body>
        <h1>GEPAC</h1>
        <h2>Grupo de Estudos de Programação Aplicada à Ciência</h2> 
        <table id='tabela-unica'>
            <tr>
              <th>Nome</th>
              <th>Número aleatório, aleatoriamente atribuído</th>
            </tr>
            <tr>
              <td>CJ</td>
              <td>8</td>
            </tr>
            <tr>
              <td>Michael</td>
              <td>96</td>
            </tr>
          </table>
    </body>
</html>

No código acima, há o elemento com identificador ‘tabela-unica’ cujo conteúdo está entre a tag ‘table’.

Fazendo requisições de Páginas Web

Para começar a coletar os dados de uma página, a priori, necessita-se de fazer o download da mesma. Temos uma biblioteca para isso em python.

import requests
url = 'http://www.iftm.edu.br/patrocinio/cursos/tecnico-integrado-presencial/eletronica/' #URL da pagína do IFTM - Campus Patrocínio que contém dados dos professores do curso de eletrônica
html = requests.get(url)
print(html)

Se a saída deste código for ‘<Response [200]>’ quer dizer que a página foi baixada com sucesso. Dependendo da página que deseja baixar, haverá alguns impasses, por isso, aconselho a estudar um pouco mais da biblioteca requests para tratar eventuais erros e diferentes tipos de requests.

print(html.content) #Para visualizar o conteúdo da página baixada

Introdução a BeautifulSoup

BeautifulSoup, sopa bonita, é uma biblioteca python para extração de dados de arquivos HTML e XML. Com ela você consegue facilmente navegar e pesquisar elementos e seus conteúdos.

from bs4 import BeautifulSoup # Importa a biblioteca
soup = BeautifulSoup(html.content, 'html.parser') # Cria objeto BeautifulSoup 
print(soup.prettify()) # Mostra o conteúdo da página baixada com sua identação

Depois que você criou o objeto BeautifulSoup, você consegue navegar no arquivo facilmente.

soup.div
soup.find('tag') 
soup.find('tag', id='id') 
soup.findAll('tag') # Retorna uma lista com todos os elementos com a tag 'tag'
soup.findAll('tag', limit=5) # Retorna uma lista com 5 elementos com a tag 'tag'

Outros tipos de navegação

# Busca os elemento posteriores e anteriores
soup.findNext()
soup.findPrevious()
soup.findAllNext()


# Busca de baixo para cima
soup.find_parent()
soup.find_parents()

# Encontra outros elementos no mesmo nível que o elemento atual
soup.findNextSibling()
soup.findPreviousSibling()

soup.findNextSiblings()
soup.findPreviousSiblings()

Acessando atributos do elemento

tag.getText()
tag.get_text()
tag.attrs.keys() # Retorna lista de atributos da tag

# Acessando o conteúdo do atributo
tag['class'] 
tag.get('class')

Exemplo de utilização

from bs4 import BeautifulSoup
import requests

# Fazendo request da página
url = 'http://www.iftm.edu.br/patrocinio/cursos/tecnico-integrado-presencial/eletronica/corpo-docente/'

html = requests.get(url)
soup = BeautifulSoup(html.content, 'html.parser')

# Buscando e Armazenando dados da página

dados = []
titulo = soup.findAll('h2')[3] # Buscando elemento h2 cujo conteúdo é Corpo Docente

for e in titulo.findNextSiblings(): # Encontra irmãos do título
  dados.append(e.get_text()) # Coleta o conteúdo dos elementos irmãos

for i in range(len(dados)):
  dados[i] = dados[i].replace('\n', '') 

Licença

Este trabalho está licenciado sob a Licença Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional (BY-NC-SA 4.0 internacional) Creative Commons. Para visualizar uma cópia desta licença, visite http://creativecommons.org/licenses/by-nc-sa/4.0/.