Web Scraping com Python

Uma maneira de extrair dados da web


Autor: Réulison Silva Publicado em: Abril 22, 2021

A necessidade e importância de extrair dados da Web está se tornando cada vez mais importante. Cada vez mais me encontro em uma situação em que precisamos extrair dados de algum site.

Por exemplo, como eu trabalho com SEO, conseguir links é muito importante. Mas como conseguir links de forma natural e em escala ao mesmo tempo? Para isso eu precisei entrar em contato com centenas de sites, sem perder tempo e usei a técnica de Web Scraping para extrair os emails que continham o domínio de sites onde eu queria links.

Você pode usar essa tecnica até mesmo para encontrar domínios expirados com links em sites com ótimo Domain Authority.

Maneiras de extrair dados da web

Existem várias maneiras de extrair informações da web. O uso de APIs é provavelmente a melhor maneira de extrair dados de um website. Quase todos os grandes sites, como Twitter, Facebook, Google, Twitter e StackOverflow fornecem APIs para acessar seus dados de maneira mais estruturada.

Se você puder obter o que precisa por meio de uma API, quase sempre será a abordagem preferida em relação a extrair dados diretamente da web. Porque se você estiver obtendo acesso a dados estruturados diretamente do provedor através de uma API, não haveria porque se dar ao trabalho de criar um mecanismo para extrair as mesmas informações.

O que é Web Scraping?

Web Scraping é uma técnica de programação que permite extrair informações de páginas da web (websites). Essa técnica foca principalmente na transformação de dados não estruturados (formato HTML) da Web em dados estruturados (Banco de dados, JSON ou Planilha).

Você pode realizar um scraping de várias maneiras, incluindo o uso do Google Docs em quase todas as linguagens de programação. Eu uso o Python por causa de sua facilidade e por ter um vasto suporte para quase tudo o que você imaginar. Tem uma biblioteca conhecida como BeautifulSoup, que ajuda nessa tarefa.

Neste artigo, mostrarei a maneira mais fácil de aprender a usar o web scraping usando a linguagem de programação Python.

Para aqueles de vocês que não são programadores e desejam extrair informações de páginas da web, você também pode optar por sites como import.io. Ele fornece uma interface básica para executar todas as operações básicas de web scraping.

Mas deixo o desafio!

Se você não sabe nada de programação, continue lendo… Vai que a partir de hoje você não se prepara para agregar mais um conhecimento em sua carreira.

Programar é coisa de Deus, lindo demais! ❤

Os hackers podem continuar lendo este artigo! 🤣

Bibliotecas para a web scraping

O Python é uma linguagem de programação de código aberto (open source). Você pode encontrar muitas bibliotecas para executar uma função. Por isso, é necessário encontrar a melhor para fazer o que você precisa. Eu uso o BeautifulSoup (biblioteca python), já que é fácil e intuitivo de trabalhar. Resumindo, vou usar dois módulos do Python para extrair dados:

  • Urllib2: É um módulo Python que pode ser usado para buscar URLs. Ele define funções e classes para ajudar com ações de URL (autenticação básica e compilada, redirecionamentos, cookies, etc). Para mais detalhes, consulte a documentação.
  • BeautifulSoup: É uma ferramenta incrível para extrair informações de uma página da web. Você pode usá-lo para extrair tabelas, listas, parágrafos e também pode colocar filtros para extrair, por exemplo, e-mails de páginas da web. Neste artigo, usaremos a versão mais recente do BeautifulSoup 4. Você pode ver as instruções de instalação em sua documentação.

O BeautifulSoup não busca a URL para nós. É por isso que uso o urllib2 em combinação com a biblioteca BeautifulSoup.

O Python tem várias outras opções para fazer Web Scraping, além do BeatifulSoup. Veja alguns:

Básico: Vamos rever alguns conceitos sobre as Tags do HTML

Para realizamos um Web Scraping precisamos lidar com as tags do HTML. Assim, devemos ter um bom entendimento sobre HTML. Se você já conhece o básico do HTML, pode pular esta seção. Abaixo está um código básico escrito em HTML:

<meta charset="UTF-8">
<title>Document</title>

<!-- Conteúdo -->
<h1>Web Scraping</h1>
<p>Você precisa saber HTML.</p>

Esse código possui várias tags, veja abaixo:

  • <! DOCTYPE html>: documentos HTML devem começar com uma declaração;
  • O código HTML está contido entre <html> e </html>;
  • A parte visível do documento HTML está entre <body> e </body>;
  • Os títulos HTML são definidos com as tags <h1> à </h6>;
  • Os parágrafos HTML são definidos com a tag <p>.

