Web scraping com BeautifulSoup

Um guia prático sobre como extrair dados de sites

Aprenda a extrair dados de sites usando BeautifulSoup em Python. Este tutorial aborda técnicas práticas para web scraping — incluindo análise de HTML, extração de dados, tratamento de tabelas, paginação e uso de sessões — para uma coleta de dados robusta.

Programação
Autor
Afiliação
Data de Publicação

8 de fevereiro de 2024

Data de Modificação

29 de abril de 2025

Palavras-chave

Tutorial do BeautifulSoup, Web scraping em Python, Web scraping em Python, Extração de dados com BeautifulSoup

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
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()

Tabela extraída

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()

Postagens de blog extraídas

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
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 o robots.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.

Nota

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

Boa programação e aproveite para explorar o poder da extração de dados da web com o BeautifulSoup!

Explore mais artigos

Nota

Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.

placeholder

placeholder
Nenhum item correspondente
De volta ao topo

Reuso

Citação

BibTeX
@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}
}
Por favor, cite este trabalho como:
Kassambara, Alboukadel. 2024. “Web scraping com BeautifulSoup.” February 8, 2024. https://www.datanovia.com/pt/learn/programming/python/tools/web-scraping-with-beautifulsoup.html.