Este projeto consiste em um ecossistema completo de engenharia de dados focado no setor automotivo. Ele abrange desde a coleta de dados brutos (web scraping) em portais especializados até a geração de dashboards estatísticos, passando por processos rigorosos de limpeza e normalização. A solução foi estruturada para ser um modelo de "ciclo fechado", seguindo as melhores práticas de desenvolvimento de software em Python 3.11.
Arquitetura do Projeto e Desacoplamento
O sistema é dividido em três camadas lógicas distintas para garantir a manutenibilidade e escalabilidade do código. Diferente de scripts monolíticos, esta abordagem permite que mudanças na interface do site alvo ou na lógica de negócios não quebrem todo o pipeline.
- Camada de Coleta (Scraping): Responsável pela comunicação HTTP e parsing de HTML.
- Camada de Processamento: Realiza a higienização dos dados, conversão de tipos e tratamento de valores nulos.
- Camada de Visualização: Transforma os dados processados em insights visuais através de gráficos estatísticos.
Coleta Estável com Requests e BeautifulSoup
A extração utiliza a biblioteca requests para requisições leves e a BeautifulSoup para navegação no DOM. Para evitar bloqueios por mecanismos de proteção (anti-scraping), o código implementa a rotação de User-Agents e intervalos de tempo aleatórios entre as requisições.
import requests
from bs4 import BeautifulSoup
import time
import random
def disparar_requisicao(url_alvo):
config_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36',
'Accept-Language': 'pt-BR,pt;q=0.9,en;q=0.8'
}
try:
# Simulação de comportamento humano com atraso randômico
time.sleep(random.uniform(1.5, 3.0))
resposta = requests.get(url_alvo, headers=config_headers, timeout=15)
if resposta.status_code == 200:
return BeautifulSoup(resposta.content, 'html.parser')
except requests.exceptions.RequestException as erro:
print(f"Falha na conexão: {erro}")
return None
Higienização e Normalização de Dados
Dados coletados da web costumam ser ruidosos. O projeto foca na conversão de strings complexas (ex: "25.98 mil reais") em valores numéricos puros (float) e na padronização de unidades de medida para motores e dimensões físicas. A biblioteca pandas é utilizada para garantir a integridade do arquivo final data.csv.
import pandas as pd
import re
def limpar_dados_automotivos(dataframe_bruto):
# Extração de valores numéricos de preços
def converter_preco(texto_preco):
if pd.isna(texto_preco) or 'sob consulta' in texto_preco:
return None
match = re.search(r'(\d+\.?\d*)', str(texto_preco))
return float(match.group(1)) if match else None
# Normalização de cilindrada
dataframe_bruto['litragem_motor'] = dataframe_bruto['motor'].str.extract(r'(\d\.\d)').astype(float)
# Tratamento de valores ausentes em transmissões
dataframe_bruto['tipo_cambio'].fillna('Manual/Não Informado', inplace=True)
return dataframe_bruto
Visualização Estratégica de Dados
A fase de visualização não se limita a gerar gráficos estéticos, mas sim a responder perguntas de negócio. Utilizando matplotlib e seaborn, o sistema gera automaticamente 6 tipos de visualizações, incluindo:
- Distribuição de Preços: Histograma para identificar a densidade de modelos por faixa de custo.
- Análise de Espaço Interno: Gráfico de dispersão correlacionando entre-eixos e comprimento total.
- Mapa de Calor de Dimensões: Identifica tendências de design entre diferentes fabricantes.
import matplotlib.pyplot as plt
import pandas as pd
def gerar_grafico_precos(caminho_csv):
df = pd.read_csv(caminho_csv)
plt.figure(figsize=(10, 6))
# Definindo estilo e plotagem
plt.hist(df['preco_final'].dropna(), bins=20, color='skyblue', edgecolor='black')
plt.title('Distribuição de Preços no Mercado Automotivo')
plt.xlabel('Preço (em unidades monetárias)')
plt.ylabel('Frequência de Modelos')
plt.grid(axis='y', alpha=0.75)
plt.savefig('./output/distribuicao_precos.png')
plt.close()
Configuração do Ambiente e Execução
Para garantir que o projeto seja executado sem conflitos de dependências, um arquivo requirements.txt com versões fixas é fornecido. O fluxo de execução recomendado segue os passos abaixo:
- Instalação de Dependências:
pip install -r requirements.txt - Execução do Crawler: O script de coleta percorre as páginas, extrai as informações e gera o arquivo
data.csvapós a limpeza. - Geração de Insights: O script de visualização lê o CSV e exporta as imagens para a pasta de saída.
Este fluxo garante que o usuário final tenha acesso a dados atualizados e prontos para análise estatística ou integração em sistemas de Business Intelligence (BI).