🌗 ← Índice

🐍 Python P20 — Web Scraping básico (requests + BeautifulSoup)


Data: 14/08/2026

Nível: Intermediário-Avançado (Mês 3 — Projetos Reais)




🎯 Objetivos





📖 Teoria


Instalar



pip install beautifulsoup4 requests

HTML básico



<!DOCTYPE html>
<html>
  <body>
    <h1 class="titulo">Últimas Notícias</h1>
    <div class="noticia">
      <h2 class="manchete"><a href="/n1">Python lança versão nova</a></h2>
      <p class="data">14/08/2026</p>
    </div>
  </body>
</html>

Primeiro scraping



import requests
from bs4 import BeautifulSoup

resposta = requests.get("https://exemplo.com", timeout=10)
soup = BeautifulSoup(resposta.text, "html.parser")

titulo = soup.find("h1", class_="titulo")
print(titulo.get_text())          # "Últimas Notícias"

💡 `resposta.text` traz o HTML bruto; o BeautifulSoup transforma em árvore pesquisável.

Encontrar elementos



# find — primeiro que encontra
manchete = soup.find("h2", class_="manchete")

# find_all — todos
noticias = soup.find_all("div", class_="noticia")

# CSS selectors
manchetes = soup.select("h2.manchete")
links = soup.select("div.noticia a")

for noticia in noticias:
    titulo = noticia.find("h2").get_text()
    link = noticia.find("a")["href"]          # atributo
    data = noticia.find("p", class_="data").get_text()
    print(f"{titulo} ({data}) → {link}")

MétodoUso
`find(tag, class_=...)`primeiro elemento
`find_all(tag, class_=...)`todos
`select(css)`seletor CSS (`.classe`, `#id`, `a[href]`)
`.get_text()`texto limpo
`elemento["atributo"]`valor de atributo
`.strip()`remove espaços

Headers (User-Agent)



headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
}
resposta = requests.get("https://exemplo.com", headers=headers, timeout=10)

Muitos sites bloqueiam requests sem User-Agent (ou com o padrão do `requests`).

Tratar conteúdo ausente



titulo = soup.find("h1")
if titulo:
    print(titulo.get_text())
else:
    print("Elemento não encontrado — a página pode ter mudado")

Boas práticas



import time
import requests
from bs4 import BeautifulSoup

headers = {"User-Agent": "MeuEstudoBot/1.0 (contato@exemplo.com)"}

for pagina in range(1, 4):
    resposta = requests.get(f"https://exemplo.com/pagina/{pagina}", headers=headers, timeout=10)
    soup = BeautifulSoup(resposta.text, "html.parser")
    # ... processa ...
    time.sleep(2)      # ⚠️ respeite o servidor — não faça requests em rajada

⚠️ **Sempre verifique:** `robots.txt` (ex: `https://site.com/robots.txt`), termos de uso e leis locais. Raspe apenas dados públicos, com moderação e para fins de estudo.



✍️ Exercícios


  1. 1. Baixe a página `https://quotes.toscrape.com/` (site de treino de scraping) e imprima as 10 primeiras citações com seus autores.
  2. 2. Imprima todos os links (`<a href>`) de uma página com `select("a")`.
  3. 3. Para cada citação, imprima também as tags (`<div class="tags">`).



🧪 Desafio


Crie um script cotacoes.py que:



[
  {"texto": "...", "autor": "...", "tags": ["life", "inspirational"]}
]



✅ Correção



import json
import time
import requests
from bs4 import BeautifulSoup

headers = {"User-Agent": "MeuEstudoBot/1.0"}
resultado = []

for pagina in range(1, 4):
    resposta = requests.get(
        f"https://quotes.toscrape.com/page/{pagina}/",
        headers=headers,
        timeout=10,
    )
    soup = BeautifulSoup(resposta.text, "html.parser")

    for citação in soup.select("div.quote"):
        texto = citação.select_one("span.text").get_text().strip()
        autor = citação.select_one("small.author").get_text().strip()
        tags = [tag.get_text() for tag in citação.select("a.tag")]
        resultado.append({"texto": texto, "autor": autor, "tags": tags})

    time.sleep(1)

with open("cotacoes.json", "w", encoding="utf-8") as f:
    json.dump(resultado, f, ensure_ascii=False, indent=2)

print(f"Salvas {len(resultado)} citações em cotacoes.json")

💡 Resultado esperado: 30 citações (10 por página × 3) salvas em JSON.





HB Estudos · ← Voltar ao índice de Python