Introdução ao Web Scraping com BeautifulSoup e Requests

Tempo de leitura: 19 minutos
logo do BeautifulSoup em um fundo branco

O que é Web Scraping?

Web scraping é uma técnica para extrair informações de sites da internet de forma automática. Imagine que você precisa coletar preços de produtos em diferentes lojas online, ou reunir notícias sobre um tema específico de vários portais. Fazer isso manualmente seria cansativo e demorado. O web scraping resolve esse problema automatizando esse processo.

Em termos simples, web scraping é como ter um assistente digital que visita sites e coleta dados para você. Este assistente consegue ler o código das páginas web e extrair apenas as informações que você precisa.

Uma das formas mais populares de realizar essa tarefa é usando Web Scraping com BeautifulSoup, uma biblioteca em Python que facilita a leitura e extração de dados das páginas HTML. Geralmente, ela é utilizada junto com Requests, que permite acessar e baixar o conteúdo dos sites.

No Brasil, muitas empresas usam web scraping para monitorar preços da concorrência, acompanhar tendências de mercado ou coletar informações para pesquisas. Estudantes e pesquisadores também utilizam essa técnica para reunir dados para seus trabalhos acadêmicos.

Por que Aprender Web Scraping?

Aprender web scraping traz vários benefícios:

  • Automação de tarefas repetitivas: em vez de copiar e colar informações manualmente, você programa o computador para fazer isso
  • Economia de tempo: o que levaria horas ou dias para coletar manualmente pode ser feito em minutos
  • Acesso a grandes volumes de dados: você pode coletar informações de centenas ou milhares de páginas
  • Habilidade valorizada no mercado: profissionais que sabem extrair e analisar dados da web são muito procurados

Um exemplo prático: um jornalista que precisa analisar comentários em matérias sobre política em diferentes sites de notícias. Com web scraping, ele consegue coletar todos esses comentários rapidamente e identificar os assuntos mais mencionados.

Ferramentas Necessárias para Web Scraping

Para começar com web scraping em Python, precisamos de duas bibliotecas principais:

  1. Requests: funciona como um navegador automático, acessando as páginas web para nós
  2. BeautifulSoup: analisa o código HTML das páginas e nos ajuda a extrair as informações

Estas ferramentas são gratuitas, de código aberto e relativamente fáceis de aprender. Vamos conhecer cada uma delas melhor.

Biblioteca Requests

A biblioteca Requests é responsável por fazer as requisições HTTP. Em palavras simples, ela permite que seu programa Python “visite” sites da internet, assim como você faz ao digitar um endereço no seu navegador.

Algumas vantagens do Requests:

  • Código simples e direto
  • Suporte a diferentes tipos de requisições (GET, POST, etc.)
  • Capacidade de enviar dados em formulários
  • Gerenciamento de cookies e sessões

Biblioteca BeautifulSoup

Já o BeautifulSoup é uma ferramenta para análise de HTML e XML. Depois que o Requests baixa o código de uma página, o BeautifulSoup ajuda a navegar nesse código para encontrar exatamente o que você procura.

Principais funções do BeautifulSoup:

  • Localizar elementos específicos na página (como títulos, parágrafos ou tabelas)
  • Extrair texto e atributos desses elementos
  • Navegar pela estrutura da página
  • Filtrar informações usando diferentes critérios

Instalando as Ferramentas

Antes de começar a programar, precisamos instalar as bibliotecas necessárias. Se você já tem o Python instalado no seu computador, basta abrir o terminal ou prompt de comando e digitar:

Bash
pip install requests beautifulsoup4

Este comando instala tanto o Requests quanto o BeautifulSoup. Se tudo der certo, você verá uma mensagem confirmando a instalação.

Se você ainda não tem o Python, recomendo instalar a distribuição Anaconda, que já vem com muitas bibliotecas úteis para análise de dados. Você pode baixá-la gratuitamente em anaconda.com.

Entendendo o HTML Básico

Para fazer web scraping de forma eficaz, é importante entender um pouco sobre HTML, a linguagem usada para criar páginas web.

HTML usa tags para estruturar o conteúdo. Por exemplo:

  • <h1> para títulos principais
  • <p> para parágrafos
  • <a> para links
  • <div> para agrupar elementos
  • <table> para tabelas

Cada elemento pode ter atributos que fornecem informações adicionais, como id, class ou href. Esses atributos são muito úteis para identificar exatamente o que queremos extrair.

Veja um exemplo simples de código HTML:

