Introdução ao Web Scraping com BeautifulSoup e Requests

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.

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}")

Navegando Entre Páginas

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

Navegação por URLs Fixas

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

Navegação por Links

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!

Artigos recentes

Aprenda Python do Zero

Domine Python de forma prática e objetiva com um curso completo pensado para você

Cadastro gratuito

Conteúdo do artigo

    Aprenda Python Hoje Mesmo!

    Comece Gratuitamente!

    Cadastre-se e experimente algumas aulas grátis do nosso curso de Python. Sem compromisso!

    © Academify 2020-2025. Todos os direitos reservados.

    Informe seus dados e continue para o pagamento

    Suas informações estão 100% seguras

    Informe seus dados e continue para o pagamento

    Suas informações estão 100% seguras

    Teste gratuitamente as aulas do curso completo de Python

    🔒 Acesso imediato, sem spam e sem compromisso

    Comece a aprender Python de graça!

    Teste agora algumas aulas do curso. Crie sua conta agora — é rápido, gratuito e sem compromisso

    Começar grátis
    Começar grátis

    Acesso imediato após o cadastro

    Abrir bate-papo
    1
    Tire suas dúvidas com a nossa equipe!
    Olá! 👋 Está com dúvidas sobre o curso? Fale com a nossa equipe!