Guia para iniciantes de Web Scraping em Python (usando BeautifulSoup)

Traduzido de: Beginner’s guide to Web Scraping in Python (using BeautifulSoup)

Autor: SUNIL RAY

Introdução

A necessidade e a importância de extrair dados a partir da web é cada vez maior e mais clara. Todas as semanas, eu me vejo em situação onde preciso extrair dados da web. Por exemplo, na semana passada nós estávamos pensando em criar um índice de sentimento sobre vários cursos de ciência de dados disponíveis na internet. Isto não só exige descobrir novos cursos, mas também fazer scraping da web para os seus comentários e, em seguida, resumi-los em algumas métricas! Este é um dos problemas / produtos, cuja eficácia depende mais de scraping da web e extração de informações (coleta de dados) do que as técnicas utilizadas para resumir os dados.

Maneiras de extrair informações a partir da web

Existem várias maneiras de extrair informações da web. O uso de APIs são provavelmente a melhor maneira de extrair dados de um site. Quase todos os grandes sites como o Twitter, Facebook, Google, Twitter, StackOverflow fornecem APIs para acessar seus dados de uma forma mais estruturada. Se você pode obter o que você precisa através de uma API, essa é quase sempre a melhor abordagem para se fazer scraping. Isso porque, se você está recebendo o acesso a dados estruturados a partir do fornecedor, por que você iria criar um mecanismo para extrair a mesma informação?

Infelizmente, nem todos os sites oferecem uma API. Alguns fazem isso porque eles não querem que os leitores extraiam informações em grande quantidade de forma estruturada, enquanto outros não oferecem APIs devido à falta de conhecimento técnico. O que você pode fazer nesses casos? Bem, precisamos fazer scraping do site para obter as informações.

Pode haver algumas outras maneiras como feeds RSS, mas são limitadas na utilização e, portanto, eu não estou incluindo-os na discussão aqui.

O que é Web scraping?

Web scraping é uma técnica de software de computador para extrair informação de websites. Esta técnica se concentra principalmente na transformação de dados não estruturados (formato HTML) na web em dados estruturados (banco de dados ou planilha eletrônica).

Você pode executar o scraping da web de várias maneiras, incluindo o uso do Google Docs para quase todas as línguas de programação. Eu usaria Python por conta de sua facilidade e do seu rico ecossistema. Tem uma biblioteca conhecida como ‘BeautifulSoup’ que auxilia esta tarefa. Neste artigo, vou mostrar-lhe a maneira mais fácil de aprender web scraping utilizando programação Python.

Para aqueles de vocês que precisam de um método que não seja um programa para extrair informações de páginas web, recomendo olhar para import.io. Ele fornece uma interface GUI para executar todas as operações básicas de scraping da web. Os hackers podem continuar a ler este artigo!

Bibliotecas exigida para web scraping

Como sabemos, Python é uma linguagem de programação de código aberto. Você pode encontrar muitas bibliotecas para executar uma função. Por isso, é necessário encontrar a melhor biblioteca para usar. Eu prefiro BeautifulSoup (biblioteca de python), uma vez que é fácil e intuitiva para trabalhar. Precisamente, eu vou usar dois módulos Python para scraping de dados:

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

O BeautifulSoup não busca a página web para nós. É por isso que, eu uso urllib2 em combinação com a biblioteca BeautifulSoup.

Python tem várias outras opções para fazer scraping de HTML, além de BeatifulSoup. Aqui estão alguns outros:

Básico – Familiarize-se com HTML (tags)

Durante o scraping da web, lidamos com tags HTML. Assim, devemos ter uma boa compreensão das mesmas. Se você já sabe o básico de HTML, você pode pular esta seção. Abaixo está a sintaxe básica de HTML:

Esta sintaxe tem várias tags, como se explica a seguir:

  1. <DOCTYPE html!>: Documentos HTML devem começar com uma declaração de tipo
  2. O documento HTML está contido entre <html> e </ html>
  3. A parte visível do documento HTML é entre <body> e </ body>
  4. Os títulos HTML são definidos com os <h1> até <h6>
  5. Os parágrafos HTML são definidos com a tag <p>

Outros tags HTML úteis são:

  1. Links HTML são definidos com a tag <a>. Por exemplo: “, <a href=”http://www.test.com”> Este é um link para test.com </a>”
  2. Tabelas HTML são definidos com <table>, cada linha com <tr> e linhas são

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

Se você é novo com tags HTML, eu também recomendo que você consulte o tutorial do HTML da w3schools. Lá você terá uma compreensão clara sobre tags HTML

Scraping de uma página da web usando BeautifulSoup

Aqui, estou fazendo scraping de dados a partir de uma página da Wikipedia. Nosso objetivo final é extrair a lista de estados, capitais e territórios da união na Índia. E alguns detalhes básicos como fundação, capital anterior e outros que formam esta página wikipedia. Vamos aprender isso passo a passo:

  1. Importe as bibliotecas necessárias:
