
Compartilhar:
Cory Althoff é defensor de desenvolvedores na Vonage e autor de dois livros: “The Self-Taught Programmer” e “The Self-Taught Computer Scientist”. O site Book Authority considerou “The Self-Taught Programmer” um dos melhores livros de programação de todos os tempos, e o The Next Web o listou como um dos dez livros que ajudarão você a se tornar um engenheiro de software melhor. Cory mora na Região da Baía com sua esposa e filha.
Crie um analisador HTML em Python para extração de dados da web
Tempo de leitura: 10 minutos
A internet contém a coleção de dados mais extensa da história da humanidade.
Todos esses dados estarão à sua disposição se você aprender a criar um web scraper. Um web scraper é um software que coleta dados de páginas da web. É uma ferramenta poderosa que você pode usar para alimentar seus programas com dados.
Por exemplo, você poderia extrair dados de um site de letras de músicas e usá-los para criar uma nuvem de palavras com as 10 músicas mais populares do dia. Ou poderia analisar manchetes e usar o sentimento delas para negociar ações.
Neste tutorial, você aprenderá a extrair dados da web usando Python e o Beautiful Soup (uma biblioteca do Python). Para acompanhar o tutorial, é recomendável ter conhecimentos básicos de programação em Python. Não presumo que você tenha experiência como desenvolvedor web, por isso explicarei todos os conceitos básicos da web necessários para que você consiga acompanhar.
Ao final deste tutorial, você terá um scraper da web em funcionamento que coleta dados de um site. Vamos começar!
Como funciona o web scraping
Quando você acessa um site, seu navegador envia uma solicitação HTTP ao servidor do site, solicitando os recursos de que o navegador precisa para exibir o site. O servidor pode responder com arquivos que contêm HTML, CSS, JavaScript e tudo o mais que o navegador precise para exibir o site. O HTML define a estrutura de um site, o CSS define seu estilo e o JavaScript o torna interativo.
Ao criar um scraper da web, você escreve um código que envia a solicitação HTTP por você e usa os dados para realizar alguma tarefa, sem que você precise acessar o site usando seu navegador. Portanto, um scraper da web:
Envia uma solicitação a um site.
Obtém o código HTML do site.
Procura no código HTML o que precisa.
Utiliza os dados para fazer algo.
Problemas com a extração de dados da web
Embora o web scraping seja útil em muitas situações, ele apresenta alguns problemas. Um deles é que os scrapers de web costumam deixar de funcionar. Os scrapers dependem de que o código HTML de um site permaneça inalterado; portanto, quando um desenvolvedor atualiza um site, isso pode fazer com que seu scraper deixe de funcionar, e você terá que fazer alterações para corrigi-lo.
A extração de dados da web também pode violar os termos de serviço de determinados sites; por isso, é importante ler os termos de serviço de um site antes de extrair dados dele.
Mesmo que um site permita que você extraia dados dele, a extração desses dados ainda acarreta custos para o site (pois você está consumindo seus recursos); portanto, aqui estão algumas recomendações a serem consideradas como melhores práticas ao extrair dados:
Não extraia dados com mais frequência do que o necessário.
Armazene os dados em cache sempre que possível.
Web Scraping x APIs
Antes de criar um scraper da web, talvez seja interessante verificar se a fonte de dados da qual você está extraindo informações possui uma API. Uma API é uma interface de programação de aplicativos, que permite que dois programas se comuniquem entre si. Por exemplo, na Vonage, temos uma SMS API que permite enviar mensagens de SMS por meio de programação. Também temos uma Video API que permite adicionar facilmente streaming de vídeo ao seu site e várias outras APIs de comunicação.
Muitas fontes de dados oferecem APIs que permitem acessar suas informações sem precisar criar um scraper da web. Por exemplo, o IMDB possui uma API que você pode usar para obter as avaliações dos filmes.
Existem várias vantagens em usar a API do IMDB em vez de extrair os dados do site por conta própria.
A primeira é que você não precisa se preocupar em violar os termos de serviço deles. Além disso, é muito mais rápido obter dados por meio de uma API do que por meio de um scraper. Por fim, a API do IMDB é gerenciada por uma equipe de desenvolvedores, então você não precisa se preocupar com a possibilidade de ela deixar de funcionar, como poderia acontecer com um scraper.
O que é HTML?
Antes de prosseguirmos, aqui vai uma breve introdução ao HTML (se você já estiver familiarizado com desenvolvimento web, fique à vontade para pular esta seção). HTML significa “Hypertext Markup Language” (Linguagem de Marcação de Hipertexto) e é uma linguagem de marcação que define a estrutura dos sites. Dê uma olhada neste site:

O site exibe “Exemplo de Domínio” na parte superior como cabeçalho (ou seja, em fonte grande e em negrito). Abaixo de “Exemplo de Domínio”, há um parágrafo de texto seguido por um link.
Aqui está o código HTML deste site.