HTML
<div class="noticia">
    <h2 id="titulo">Brasil bate recorde de energia solar</h2>
    <p class="data">12/05/2023</p>
    <p class="texto">O Brasil alcançou a marca de 30 GW de energia solar instalada...</p>
    <a href="https://exemplo.com/noticia-completa">Leia mais</a>
</div>

Neste exemplo:

  • div com classe “noticia” contém toda a informação
  • h2 com id “titulo” contém o título da notícia
  • p com classe “data” mostra quando a notícia foi publicada
  • p com classe “texto” contém o resumo da notícia
  • a com atributo href é um link para a notícia completa

Para extrair o título desta notícia com BeautifulSoup, usaríamos algo como soup.find('h2', id='titulo').

Seu Primeiro Web Scraping

Vamos começar com um exemplo simples: extrair os títulos das notícias mais recentes do site do G1. Este é um exemplo educativo para entender os conceitos básicos.

Python
import requests
from bs4 import BeautifulSoup

# Acessando o site
url = 'https://g1.globo.com/'
resposta = requests.get(url)

# Verificando se a requisição foi bem-sucedida
if resposta.status_code == 200:
    # Criando o objeto BeautifulSoup
    soup = BeautifulSoup(resposta.text, 'html.parser')
    
    # Encontrando os títulos das notícias (este seletor é um exemplo e pode precisar de ajustes)
    titulos = soup.find_all('a', class_='feed-post-link')
    
    # Exibindo os títulos
    for titulo in titulos:
        print(titulo.text)
else:
    print(f"Falha ao acessar o site: {resposta.status_code}")

Neste código:

  1. Importamos as bibliotecas necessárias
  2. Definimos a URL que queremos acessar
  3. Usamos requests.get() para baixar a página
  4. Verificamos se a requisição foi bem-sucedida (código 200)
  5. Criamos um objeto BeautifulSoup para analisar o HTML
  6. Usamos find_all() para localizar todos os elementos que correspondem aos títulos das notícias
  7. Exibimos o texto de cada título encontrado

Nota importante: Este é apenas um exemplo educativo. Antes de fazer web scraping em qualquer site, verifique os termos de serviço para garantir que essa prática é permitida. Muitos sites possuem políticas específicas sobre automação e coleta de dados.

Encontrando os Elementos Certos

Um dos maiores desafios no web scraping é identificar corretamente os elementos que contêm as informações desejadas. Existem várias maneiras de fazer isso:

Usando o Inspetor do Navegador

A ferramenta mais útil para identificar elementos é o inspetor do navegador. Nos navegadores modernos como Chrome, Firefox ou Edge, você pode:

  1. Clicar com o botão direito sobre o elemento que deseja extrair
  2. Selecionar “Inspecionar” ou “Inspecionar elemento”
  3. O código HTML desse elemento será destacado

Isso permite ver exatamente como o elemento está estruturado, quais classes ou IDs ele possui, e criar seletores precisos para sua extração.

Métodos de Seleção no BeautifulSoup

O BeautifulSoup oferece vários métodos para encontrar elementos:

  • find(): encontra o primeiro elemento que corresponde aos critérios
  • find_all(): encontra todos os elementos que correspondem
  • select(): usa seletores CSS para encontrar elementos
  • find_next(): encontra o próximo elemento após um determinado ponto
  • find_parent(): encontra o elemento pai de um determinado elemento

Vamos ver exemplos de diferentes seletores:

Python
# Encontrar por tipo de tag
titulo = soup.find('h1')

# Encontrar por classe
noticias = soup.find_all('div', class_='noticia')

# Encontrar por ID
destaque = soup.find(id='noticia-principal')

# Usar seletor CSS
links = soup.select('a.link-externo')

# Combinar critérios
resultados = soup.find_all('span', {'data-tipo': 'preco', 'class': 'destaque'})

Escolher o seletor certo é fundamental para extrair exatamente o que você precisa.

Extraindo Diferentes Tipos de Dados

Depois de localizar os elementos desejados, podemos extrair diferentes tipos de informação:

Extraindo Texto

Para obter apenas o texto de um elemento, use a propriedade .text:

Python
titulo = soup.find('h1')
texto_do_titulo = titulo.text
print(texto_do_titulo)  # Exibe: "Notícia principal do dia"

Extraindo Atributos

Para obter valores de atributos como links, use o método get():

Python
link = soup.find('a', class_='saiba-mais')
url_do_link = link.get('href')
print(url_do_link)  # Exibe: "https://exemplo.com/noticia-completa"

Extraindo Tabelas

Tabelas são comuns em muitos sites e podem conter informações valiosas:

