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 BeautifulSoupExemplo 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
url = "https://www.worldometers.info/world-population/population-by-country/"
# Buscar a página da web
response = requests.get(url)
# Analise o conteúdo HTML
soup = BeautifulSoup(response.text, "html.parser")
# Extraia e imprima o título da página
page_title = soup.title.string
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)
table = soup.find("table")
# Extraia cabeçalhos de tabela
headers = [header.text.strip() for header in table.find_all("th")]
# Extrair linhas da tabela
rows = []
for row in table.find_all("tr")[1:]:
cells = [cell.text.strip() for cell in row.find_all("td")]
if cells:
rows.append(cells)
# Crie um `DataFrame` usando os cabeçalhos e linhas extraídos
df = pd.DataFrame(rows, columns=headers)
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):
response = requests.get(url)
return BeautifulSoup(response.text, "html.parser")
# O site usa um parâmetro de consulta `#listing-listing-page=` para paginação
base_url = "https://quarto.org/docs/blog/#listing-listing-page="
page_number = 1
all_data = []
# Exemplo: raspe as duas primeiras páginas
while page_number <= 2:
url = base_url + str(page_number)
soup = scrape_page(url)
# 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"):
a_tag = h3.find("a")
if a_tag:
title = a_tag.text.strip()
link = a_tag.get("href")
posts.append({"title": title, "url": link})
all_data.extend(posts)
page_number += 1
# Atraso respeitoso entre solicitações
time.sleep(1)
# Converta a saída para um DataFrame e imprima os dados
df = pd.DataFrame(all_data)
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_pagebaixa 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
session = requests.Session()
session.headers.update({"User-Agent": "Mozilla/5.0"})
# Use a sessão para fazer solicitações
url = "https://www.worldometers.info/world-population/population-by-country/"
response = session.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print("Session-based Page Title:", soup.title.string)Melhores práticas para Web scraping
Respeite as políticas do site:
Sempre verifique orobots.txte 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}
}