Outras tags HTML úteis são:

Os links HTML são definidos com a tag <a>, por exemplo:

<a href="http://www.test.com">Este é um link para o test.com</a>

Tabelas HTML são definidas com <table>, linha como <tr>, linhas são divididas em colunas com <td> e o cabeçalho das Tabelas são definidas com <th>.

Veja abaixo:

<table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td>
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td>
    <td>94</td>
  </tr>
</table>

A lista HTML começa com <ul> (não ordenado) e <ol> (ordenado). Cada item da lista começa com <li>.

<ol>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ol>
<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

Se você é novato nessas tags HTML, eu também recomendo que você consulte o tutorial de HTML da DevMedia. Isso lhe dará uma compreensão clara sobre tags HTML.

Fazendo um Web Scraping usando o BeautifulSoup

Agora eu estou fazendo um scraping de uma página da Wikipédia. Nosso objetivo é extrair uma informação da lista de capitais dos Estados brasileiros. Vamos aprender como fazer:

1. Importe as bibliotecas necessárias:

#importe a biblioteca usada para consultar uma URL
import urllib.request

#importe as funções BeautifulSoup para analisar os dados retornados do site
from bs4 import BeautifulSoup

#especifique o URL
wiki = "https://pt.wikipedia.org/wiki/Lista_de_capitais_do_Brasil"

#Consulte o site e retorne o html para a variável 'page'
page = urllib.request.urlopen(wiki)

#Parse o html na variável 'page' e armazene-o no formato BeautifulSoup
soup = BeautifulSoup(page, 'html5lib')

Agora temos uma variável, soup, contendo o HTML da página. Aqui é onde podemos começar a codificar a parte que extrai os dados.

O BeautifulSoup pode nos ajudar a entrar nessas camadas e extrair o conteúdo com o find(). Nesse caso, eu pretendo simplesmente extrair uma lista de capitais de Estados do Brasil do Wikipédia, mas agora vamos simplesmente consultar <li class= "toclevel-2 tocsection-26"> para pegar o Rio de Janeiro.

#Insira a tag <li> e adicione sua classe
list_item = soup.find('li', attrs={'class': 'toclevel-2 tocsection-26'})

Depois que selecionarmos a tag, podemos obter os dados obtendo somente seu texto.

#Separe o HTML do texto com o código abaixo
name = list_item.text.strip()
print(name)

Se você não é programador e não possui o Python instalado em sua máquina você pode testar tudo aqui no Shell Online do Python.

import urllib.request
from bs4 import BeautifulSoup

wiki = 'https://pt.wikipedia.org/wiki/Lista_de_capitais_do_Brasil'
page = urllib.request.urlopen(wiki)
soup = BeautifulSoup(page, 'html5lib')
list_item = soup.find('li', attrs={'class': 'toclevel-2 tocsection-26'})
name = list_item.text.strip()
print(name)
Resultado do código simples de Web Scraping

2. Use a função “prettify” para ver a estrutura separada da página HTML

Web Scraping print com o método prettify

Acima você pode ver uma estrutura de tags HTML. Isso ajudará você a saber sobre diferentes tags disponíveis e como você pode brincar com elas para extrair informações.

3. Trabalhando com as tags HTML

soup. + Tag HTML: Retorna o conteúdo entre a tag de abertura e de fechamento, incluindo o HTML.

Extraindo a tag title com web scraping

soup.<tag>.string: retorna somente a string dentro de cada tag HTML, sem o HTML.

Extraindo somente a string da tag title com web scraping

Encontra todos os links nas tags <a> da página: sabemos que podemos marcar um link usando a tag </a>. Então, devemos usar o método soup.a para retornar os links da página web. Veja como fazer isso:

Extraindo links com web scraping

Acima, você pode ver que temos apenas uma saída. Agora, para extrair todos os links usaremosfind_all().

Extraindo todos os links da página com web scraping

Acima estamos mostrando todos os links, incluindo títulos, classes e outras informações. Agora, para mostrar apenas os links, precisamos iterar sobre cada tag e, em seguida, retornar o link usando o atributo href com get.

Extraindo a string da tag href com web scraping

Como fazer Web Scraping de uma Tabela?

Primeiramente precisamos encontrar um site que contenha uma tabela com as capitais dos estados brasileiros. Por sorte achei outro site do Wikipédia com uma Tabela. Você vai precisar alterar somente essa parte do código, veja.

Onde havia:

wiki = 'https://pt.wikipedia.org/wiki/Lista_de_capitais_do_Brasil'
page = urllib.request.urlopen(wiki)

Agora vai ser:

