Engenharia de Dados Automotivos: Scraping, Tratamento e Visualização com Python

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:

  1. Distribuição de Preços: Histograma para identificar a densidade de modelos por faixa de custo.
  2. Análise de Espaço Interno: Gráfico de dispersão correlacionando entre-eixos e comprimento total.
  3. 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:

  1. Instalação de Dependências: pip install -r requirements.txt
  2. Execução do Crawler: O script de coleta percorre as páginas, extrai as informações e gera o arquivo data.csv após a limpeza.
  3. 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).

Tags: Python web-scraping pandas matplotlib data-engineering

Publicado em 8-28 07:53