Automação para Download em Massa e Comparação de Faturas de Energia com Python
Gerenciar contas de consumo em operações distribuídas por múltiplos estados é um dos gargalos operacionais mais comuns no setor financeiro e contábil. Quando uma empresa precisa auditar mensalmente centenas de faturas de energia de diferentes concessionárias (como Enel, Cemig, CPFL e Light), o processo manual de login, navegação, download de PDFs e consolidação em planilhas consome dias de trabalho e introduz inconsistências humanas.
A solução sustentável para essa demanda reside na engenharia de dados orientada à automação com Python, combinando automação web robusta, pipelines assíncronos e processamento estruturado de documentos.
O Desafio Técnico: Heterogeneidade de Portais e Formatos
O principal obstáculo na automação de download de contas de consumo é a falta de padronização. Cada distribuidora adota sua própria infraestrutura web:
- Fluxos de autenticação distintos: Autenticação em duas etapas, CAPTCHAs pontuais ou sessões curtas baseadas em tokens.
- Renderização dinâmica: Portais modernos construídos em Single Page Applications (SPAs) que exigem execução de JavaScript para disponibilizar o link final do PDF.
- Layouts de fatura não padronizados: Cada concessionária organiza dados de consumo (kWh), tributos (ICMS, PIS, COFINS) e encargos setoriais em posições e nomenclaturas diferentes.
Para resolver isso de forma escalável, a arquitetura deve ser modular, separando a etapa de ingestão (navegação e download) da etapa de extração e conciliação.
1. Pipeline de Ingestão: Automação Resiliente com Playwright
Enquanto bibliotecas como requests atendem APIs bem estruturadas, o acesso a portais de concessionárias exige controle de navegador. O Playwright assíncrono destaca-se pelo gerenciamento nativo de contextos isolados e suporte a downloads controlados.
python
import asyncio
from playwright.asyncapi import asyncplaywright
async def baixarfaturadistribuidora(portalurl, credenciais, pastadestino):
async with asyncplaywright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.newcontext(acceptdownloads=True)
page = await context.newpage()
await page.goto(portal_url)
# Autenticação genérica parametrizada
await page.fill('#input-usuario', credenciais['usuario'])
await page.fill('#input-senha', credenciais['senha'])
await page.click('#btn-login')
await page.wait_for_selector('.painel-faturas')
# Captura e execução segura de download
async with page.expect_download() as download_info:
await page.click('.btn-download-ultima-fatura')
download = await download_info.value
caminho_final = f"{pasta_destino}/{credenciais['unidade_consumidora']}.pdf"
await download.save_as(caminho_final)
await browser.close()
return caminho_final
Para centenas de contas, executar o processo sequencialmente geraria um tempo de execução proibitivo. O controle de concorrência com asyncio.Semaphore permite limitar requisições simultâneas para 5 a 10 threads de navegador, evitando bloqueios de IP nos servidores das distribuidoras.
2. Extração e Normalização de Dados de Faturas
Após a obtenção dos arquivos em lote, entra em ação a extração de dados. PDFs de faturas dividem-se em dois tipos:
- PDFs baseados em texto: Extraíveis diretamente via bibliotecas como
pdfplumberoupypdf. - PDFs rasterizados (escaneados): Exigem OCR estruturado com Tesseract ou pipelines multimodais.
Como especialista em IA e automação de dados, recomendo uma abordagem híbrida: expressões regulares com validação semântica para extrair valores-chave (consumo total, valor faturado, histórico e impostos) e modelos de linguagem aplicados a extração estruturada quando a concessionária altera o layout sem aviso prévio.
Exemplo de normalização tabular para comparação:
python
import pdfplumber
import re
import pandas as pd
def extrairmetricasfatura(caminhopdf):
dados = {}
with pdfplumber.open(caminhopdf) as pdf:
texto = “n”.join([pagina.extracttext() for pagina in pdf.pages if pagina.extracttext()])
# Expressões regulares adaptadas para encontrar métricas essenciais
consumo_match = re.search(r'Totals+Consumos*:s*(d+[,.]?d*)s*kWh', texto, re.IGNORECASE)
valor_match = re.search(r'Totals+as+Pagars*:s*R$s*(d+[,.]?d{2})', texto, re.IGNORECASE)
dados['consumo_kwh'] = float(consumo_match.group(1).replace(',', '.')) if consumo_match else None
dados['valor_total'] = float(valor_match.group(1).replace('.', '').replace(',', '.')) if valor_match else None
return dados
3. Matriz Comparativa e Auditoria Automática
Com os dados consolidados em um DataFrame do Pandas, o sistema cruza as informações para identificar anomalias financeiras e operacionais:
- Tarifa Média por kWh: Cálculo de
valor_total / consumo_kwhpara identificar distribuidoras ou filiais com cobranças desproporcionais. - Detecção de Picos Anômalos: Comparação com a média móvel dos últimos meses da mesma unidade.
- Identificação de Cobranças Indevidas: Verificação de multas por ultrapassagem de demanda contratada ou bandeiras tarifárias aplicadas incorretamente.
python
Exemplo de cálculo de consistência
df[‘tarifaefetiva’] = df[‘valortotal’] / df[‘consumokwh’] df[‘alertaanomalia’] = df[‘tarifaefetiva’] > (df[‘tarifaefetiva’].mean() + 2 * df[‘tarifa_efetiva’].std())
Benefícios Práticos da Solução Automatizada
- Redução Drástica de Tempo: O processamento de 500 faturas passa de dezenas de horas para menos de 15 minutos em um servidor intermediário.
- Confiabilidade Contábil: Fim dos erros manuais de digitação nos relatórios de conciliação financeira.
- Base Pronta para Auditoria: Todos os PDFs são catalogados e estruturados com metadados unificados para conformidade fiscal.
Conclusão e Próximos Passos
A automação de rotinas de faturamento entre múltiplos estados exige resiliência contra mudanças de interface, orquestração robusta de tarefas assíncronas e arquitetura escalável.
Se sua empresa enfrenta gargalos com download manual de contas, auditoria tarifária ou integração de PDFs legados ao seu ERP, entre em contato para desenvolvermos uma solução de engenharia de automação sob medida para o seu fluxo operacional.