wiki = 'https://pt.wikipedia.org/wiki/Lista_de_capitais_do_Brasil_por_%C3%A1rea'
page = urllib.request.urlopen(wiki)

Como estamos buscando uma tabela para extrair informações sobre as capitais dos estados brasileiros, devemos identificar tabela que contém no site da Wikipédia. Vamos escrever o comando para extrair informações em todas as tags da Tabela.

all_table = soup.find_all('table')

Para identificar a tabela correta, usaremos o atributo class da tabela para filtrar a tabela correta. No chrome, você pode verificar o nome da classe clicando com o botão direito do mouse na tabela desejada da página.

Inspecione o elemento > Copie o nome da classe da lista.

table = soup.find('table', class_='wikitable sortable')
Selecionando uma tabela com BeautifulSoup

Agora somos capazes de identificar a tabela certa, mas precisamos filtrar essas informações.

Extraia as informações para um DataFrame: Aqui, precisamos iterar através de cada linha tr e, em seguida, atribuir cada elemento de tr a uma variável e anexá-la a uma lista. Vamos ver primeiro a estrutura HTML da tabela (não vou extrair informações para o cabeçalho da tabela <th>).

Agora, para acessar o valor de cada elemento, usaremos o método find(text=True) para cada elemento. Vamos ver o código:

#gerando a lista em colunas
A=[]
B=[]
C=[]
D=[]
E=[]

for row in table.findAll("tr"): #para tudo que estiver em <tr>
    cells = row.findAll('td') #variável para encontrar <td>
    if len(cells)==5: #número de colunas
        A.append(cells[0].find(text=True)) #iterando sobre cada linha
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))
        D.append(cells[3].find('a').text)
        E.append(cells[4].find(text=True))

Observação: Repare que na Coluna D eu tive que mudar o método, isso foi devido que nessa coluna contém a bandeira da capital img seguida de um link a, tudo isso dentro de um <td>.

Então tive que usar find('a').text para pegar somente o texto do link, que é a informação que eu desejo extrair, onde contém o nome da capital.

#importe o pandas para converter a lista em uma planilha
import pandas as pd

df = pd.DataFrame(index=A, columns=['Posição'])

df['Posição']=A
df['Estado']=B
df['Código/IBGE']=C
df['Capital']=D
df['Área']=E

df

Por fim, temos a nossa Planilha toda organizada.

Planilha gerada com DataFrame

Da mesma forma, você pode executar vários outros tipos de web scraping usando BeautifulSoup. Isso reduzirá seus esforços manuais para coletar dados de websites. Você também pode olhar para os outros atributos como .parent, .contents, .descendants e .next_sibling, .prev_sibling e outros métodos para fazer web scraping usando os nomes das tags.

Mas não posso simplesmente usar expressões regulares?

Código escrito em BeautifulSoup é geralmente mais robusto do que aquele escrito usando expressões regulares. Web Scrapings escritos com expressões regulares precisam ser alterados se houver qualquer alteração na página. Até mesmo o BeautifulSoup precisa, mas em alguns casos é mais simples fazer a alteração com BeautifulSoup. Scraping usando expressões regulares é um pouco mais rápido do que escrever código no BeautifulSoup, mas a diferença é muito pouca.

Neste artigo, examinamos alguns métodos de Web Scraping usando BeautifulSoup e urllib2 em Python. Também vimos um pouco de HTML e executamos um Web Scraping passo a passo, resolvendo alguns desafios. Se você é um Analista de SEO, assim como eu, sugiro estudar um pouco tema.

Existem centenas de Ferramentas de Big Data que usam Web Scraping para coletar e cruzar centenas de informações da Internet todos os dias, e todo esse poder fica nas mãos do programadores que fazem isso acontecer, mas esses mesmos não procuram aprender sobre Marketing e Métricas de Negócio.

Um cara sabe desenvolver a ferramenta, o outro sabe usar a ferramenta e mais um outro que sabe analisar os dados e transformar isso em ações de negócio.

Sabe! É aquela piada de quantas pessoas são necessárias para trocar uma lâmpada!

Eu sempre penso:

Porque tenho que ser especialista em somente uma área, porque não posso aprender disciplinas diferentes? Por que não posso ser especialista em 2 ou três áreas diferentes?

Grandes mentes da época do Renascimento eram especialistas em 4 ou 5 áreas diferentes. Nem vou falar de Leonardo Da Vinci por aqui, que era de humanas e exatas.

Mas então, gostou do artigo?

Deixei o código completo no meu Github, só copiar e testar.

Aqui eu só quis explicar um pouco sobre Web Scraping para dar base a esse próximo artigo. Deixe nos comentários o que você achou.