Python para Coleta e Limpeza de Dados de Sites Públicos
Neste artigo, você aprenderá como coletar, limpar e preparar dados de sites públicos usando Python, de forma ética, eficiente e automatizada. Exploraremos ferramentas como Requests, BeautifulSoup, Selenium, Pandas e APIs públicas, além de técnicas avançadas de limpeza e transformação.
1. O que é coleta de dados públicos e por que ela é importante?
A coleta de dados de sites públicos consiste em extrair informações disponíveis abertamente na internet para análise, pesquisa ou automação.
Esses dados podem vir de:
Portais de transparência governamentais;
Sites de estatísticas e órgãos oficiais (IBGE, BACEN, INMET, OMS etc.);
Portais de notícias e blogs;
Sites de e-commerce e redes sociais (quando permitido);
APIs públicas disponibilizadas por empresas ou instituições.
Importante: é essencial sempre respeitar os termos de uso e políticas de privacidade dos sites. A coleta de dados deve seguir os princípios éticos e legais, evitando violar direitos autorais ou sobrecarregar servidores.
2. Ferramentas essenciais para coleta e limpeza em Python
A linguagem Python possui um ecossistema extremamente rico para trabalhar com dados web.
As principais bibliotecas incluem:
Biblioteca | Função principal |
---|---|
Requests | Realiza requisições HTTP e obtém o conteúdo das páginas. |
BeautifulSoup (bs4) | Faz o parsing (análise) de HTML e XML, permitindo extrair informações estruturadas. |
lxml | Parser rápido e robusto para HTML e XML. |
Selenium | Permite controlar um navegador (Chrome, Firefox, Edge) para coletar dados de sites dinâmicos (com JavaScript). |
Pandas | Manipula, limpa e organiza dados tabulares com facilidade. |
Regex (re) | Expressões regulares para localizar e extrair padrões de texto. |
time / random | Cria intervalos e atrasos aleatórios entre requisições (boa prática para evitar bloqueios). |
API (requests + json) | Permite coletar dados de APIs REST (formato JSON). |
3. Estrutura básica de um projeto de coleta e limpeza de dados
Um projeto bem organizado geralmente segue esta estrutura:
projeto_coleta_dados/
│
├── dados/
│ ├── brutos/
│ └── limpos/
│
├── scripts/
│ ├── coleta.py
│ ├── limpeza.py
│ └── utils.py
│
├── logs/
│
├── requirements.txt
└── main.py
coleta.py
: contém o código para baixar os dados.limpeza.py
: responsável por limpar, transformar e padronizar os dados.utils.py
: funções auxiliares (tratamento de datas, logs etc).dados/brutos
: onde ficam os arquivos originais baixados.dados/limpos
: dados tratados, prontos para análise.
4. Exemplo prático: coletando dados de um site público com Requests e BeautifulSoup
Vamos usar como exemplo um portal fictício de dados de energia.
Instalação das bibliotecas:
pip install requests beautifulsoup4 pandas lxml
Código Python:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
# URL base do site público
url = "https://example.com/dados-energia"
# Cabeçalhos para simular um navegador
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
# Faz a requisição HTTP
response = requests.get(url, headers=headers)
# Verifica o status
if response.status_code == 200:
soup = BeautifulSoup(response.text, "lxml")
# Localiza a tabela de dados na página
tabela = soup.find("table", {"class": "dados-energia"})
linhas = tabela.find_all("tr")
dados = []
for linha in linhas[1:]: # ignora cabeçalho
colunas = linha.find_all("td")
registro = {
"Data": colunas[0].text.strip(),
"Região": colunas[1].text.strip(),
"Consumo (MWh)": colunas[2].text.strip(),
"Geracao (MWh)": colunas[3].text.strip()
}
dados.append(registro)
# Converte para DataFrame
df = pd.DataFrame(dados)
print(df.head())
# Salva os dados brutos
df.to_csv("dados/brutos/energia.csv", index=False)
else:
print(f"Erro na requisição: {response.status_code}")
Boas práticas:
Sempre insira delays aleatórios entre requisições:
time.sleep(random.uniform(1.5, 3.5))
Caso o site tenha várias páginas, utilize loops paginados e controle de erros.
5. Coletando dados de APIs públicas com Python
Muitos sites fornecem APIs REST para acesso estruturado aos dados, o que é mais confiável e rápido do que scraping de HTML.
Exemplo: API pública de câmbio do Banco Central
import requests
import pandas as pd
url = "https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/"
url += "CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='10-03-2025'&$top=100&$format=json"
response = requests.get(url)
dados = response.json()['value']
df = pd.DataFrame(dados)
print(df.head())
Vantagens de usar APIs:
Dados estruturados (JSON/XML);
Atualização em tempo real;
Melhor desempenho e estabilidade;
Reduz erros de parsing.
6. Coletando dados de sites dinâmicos com Selenium
Alguns sites usam JavaScript para carregar os dados. Nesses casos, o conteúdo não aparece no HTML inicial — por isso, precisamos usar o Selenium, que controla um navegador real.
Instalação:
pip install selenium webdriver-manager
Exemplo prático:
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
import time
# Configura o navegador
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://example.com/precos-produtos")
time.sleep(3) # aguarda carregamento da página
linhas = driver.find_elements(By.CSS_SELECTOR, "table#produtos tbody tr")
dados = []
for linha in linhas:
colunas = linha.find_elements(By.TAG_NAME, "td")
registro = {
"Produto": colunas[0].text,
"Preço": colunas[1].text,
"Categoria": colunas[2].text
}
dados.append(registro)
df = pd.DataFrame(dados)
df.to_csv("dados/brutos/produtos.csv", index=False)
driver.quit()
Quando usar Selenium:
Sites com JavaScript intenso (React, Angular, Vue);
Login necessário;
Páginas que mudam dinamicamente via AJAX.
7. Limpeza e transformação de dados com Pandas
Após coletar os dados, a próxima etapa é limpar e padronizar as informações.
A limpeza transforma os dados brutos em algo confiável e útil.
Principais etapas:
Remover espaços, símbolos e caracteres especiais
df['Preço'] = df['Preço'].str.replace('R\$', '').str.strip()
Converter tipos de dados
df['Preço'] = df['Preço'].astype(float)
df['Data'] = pd.to_datetime(df['Data'], errors='coerce')
Remover duplicatas
df = df.drop_duplicates()
Tratar valores nulos
df = df.fillna({'Região': 'Indefinida', 'Consumo (MWh)': 0})
Normalizar colunas
df.columns = df.columns.str.lower().str.replace(' ', '_')
Detecção de outliers simples
q1 = df['consumo_(mwh)'].quantile(0.25)
q3 = df['consumo_(mwh)'].quantile(0.75)
iqr = q3 - q1
limite_inferior = q1 - 1.5 * iqr
limite_superior = q3 + 1.5 * iqr
df_filtrado = df[(df['consumo_(mwh)'] >= limite_inferior) & (df['consumo_(mwh)'] <= limite_superior)]
Salvar dados limpos
df_filtrado.to_csv("dados/limpos/energia_limpa.csv", index=False)
8. Automação da coleta e limpeza
Para projetos recorrentes, é possível automatizar todo o processo com:
Crontab (Linux) ou Task Scheduler (Windows);
Script único Python que coleta, limpa e exporta;
Logs automáticos para monitoramento.
Exemplo de automação simples:
0 6 * * * /usr/bin/python3 /home/pi/projeto/main.py >> /home/pi/logs/coleta.log 2>&1
Esse comando executa o script todos os dias às 6h da manhã.
9. Boas práticas e ética na coleta de dados
Respeite o site: não sobrecarregue servidores (limite requisições por segundo).
Leia o arquivo robots.txt do site para saber o que pode ser coletado.
Evite coleta de dados pessoais sem autorização.
Identifique-se no cabeçalho (User-Agent) quando possível.
Prefira APIs oficiais sempre que disponíveis.
10. Conclusão
Python é uma ferramenta poderosa para coletar e limpar dados de sites públicos, transformando conteúdo disperso em informação valiosa.
Com as bibliotecas Requests, BeautifulSoup, Selenium e Pandas, é possível construir pipelines robustos e automatizados para alimentar seus projetos de análise, ciência de dados e dashboards interativos.
O segredo está na combinação entre:
Ética e respeito aos sites;
Boas práticas de estrutura e automação;
Transformação dos dados em algo limpo, padronizado e confiável.
11. Próximos passos e ideias de projetos
Criar um crawler automatizado que coleta dados de preços de energia ou combustíveis e armazena em um banco SQLite.
Desenvolver um painel interativo com Dash ou Streamlit para exibir estatísticas e gráficos.
Criar um robô de monitoramento de políticas públicas (ex: coleta de dados do Portal da Transparência).
Construir um pipeline completo com Airflow para agendar, limpar e processar dados.
Integrar os dados coletados com APIs de Machine Learning para prever tendências ou anomalias.
Comentários
Postar um comentário