Python para Coleta e Limpeza de Dados de Sites Públicos

A coleta e limpeza de dados de sites públicos é uma das etapas mais poderosas e estratégicas da Ciência de Dados moderna. Muitas análises, dashboards e aplicações de Machine Learning dependem de dados coletados da web — sejam eles informações financeiras, dados governamentais, preços de produtos, indicadores econômicos ou notícias.

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 RequestsBeautifulSoupSeleniumPandas 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

linguagem Python possui um ecossistema extremamente rico para trabalhar com dados web.
As principais bibliotecas incluem:

BibliotecaFunção principal
RequestsRealiza 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.
lxmlParser rápido e robusto para HTML e XML.
SeleniumPermite controlar um navegador (Chrome, Firefox, Edge) para coletar dados de sites dinâmicos (com JavaScript).
PandasManipula, limpa e organiza dados tabulares com facilidade.
Regex (re)Expressões regulares para localizar e extrair padrões de texto.
time / randomCria 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:

  1. Remover espaços, símbolos e caracteres especiais

df['Preço'] = df['Preço'].str.replace('R\$', '').str.strip()
  1. Converter tipos de dados

df['Preço'] = df['Preço'].astype(float)
df['Data'] = pd.to_datetime(df['Data'], errors='coerce')
  1. Remover duplicatas

df = df.drop_duplicates()
  1. Tratar valores nulos

df = df.fillna({'Região': 'Indefinida', 'Consumo (MWh)': 0})
  1. Normalizar colunas

df.columns = df.columns.str.lower().str.replace(' ', '_')
  1. 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)]
  1. 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

  1. Criar um crawler automatizado que coleta dados de preços de energia ou combustíveis e armazena em um banco SQLite.

  2. Desenvolver um painel interativo com Dash ou Streamlit para exibir estatísticas e gráficos.

  3. Criar um robô de monitoramento de políticas públicas (ex: coleta de dados do Portal da Transparência).

  4. Construir um pipeline completo com Airflow para agendar, limpar e processar dados.

  5. Integrar os dados coletados com APIs de Machine Learning para prever tendências ou anomalias.

Comentários

Postagens mais visitadas deste blog

Laços de Repetição em Python: Conceitos e Exemplos Práticos

Manipulação de Arquivos no C#: Como Ler, Escrever e Trabalhar com Arquivos de Forma Simples

Como Instalar o Xamarin com C#: Passo a Passo Completo