Introdução
A extração de dados da web é uma técnica poderosa para extrair dados de sites para análise, pesquisa ou outros projetos orientados por dados. Neste tutorial, você aprenderá como usar BeautifulSoup — uma biblioteca Python popular — para analisar HTML e extrair informações significativas de páginas da web. Abordaremos não apenas exemplos básicos, como extração de títulos e links de páginas, mas também técnicas avançadas, como extração de tabelas, tratamento de paginação e uso de sessões para manter o estado em várias solicitações.
Importando pacotes necessários
Para manter nosso código organizado e evitar repetições, começamos importando os pacotes necessários. Isso garante que todos os trechos de código subsequentes tenham acesso às bibliotecas necessárias.
#| label: import-packages
# Este código importa os pacotes essenciais para web scraping.
import requests
from bs4 import BeautifulSoup
Exemplo básico de raspagem da Web
Primeiro, vamos demonstrar como buscar uma página da web, analisar seu HTML e extrair o título da página.
#| label: basic-scraping
# Defina a URL a ser raspada
= "https://www.worldometers.info/world-population/population-by-country/"
url
# Buscar a página da web
= requests.get(url)
response # Analise o conteúdo HTML
= BeautifulSoup(response.text, "html.parser")
soup
# Extraia e imprima o título da página
= soup.title.string
page_title print("Page Title:", page_title)
Resultados:
Page Title: Population by Country (2025) - Worldometer
Extraindo tabelas
Muitos sites apresentam dados em tabelas. Você pode usar BeautifulSoup
para extrair dados de tabelas e convertê-los em um formato estruturado.
#| label: extract-tables
# Encontre uma tabela por sua tag (ou com atributos adicionais, por exemplo, class ou id)
= soup.find("table")
table # Extraia cabeçalhos de tabela
= [header.text.strip() for header in table.find_all("th")]
headers
# Extrair linhas da tabela
= []
rows for row in table.find_all("tr")[1:]:
= [cell.text.strip() for cell in row.find_all("td")]
cells if cells:
rows.append(cells)
# Crie um `DataFrame` usando os cabeçalhos e linhas extraídos
= pd.DataFrame(rows, columns=headers)
df df.head()
Tratamento de paginação
Para sites que exibem dados em várias páginas, você pode automatizar o processo de iteração pelas páginas.
O script a seguir extrai as postagens do blog, extraindo o título de cada postagem (do texto âncora) e a URL (do atributo href da âncora):
#| label: pagination-example
import time
def scrape_page(url):
= requests.get(url)
response return BeautifulSoup(response.text, "html.parser")
# O site usa um parâmetro de consulta `#listing-listing-page=` para paginação
= "https://quarto.org/docs/blog/#listing-listing-page="
base_url = 1
page_number = []
all_data
# Exemplo: raspe as duas primeiras páginas
while page_number <= 2:
= base_url + str(page_number)
url = scrape_page(url)
soup # Extrair postagens de blog:
# Cada título e URL está dentro de um `<h3 class='no-anchor listing-title'>`
= []
posts for h3 in soup.find_all("h3", class_="no-anchor listing-title"):
= h3.find("a")
a_tag if a_tag:
= a_tag.text.strip()
title = a_tag.get("href")
link "title": title, "url": link})
posts.append({
all_data.extend(posts)+= 1
page_number # Atraso respeitoso entre solicitações
1)
time.sleep(
# Converta a saída para um DataFrame e imprima os dados
= pd.DataFrame(all_data)
df df.head()
Como funciona
- Paginação: O script cria a URL para cada página usando um parâmetro de consulta (por exemplo,
#listing-listing-page=1
,#listing-listing-page=2
). - Extraindo a página: Para cada página, a função
scrape_page
baixa e analisa o HTML. - Extraindo postagens: Ele procura tags
<h3>
com a classe'no-anchor listing-title'
, encontra a tag filho<a>
e extrai o título (usando.text
) e a URL (usando.get('href')
). - Coleta de dados: Os dados de cada postagem são armazenados como um dicionário na lista
all_data
.
Usando sessões
Ao extrair várias páginas do mesmo site, usar uma sessão pode melhorar o desempenho, reutilizando configurações (como cabeçalhos e cookies) e mantendo o estado.
#| label: using-sessions
# Crie um objeto de sessão
= requests.Session()
session "User-Agent": "Mozilla/5.0"})
session.headers.update({
# Use a sessão para fazer solicitações
= "https://www.worldometers.info/world-population/population-by-country/"
url = session.get(url)
response = BeautifulSoup(response.text, "html.parser")
soup print("Session-based Page Title:", soup.title.string)
Melhores práticas para Web scraping
Respeite as políticas do site:
Sempre verifique orobots.txt
e os termos de serviço de um site antes de fazer scraping.Limitação de taxa:
Use atrasos (por exemplo,time.sleep()
) entre as solicitações para evitar sobrecarregar o site.Tratamento de erros:
Incorpore um tratamento de erros robusto para gerenciar problemas de conexão e estruturas HTML inesperadas.
Garanta que suas atividades de web scraping estejam em conformidade com as diretrizes legais e éticas.
Conclusão
A extração de dados da Web com BeautifulSoup
é uma maneira eficaz de extrair e processar dados de sites. Ao combinar técnicas básicas com estratégias avançadas, como extração de tabelas, tratamento de paginação e gerenciamento de sessões, você pode construir pipelines de coleta de dados robustos para seus projetos de ciência de dados. Experimente esses exemplos, ajuste-os para atender às suas necessidades específicas e sempre pratique a extração ética.
Leitura adicional
- Automação em Python: agendamento e automação de tarefas
- Criação de APIs REST com FastAPI: uma estrutura Python moderna
- Teste de unidade em Python com pytest: um guia completo
Boa programação e aproveite para explorar o poder da extração de dados da web com o BeautifulSoup!
Explore mais artigos
Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.
Reuso
Citação
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Web scraping com BeautifulSoup},
date = {2024-02-08},
url = {https://www.datanovia.com/pt/learn/programming/python/tools/web-scraping-with-beautifulsoup.html},
langid = {pt}
}