Python
tabela = soup.find('table', id='tabela-precos')
linhas = tabela.find_all('tr')

for linha in linhas:
    colunas = linha.find_all('td')
    if colunas:  # Ignora linha de cabeçalho que não tem <td>
        produto = colunas[0].text
        preco = colunas[1].text
        print(f"Produto: {produto}, Preço: {preco}")

Extraindo Imagens

Para coletar URLs de imagens:

Python
imagens = soup.find_all('img')
for img in imagens:
    url_imagem = img.get('src')
    alt_texto = img.get('alt', 'Sem descrição')
    print(f"Imagem: {url_imagem}, Descrição: {alt_texto}")

Muitas vezes, as informações que precisamos estão distribuídas em várias páginas. Podemos navegar entre elas de duas maneiras:

Se o site tem um padrão de URLs previsível, podemos gerar essas URLs programaticamente:

Python
# Exemplo: acessar páginas de resultados 1 a 5
base_url = 'https://exemplo.com/resultados?pagina='

for numero_pagina in range(1, 6):
    url_pagina = base_url + str(numero_pagina)
    resposta = requests.get(url_pagina)
    
    # Processar cada página...
    soup = BeautifulSoup(resposta.text, 'html.parser')
    # Extrair dados desta página...
    
    # Importante: adicionar um pequeno atraso para não sobrecarregar o servidor
    import time
    time.sleep(2)  # Espera 2 segundos antes de acessar a próxima página

Alternativamente, podemos encontrar os links de “próxima página” e segui-los:

Python
url_atual = 'https://exemplo.com/inicio'

while url_atual:
    resposta = requests.get(url_atual)
    soup = BeautifulSoup(resposta.text, 'html.parser')
    
    # Extrair dados desta página...
    
    # Encontrar link para a próxima página
    link_proxima = soup.find('a', class_='proxima-pagina')
    if link_proxima:
        url_atual = link_proxima.get('href')
        # Se o link for relativo, adicionar o domínio
        if not url_atual.startswith('http'):
            url_atual = 'https://exemplo.com' + url_atual
        time.sleep(2)  # Espera 2 segundos
    else:
        url_atual = None  # Termina o loop quando não há mais páginas

Armazenando os Dados Coletados

Depois de extrair os dados, geralmente queremos salvá-los para análise posterior:

Salvando em CSV

O formato CSV (valores separados por vírgula) é simples e pode ser aberto em programas como Excel:

Python
import csv

# Dados coletados (exemplo)
produtos = [
    {'nome': 'Notebook Dell', 'preco': 'R$ 3.999,00', 'avaliacao': '4.5/5'},
    {'nome': 'Monitor LG', 'preco': 'R$ 899,00', 'avaliacao': '4.2/5'},
    # ... mais produtos
]

# Salvando em CSV
with open('produtos.csv', 'w', newline='', encoding='utf-8') as arquivo:
    campos = ['nome', 'preco', 'avaliacao']
    escritor = csv.DictWriter(arquivo, fieldnames=campos)
    
    escritor.writeheader()  # Escreve o cabeçalho
    for produto in produtos:
        escritor.writerow(produto)

Salvando em JSON

O formato JSON é ótimo para dados estruturados e muito usado em aplicações web:

Python
import json

# Salvando em JSON
with open('produtos.json', 'w', encoding='utf-8') as arquivo:
    json.dump(produtos, arquivo, ensure_ascii=False, indent=4)

Salvando em Banco de Dados

Para projetos maiores, salvar em um banco de dados como SQLite pode ser mais eficiente:

Python
import sqlite3

# Conectando ao banco de dados (será criado se não existir)
conexao = sqlite3.connect('produtos.db')
cursor = conexao.cursor()

# Criando tabela
cursor.execute('''
CREATE TABLE IF NOT EXISTS produtos (
    id INTEGER PRIMARY KEY,
    nome TEXT,
    preco TEXT,
    avaliacao TEXT
)
''')

# Inserindo dados
for produto in produtos:
    cursor.execute('''
    INSERT INTO produtos (nome, preco, avaliacao)
    VALUES (?, ?, ?)
    ''', (produto['nome'], produto['preco'], produto['avaliacao']))

# Salvando alterações e fechando conexão
conexao.commit()
conexao.close()

Boas Práticas e Questões Éticas

O web scraping é uma ferramenta poderosa, mas deve ser usado de forma responsável:

Respeite os Robots.txt

O arquivo robots.txt, presente na raiz de muitos sites, indica quais partes do site podem ser acessadas por robôs:

Python
import urllib.robotparser

rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://exemplo.com/robots.txt')
rp.read()

url = 'https://exemplo.com/pagina-alvo'
if rp.can_fetch('*', url):
    # Prosseguir com o scraping
    pass
else:
    print("Acesso não permitido segundo o robots.txt")

Adicione Atrasos Entre Requisições

Fazer muitas requisições rápidas pode sobrecarregar o servidor:

Python
import time
import random

# Lista de URLs para acessar
urls = ['url1', 'url2', 'url3', ...]

for url in urls:
    # Acessar a URL
    resposta = requests.get(url)
    
    # Processar a resposta
    # ...
    
    # Adicionar um atraso aleatório entre 2 e 5 segundos
    tempo_espera = random.uniform(2, 5)
    time.sleep(tempo_espera)

Identifique seu Web Scraper

É uma boa prática identificar seu programa nos cabeçalhos HTTP:

Python
headers = {
    'User-Agent': 'MeuProjeto/1.0 (contato@email.com) - Projeto educacional',
}

resposta = requests.get(url, headers=headers)

Questões Legais e Éticas

Antes de iniciar qualquer projeto de web scraping, considere:

  1. Termos de Serviço: verifique se o site permite coleta automatizada de dados
  2. Dados Pessoais: evite coletar informações pessoais que possam violar leis de privacidade como a LGPD
  3. Direitos Autorais: respeite os direitos autorais do conteúdo coletado
  4. Impacto no Site: evite sobrecarregar o servidor com muitas requisições

Lidando com Desafios Comuns

O web scraping nem sempre é simples. Aqui estão algumas soluções para problemas comuns:

Sites com Conteúdo Dinâmico (JavaScript)

Muitos sites modernos carregam conteúdo dinamicamente com JavaScript, o que o Requests não consegue processar sozinho. Para esses casos, podemos usar o Selenium:

Python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time

# Configurar o Selenium
options = Options()
options.add_argument('--headless')  # Navegador invisível
service = Service(ChromeDriverManager().install())
navegador = webdriver.Chrome(service=service, options=options)

# Acessar a página
url = 'https://exemplo.com/pagina-dinamica'
navegador.get(url)

# Esperar o conteúdo carregar
time.sleep(3)  # Espera 3 segundos

# Obter o HTML depois que o JavaScript foi executado
html = navegador.page_source
soup = BeautifulSoup(html, 'html.parser')

# Agora podemos extrair os dados como de costume
# ...

# Fechar o navegador
navegador.quit()

Lidando com Login e Cookies

Para acessar conteúdo protegido por login:

Python
import requests
from bs4 import BeautifulSoup

# Criando uma sessão para manter cookies
sessao = requests.Session()

# Acessando página de login
url_login = 'https://exemplo.com/login'
resposta = sessao.get(url_login)
soup = BeautifulSoup(resposta.text, 'html.parser')

# Extraindo token CSRF (comum em formulários de login)
token = soup.find('input', {'name': 'csrf_token'}).get('value')

# Dados de login
dados_login = {
    'usuario': 'seu_usuario',
    'senha': 'sua_senha',
    'csrf_token': token
}

# Enviando formulário de login
resposta_login = sessao.post(url_login, data=dados_login)

# Verificando se o login foi bem-sucedido
if 'Minha Conta' in resposta_login.text:
    print("Login bem-sucedido!")
    
    # Agora podemos acessar páginas protegidas usando a mesma sessão
    pagina_protegida = sessao.get('https://exemplo.com/area-restrita')
    # Processar a página...

Contornando Bloqueios Anti-Scraping

Alguns sites implementam medidas contra web scraping. Algumas estratégias para lidar com isso:

  1. Rotação de IPs: use proxies diferentes para cada requisição
  2. Rotação de User-Agents: alterne entre diferentes identificações de navegador
  3. Respeite limites de taxa: faça menos requisições por minuto
  4. Simule comportamento humano: varie o tempo entre requisições
Python
import requests
import random
import time

# Lista de User-Agents para alternar
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)'
]

# Lista de URLs para acessar
urls = ['url1', 'url2', 'url3', ...]

for url in urls:
    # Escolher um User-Agent aleatório
    headers = {
        'User-Agent': random.choice(user_agents)
    }
    
    # Fazer a requisição
    resposta = requests.get(url, headers=headers)
    
    # Processar a resposta
    # ...
    
    # Adicionar um atraso variável
    time.sleep(random.uniform(3, 7))

Conclusão

O web scraping com Python, BeautifulSoup e Requests é uma habilidade valiosa que abre portas para análise de dados, automação e pesquisa. Neste artigo, vimos desde os conceitos básicos até técnicas mais avançadas para lidar com desafios comuns.

Lembre-se sempre de usar essas ferramentas de forma ética e responsável, respeitando os termos de serviço dos sites e as leis de privacidade. Com prática e estudo contínuo, você será capaz de coletar e analisar dados da web de forma eficiente e automatizada.

O web scraping é apenas o começo da jornada. Depois de dominar a coleta de dados, você pode avançar para análise de dados com bibliotecas como Pandas, visualização com Matplotlib ou até mesmo aprendizado de máquina com Scikit-learn. As possibilidades são infinitas!

Perguntas Frequentes (FAQ)

1. O que é web scraping?
Web scraping é a técnica de automatizar a coleta de dados de páginas web para extrair informações úteis, como preços, notícias ou listas.

2. Quais bibliotecas Python são usadas no artigo?
O artigo recomenda principalmente as bibliotecas Requests (para baixar páginas) e BeautifulSoup (para analisar HTML).

3. Como instalo Requests e BeautifulSoup?
Abra o terminal e execute: pip install requests beautifulsoup4. Rápido e direto.

4. Preciso saber HTML para fazer web scraping?
Sim. Noções básicas de tags, classes e ids ajudam a localizar e extrair os elementos certos

5. Como verifico se a requisição deu certo?
Verifique resposta.status_code == 200 após requests.get(url) para confirmar que a página foi baixada.

6. Como extraio texto de um elemento com BeautifulSoup?
Use .text no elemento encontrado, por exemplo titulo.text, para obter apenas o conteúdo textual.

7. Como pego o link de um elemento <a>?
Use link.get('href') para recuperar o atributo href do elemento <a>.

8. Posso extrair imagens com BeautifulSoup?
Sim, encontre <img> e leia img.get('src') e img.get('alt') para URL e descrição.

9. E quando os dados estão em várias páginas?
Você pode gerar as URLs programaticamente (padrão de paginação) ou seguir links encontrados para navegar entre páginas.

10. Existe alguma limitação legal ou ética?
Sim. Verifique os termos de uso do site e respeite robots.txt e limites de requisições para não sobrecarregar servidores.


Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Logo do Plotly em um fundo azul-gelo
    Bibliotecas
    Foto do Leandro Hirt

    Plotly: Como Criar Gráficos Interativos em Python

    Aprenda a criar gráficos interativos com Plotly em Python. Guia completo com exemplos práticos de visualização de dados, desde a

    Ler mais

    Tempo de leitura: 10 minutos
    12/12/2025
    Logo do Python com o texto 'asyncio'
    Bibliotecas
    Foto do Leandro Hirt

    Como usar o asyncio no Python: Programação Assíncrona

    Aprenda como usar o asyncio no Python para criar aplicações mais rápidas e eficientes. Guia completo com exemplos práticos de

    Ler mais

    Tempo de leitura: 14 minutos
    11/12/2025
    Foto de um calendário
    FundamentosBibliotecas
    Foto do Leandro Hirt

    Datas e Horas no Python com datetime

    Aprenda a trabalhar com datas e horas no Python usando o módulo datetime. Guia completo com exemplos práticos de formatação,

    Ler mais

    Tempo de leitura: 13 minutos
    10/12/2025
    Logo do Python e do MySQL com um símbolo de '+' entre as logos
    Banco de DadosBibliotecas
    Foto do Leandro Hirt

    Como Conectar Python ao MySQL de Forma Fácil

    Aprenda como conectar Python ao MySQL passo a passo. Tutorial completo com MySQL Connector, SQLAlchemy, exemplos de código para inserir,

    Ler mais

    Tempo de leitura: 19 minutos
    07/12/2025
    Logo do Numpy em um fundo roxo-escuro
    Bibliotecas
    Foto do Leandro Hirt

    Introdução ao NumPy no Python para Iniciantes

    Aprender Python já abre muitas portas, mas entender como trabalhar com dados transforma suas habilidades de verdade. É aqui que

    Ler mais

    Tempo de leitura: 7 minutos
    05/12/2025
    Logo do Python com o texto 'requests' abaixo
    Bibliotecas
    Foto do Leandro Hirt

    Como usar a biblioteca Requests em Python

    A biblioteca Requests em Python permite que você envie requisições HTTP de forma simples. Você pode acessar dados de APIs,

    Ler mais

    Tempo de leitura: 5 minutos
    04/12/2025

    Minicurso de Python

    Insira seu e-mail e para receber acesso às aulas agora mesmo