#Importa a biblioteca usada para carregar o website
import urllib2
#Especifica a url
wiki = "https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"
#Carrega o website e retorna o html para a variável 'page'
page = urllib2.urlopen(wiki)
#Importa as funções de Beautiful Soup que vão parsear os dados obtidos do website
from bs4 import BeautifulSoup
#Parseia o html na variável 'page', e armazena em formato Beautiful Soup
soup = BeautifulSoup(page)
  1. Use a função “prettify” para a olhar estrutura aninhada da página HTML

Acima, você pode ver a estrutura dos tags HTML. Isso ajudará você a saber sobre diferentes marcas disponíveis e como você pode manipula-los para extrair informações.

  1. Trabalhe com as tags HTML

a.soup.<tag>: retorna o conteúdo entre a abertura o fechamento da tag, incluindo tag.

In[30]:soup.title
Out[30]:<title>List of state and union territory capitals in India - Wikipedia, the free encyclopedia</title>

b.  soup.<tag>.string: retorna a string contida na tag

In [38]:soup.title.string
Out[38]:u'List of state and union territory capitals in India - Wikipedia, the free encyclopedia'

c. Encontre todos os links dentro das tags <a> de ‘page’:: Sabemos que podemos marcar um link usando tag “<a>”. Então, devemos ir com a opção soup.a para retornar os links disponíveis na página da web. Vamos fazê-lo.

In [40]:soup.a 
Out[40]:<a id="top"></a>

Acima, você pode ver que, temos apenas uma saída. Agora, para extrair todos os links dentro <a>, usaremos find_all().

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

  1. Localize a tabela (table) correta: Como estamos buscando uma tabela para extrair informações sobre capitais, devemos identificar a tabela correta primeiro. Vamos escrever o comando para extrair informações dentro de todas as tags de tabela.
all_tables = soup.find_all('table')

Agora, para identificar a tabela correta, vamos usar o atributo “class” da tabela e usá-lo para filtrar a tabela correta. No Chrome, você pode verificar o nome da classe clicando com botão direito sobre a tabela na própria página da web -> Inspecione elemento -> Copie o nome da classe ou vá até o resultado do comando acima para encontrar o nome de classe da tabela.

  1. Extraia a informação para DataFrame: Aqui, temos que iterar cada linha (tr) e depois atribuir cada elemento da tr (td) a uma variável e fazer append a uma lista. Vamos primeiro olhar para a estrutura HTML da tabela (não vou extrair informações de título da tabela <th>)

Acima, você pode notar que segundo elemento da <tr> está dentro da tag <th> não <td> então precisamos tomar cuidado com isso. Agora, para acessar o valor de cada elemento, vamos usar a opção “find(text = True)” com cada elemento. Vamos ver o código:

#Gera listas
A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
for row in right_table.findAll("tr"):
    cells = row.findAll('td')
    states=row.findAll('th') #To store second column data
    if len(cells)==6: #Only extract table body not heading
        A.append(cells[0].find(text=True))
        B.append(states[0].find(text=True))
        C.append(cells[1].find(text=True))
        D.append(cells[2].find(text=True))
        E.append(cells[3].find(text=True))
        F.append(cells[4].find(text=True))
        G.append(cells[5].find(text=True))
#Importa pandas para converter lista em dataframe
import pandas as pd
df=pd.DataFrame(A,columns=['Number'])
df['State/UT']=B
df['Admin_Capital']=C
df['Legislative_Capital']=D
df['Judiciary_Capital']=E
df['Year_Capital']=F
df['Former_Capital']=G
df

Finalmente, temos os dados em dataframe:

Da mesma forma, você pode executar vários outros tipos de scraping web usando BeautifulSoup. Isto irá reduzir seus esforços manuais para coletar dados de páginas da web. Você também pode olhar para os outros atributos como .parent, .contents, .descendants, .next_sibling, .prev_sibling e vários atributos para navegar usando os nomes de tags. Estes irão ajudá-lo a fazer scraping de páginas da web de forma eficaz.

Mas, por que não apenas usar expressões regulares?

Agora, se você conhece expressões regulares, você pode estar pensando que você pode escrever código usando expressões regular que podem fazer a mesma coisa para você. Eu definitivamente tinha esta pergunta. Na minha experiência com BeautifulSoup e expressões regulares, querendo fazer mesma coisa, eu descobri que:

    • Código escrito em BeautifulSoup é geralmente mais robusto do que o escrito usando expressões regulares.
    • Códigos escritos com expressões regulares precisam ser alterados com as variações de páginas. Mesmo BeautifulSoup precisa de alterações em alguns casos, é só que BeautifulSoup é relativamente melhor.

As expressões regulares são muito mais rápidas do que BeautifulSoup, geralmente por um fator de 100 para retornar o mesmo resultado.

Então, tudo se resume a velocidade vs. robustez do código e não há nenhum vencedor universal aqui. Se a informação que você está procurando pode ser extraída com simples declarações de regex, você deve ir em frente e usá-las. Mas para quase todo trabalho mais complexo, eu geralmente recomendo BeautifulSoup ao invés de regex.

Nota final

Neste artigo, nós vimos métodos de web scraping usando “BeautifulSoup” e “urllib2” em Python. Também vimos o básico de HTML e executamos web scraping passo a passo para resolver um desafio. Eu recomendo que você pratique isso e use o para a extrair dados a partir de páginas da web.


Veja também: