Article image
Rafael Pereira
Rafael Pereira14/02/2025 14:41
Compartilhe

Como Extrair Dados com Python: 5 Métodos Práticos do Básico ao Avançado

  • #Python

Quer coletar dados de sites, APIs ou até mesmo PDFs para análise, mas não sabe por onde começar? Neste artigo, vou mostrar 5 métodos essenciais para extrair dados com Python, desde técnicas simples para iniciantes até estratégias avançadas. Incluindo códigos prontos, erros cometidos e dicas para evitar bloqueios. Vamos transformar dados brutos em insights valiosos!

1. Por Que Python é Ideal para Extração de Dados?

Python é a linguagem preferida para web scraping e integração com APIs graças a:

  • Bibliotecas especializadasrequestsBeautifulSoupSeleniumScrapy.
  • Flexibilidade: Funciona em cenários simples (extrair tabelas de um site) ou complexos (dados de sites com JavaScript dinâmico).
  • Comunidade ativa: Soluções prontas para desafios como CAPTCHAs ou bloqueios de IP.

👉 Experiência: É possível usar Python para extrair dados de mais de 200 páginas de um site governamental em minutos, algo que manualmente levaria dias.

2. Método 1: Extraindo Dados de Sites Estáticos com BeautifulSoup

Quando usar: Sites simples, sem JavaScript pesado.

Passo a Passo:

import requests  
from bs4 import BeautifulSoup  

# 1. Buscar o HTML da página  
url = 'https://exemplo.com/produtos'  
response = requests.get(url)  
html = response.text  

# 2. Analisar o HTML  
soup = BeautifulSoup(html, 'html.parser')  

# 3. Extrair dados (ex: nomes e preços de produtos)  
produtos = []  
for item in soup.find_all('div', class_='produto'):  
  nome = item.find('h2').text.strip()  
  preco = item.find('span', class_='preco').text  
  produtos.append({'nome': nome, 'preco': preco})  

print(produtos[:2])  # Exibe os primeiros resultados  

Erro Comum: Esquecer de verificar se o site permite scraping (leia robots.txt). Ignorar isso pode te bloquear!

3. Método 2: Trabalhando com APIs (e Como Não Ser Bloqueado)

Quando usar: Dados estruturados de serviços como Twitter, Spotify ou Google Maps.

Exemplo: Extrair Dados do GitHub API

import requests  

# 1. Definir endpoint e cabeçalhos  
url = 'https://api.github.com/users/octocat/repos'  
headers = {'Accept': 'application/vnd.github.v3+json'}  

# 2. Fazer a requisição  
response = requests.get(url, headers=headers)  
dados = response.json()  

# 3. Processar resultados  
repositorios = []  
for repo in dados:  
  repositorios.append({  
      'nome': repo['name'],  
      'estrelas': repo['stargazers_count'],  
      'linguagem': repo['language']  
  })  

print(f"Repositórios da Octocat: {repositorios}")  

Dicas:

  • Respeite os limites de requisições (use time.sleep() entre chamadas).
  • Use autenticação via tokens (ex: headers={'Authorization': 'Bearer SEU_TOKEN'})

4. Método 3: Raspagem de Sites Dinâmicos com Selenium

Quando usar: Sites que carregam dados via JavaScript (ex: e-commerces com "scroll infinito").

from selenium import webdriver  
from selenium.webdriver.common.by import By  

# 1. Configurar o navegador (ex: Chrome)  
driver = webdriver.Chrome()  
driver.get('https://exemplo.com/produtos')  

# 2. Esperar carregar conteúdo dinâmico (ex: rolar a página)  
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  

# 3. Extrair dados  
produtos = driver.find_elements(By.CLASS_NAME, 'produto')  
for produto in produtos:  
  nome = produto.find_element(By.TAG_NAME, 'h2').text  
  preco = produto.find_element(By.CLASS_NAME, 'preco').text  
  print(f'Nome: {nome}, Preço: {preco}')  

driver.quit()  # Fechar navegador  

Desafio Comum: Sites alteram classes HTML frequentemente.

5. Método 4: Extraindo Dados de PDFs e Imagens

Caso 1: PDFs com PyPDF2

import PyPDF2  

with open('relatorio.pdf', 'rb') as arquivo:  
  leitor = PyPDF2.PdfReader(arquivo)  
  texto = ''  
  for pagina in leitor.pages:  
      texto += pagina.extract_text()  
  print(texto[:500])  # Primeiros 500 caracteres  

Caso 2: OCR em Imagens com pytesseract

from PIL import Image  
import pytesseract  

imagem = Image.open('nota_fiscal.png')  
texto = pytesseract.image_to_string(imagem, lang='por')  
print(texto)  

Atenção: A qualidade da extração depende da resolução da imagem e da fonte.

6. Método 5: Automatizando Tarefas com Scrapy (Avançado)

Quando usar: Projetos grandes com necessidade de pipeline (extração, limpeza, armazenamento).

Exemplo: Criar um Spider para Notícias

import scrapy  

class NoticiasSpider(scrapy.Spider):  
  name = 'noticias'  
  start_urls = ['https://exemplo.com/noticias']  

  def parse(self, response):  
      for noticia in response.css('div.noticia'):  
          yield {  
              'titulo': noticia.css('h2::text').get(),  
              'data': noticia.css('.data::attr(datetime)').get(),  
              'link': noticia.css('a::attr(href)').get()  
          }  

# Executar no terminal: scrapy runspider meu_spider.py -o noticias.json  

Vantagem: Scrapy lida automaticamente com paralelismo e armazenamento em JSON/CSV

7. Desafios Comuns (e Como Evitá-los)

  • Bloqueio por IP: Use proxies rotativos (bibliotecas como requests-rotator) e respeite robots.txt.
  • CAPTCHAs: Serviços como Anti-Captcha ou 2Captcha resolvem automaticamente (custo envolvido).
  • Dados Dinâmicos: Combine Selenium com BeautifulSoup para eficiência.
  • Estrutura Inconsistente: Teste scripts regularmente e monitore falhas.

Erro Grave: Extrair dados pessoais sem consentimento. Conheça a LGPD!

Conclusão: Sua Vez de Extrair Dados como um Profissional

Dominar a extração de dados com Python abre portas para análise competitiva, pesquisa acadêmica e automação de negócios. Das 5 técnicas que compartilhei, comece pelo BeautifulSoup e APIs, depois avance para Selenium e Scrapy.

Chamada para Ação:

Escolha um site ou API de seu interesse e pratique! Compartilhe seu projeto com a tag #PythonParaDados e mostre como você transforma dados brutos em informação valiosa.

🔗 Referências Úteis

Compartilhe
Comentários (1)
Diego Piovesan
Diego Piovesan - 14/02/2025 16:47

Olá, Rafael.

Gostaria de parabenizá-lo pelo artigo.

Respeitosamente.

Diego Piovesan.