Como você pode ver, o HTML é composto por tags. As tags instruem o navegador a realizar uma ação. Neste caso, o HTML instrui o navegador a criar uma página da web que exiba “Example.com” na parte superior.
Dentro de uma tag body há um parágrafo de texto e um link. Se você observar o código HTML, verá que “Example.com” está entre as tags <h1> e </h1>. Muitas tags HTML, como essa, têm uma tag de abertura e uma tag de fechamento. Nesse caso, seu navegador trata tudo o que está entre as tags como um título.
Tudo o que estiver dentro das <p> as tags é um parágrafo. Por fim, uma <a> tag é um link. Nesse caso, a linha de código "ahref=https://www.iana.org/domains/example" dentro da <a> tag instrui o navegador a criar um link para https://www.iana.org/domains/example.
Todo o código HTML deste exemplo está entre as tags <body>, <div> e <html> , que fornecem informações adicionais ao seu navegador.
Para acessar este site, você pode ir até www.example.com.
Para visualizar o código HTML, você pode pressionar Ctrl+U no seu navegador ou Cmd+Option+U em um Mac (Cmd+U se estiver usando o Firefox).
O que é análise sintática?
Neste tutorial, você aprenderá a extrair dados da internet e a analisá-los. Mas o que significa “analisar”? Analisar significa pegar um texto e transformá-lo em outro formato que permita extrair informações significativas.
Por exemplo, em breve você vai pegar um código HTML e inseri-lo no Beautiful Soup. Depois de fazer isso, você poderá analisar os dados de várias maneiras diferentes. Você pode extrair todos os links da página, o texto ou as imagens.
O Beautiful Soup permite que você “compreenda” os dados, interpretando as diferentes tags do HTML. Dessa forma, você pode obter rapidamente todas as informações necessárias de um site.
Baixando o código HTML de um site
Muito bem, é hora de começarmos a criar nosso scraper da web! Para começar, vamos extrair todos os dados de www.example.com.
A primeira coisa que precisamos fazer é obter o código HTML do site example.com.
É possível obter o código HTML de um site enviando uma solicitação HTTP.
Existem diferentes solicitações HTTP para realizar diversas tarefas, mas usaremos uma solicitação GET para pedir ao servidor de um site que nos envie seus recursos.
O Python possui uma biblioteca embutida chamada requests que permite enviar facilmente uma solicitação HTTP. Veja a seguir como usar a requests biblioteca para enviar uma solicitação GET e exibir o código HTML do site example.com.
import requests
print(requests.get('https://example.com').content)
>> b'<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n...Ao executar este código, você deverá ver o HTML do site example.com.
Análise de HTML com o Beautiful Soup
Agora podemos usar a biblioteca Beautiful Soup do Python para analisar o código HTML do site example.com. Para isso, vamos importar a BeautifulSoup biblioteca e usá-la para criar um BeautifulSoup objeto assim:
import requests
from bs4 import BeautifulSoup
page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")A BeautifulSoup classe aceita o texto que está analisando como parâmetro e uma string que indica do que se trata o texto. Nesse caso, o texto representa HTML, então passamos "html.parser".
Agora você pode usar seu BeautifulSoup método do objeto find para procurar diferentes tags no HTML. O find método aceita o nome de uma tag como parâmetro e retorna a primeira tag que corresponder.
import requests
from bs4 import BeautifulSoup
page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")
print(soup.find('p'))
>> <p>This domain is for use in illustrative examples in documents...
Nesse caso, você procurou no código HTML pelas p , que significa parágrafo, e o BeautifulSoup retornou tudo o que estava dentro das <p> tags.

A parte do site example.com que diz “Domínio de Exemplo” está dentro de uma <h1> tag. Para extrair “Domínio de Exemplo”, você pode passar h1 para find em vez de p.
print(soup.find("h1"))
>> <h1>Example Domain</h1>
Agora, seu código deve exibir o título do site.
A última informação no site example.com é o link no final que diz “Mais informações…”. Para obter essa informação final, você precisa procurar uma a tag.
print(soup.find("a"))
>> <a href="https://www.iana.org/domains/example">More information...</a>
Agora, quando você executar seu código, ele deve retornar o link.
Extraia mais dados
Vamos ver como extrair ainda mais dados de um site.
Quando você usa seu navegador da web e tem várias abas abertas, cada aba exibe o nome do site.
Os desenvolvedores web definem o título de um site em uma <title> tag. Você pode obter o título de um site desta forma:
import requests
from bs4 import BeautifulSoup
URL = "https://example.com"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
print (soup.title.get_text())
>> Example Domain
Ao executar esse código, o Python deve exibir “Exemplo de domínio”.
Em HTML, é possível atribuir um id ou uma classe a uma tag, o que permite aplicar estilos a ela usando CSS.
Você pode pesquisar tags por classe e ID ao fazer o scraping de um site.
Para ver isso na prática, vamos dar uma olhada em um site criado pelo Real Python: um site falso de anúncios de emprego. Ao acessá-lo, você verá que, na parte superior do site, está escrito “Fake Python”.
Ao examinar o código HTML do site, você verá que é esse código que cria “Fake Python” na aba do seu navegador.
<h1 class="title is-1">Fake Python </h1>Se você quiser extrair esses dados, primeiro precisa enviar uma solicitação HTTP para baixar o HTML. Em seguida, você pode usar o Beautiful Soup para procurar uma tag com a classe "title". Veja como fazer isso:
import requests
from bs4 import BeautifulSoup
URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find(class_="title")
print(result)
>> <h1 class="title is-1">
Fake Python
</h1>
Tudo o que você precisa fazer é passar o nome da classe para find com este código: class_="title".
Até agora, temos usado soup.find para pesquisar nosso HTML, o que retorna o primeiro resultado encontrado. O Beautiful Soup também possui um método soup.find_all que retorna todas as correspondências. Por exemplo, você poderia usá-lo para obter todos os cargos no site Fake Python. Veja como:
import requests
from bs4 import BeautifulSoup
URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find_all(class_="is-5")
for html in result:
print(html)
>> <h2 class="title is-5">Senior Python Developer</h2>
<h2 class="title is-5">Energy engineer</h2>
<h2 class="title is-5">Legal executive</h2>...
Primeiro, você precisa usar seu navegador para examinar o código HTML do Fake Python. Você descobre que todos os cargos têm a classe "is-5". Depois, basta procurar por qualquer código HTML que tenha essa classe usando find_all, percorrer os resultados e exibi-los.
Expressões regulares
Se você quiser aprimorar suas técnicas de web scraping, pode usar expressões regulares. Uma expressão regular é uma sequência de caracteres que define um padrão de busca.
O Python possui uma biblioteca integrada chamada re que você pode usar para defini-las. Por exemplo, você pode definir uma expressão regular que procure por números em uma string. Veja a seguir como usar o `re` para procurar números em uma string.
import re
print(re.findall('\d+', 'hello 1 hello 2 hello 3'))
>> \[‘1’, ‘2’, ‘3’]
O re método do módulo findall aceita dois parâmetros: a string a ser pesquisada e uma expressão regular. A expressão regular neste exemplo é '\d+'.
Como você pode ver, essa expressão regular retornou todos os números presentes na string 'hello 1 hello 2 hello 3'.
As expressões regulares são flexíveis: é possível escrever expressões regulares para corresponder a tudo, desde padrões amplos até padrões específicos. Por exemplo, veja a seguir como criar uma expressão regular que corresponda apenas a sequências de caracteres que comecem com “The” e terminem com “brown”.
import re
print(re.findall('^The.*brown$', 'The fox is brown'))
>> ['The fox is brown']
O Python exibe a string porque ela começa com “The” e termina com “brown”.
Nesse caso, a expressão regular é '^The.*brown$'. O símbolo de inserção no início, seguido de “The”, significa que deve ser encontrada a palavra “The” no início de uma sequência de caracteres.
O .* significa que corresponde a qualquer coisa. Em seguida vem brown$, que significa que a sequência deve terminar com “brown”.
Se você alterar a string para que termine com “green”, o Python não encontrará uma correspondência, pois ela não se encaixa no padrão que você definiu:
import re
print(re.findall('^The.*brown$', 'The fox is green'))
>> []
Você pode usar expressões regulares ao extrair dados de sites. Veja como:
import re
import requests
from bs4 import BeautifulSoup
page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find_all(re.compile("(head|div)"))
print(result)
>> [<head>
<title>Example Domain</title>...
Neste código, você passa soup.find_all a expressão regular "(head|div)". Essa expressão regular corresponde a qualquer coisa que esteja em uma <head> tag ou em uma <div> . Ao definir uma expressão regular, o símbolo “|” significa “ou”.
Considerações finais
Parabéns! Você já sabe como extrair dados de um site! Agora, todos os dados públicos da web estão ao seu alcance.
Como discutimos anteriormente, o web scraping apresenta alguns problemas; portanto, antes de decidir extrair dados, é melhor verificar primeiro se a fonte de dados disponibiliza uma API. Caso não haja uma API disponível e os termos de serviço permitam, você poderá extrair os dados de que precisar.
É claro que o web scraping vai muito além dos conceitos básicos que abordei neste tutorial. Se você quiser saber mais sobre web scraping, pode experimentar um curso gratuito da Coursera, como “Usando Python para acessar dados da web”.
Você também pode consultar documentação do BeautifulSoup. Você pode saber mais sobre expressões regulares aqui.
Por fim, talvez você queira conhecer o Scrapy, uma popular estrutura de Python para extração de dados da web.
Obrigado pela leitura e boa sorte com seu web scraping!
Compartilhar:
Cory Althoff é defensor de desenvolvedores na Vonage e autor de dois livros: “The Self-Taught Programmer” e “The Self-Taught Computer Scientist”. O site Book Authority considerou “The Self-Taught Programmer” um dos melhores livros de programação de todos os tempos, e o The Next Web o listou como um dos dez livros que ajudarão você a se tornar um engenheiro de software melhor. Cory mora na Região da Baía com sua esposa e filha.