init: scripts diversos (crawlers, conversores, scrapers)

This commit is contained in:
2026-03-05 20:38:36 +00:00
commit 6ac6f4be2a
925 changed files with 850330 additions and 0 deletions

158
kb-processor/src/process_pdf.py Executable file
View File

@@ -0,0 +1,158 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Script para processar PDFs e carregar no banco de dados
Descomplicar - Agência de Aceleração Digital
https://www.descomplicar.pt
"""
import os
from pathlib import Path
from processors.pdf_processor import PDFProcessor
from processors.db_processor import DBProcessor
from processors.embedding_processor import EmbeddingProcessor
from dotenv import load_dotenv
import json
from datetime import datetime
def update_changelog(new_files: list, modified_files: list = None):
"""Atualiza o CHANGELOG.md"""
changelog_path = Path(__file__).parent.parent / 'CHANGELOG.md'
# Criar entrada para hoje
today = datetime.now().strftime('%d-%m-%Y')
entry = f"\n[1.0.0] - {today}\n"
if new_files:
entry += "\nAdicionado\n"
for file in new_files:
entry += f"- {file}\n"
if modified_files:
entry += "\nAlterado\n"
for file in modified_files:
entry += f"- {file}\n"
# Adicionar ao início do arquivo
if changelog_path.exists():
content = changelog_path.read_text()
else:
content = "# Changelog\n\nTodas as alterações notáveis neste projeto serão documentadas neste arquivo.\n"
content = content.split('\n\n', 1)[0] + '\n' + entry + '\n' + content.split('\n\n', 1)[1]
changelog_path.write_text(content)
def update_readme(processed_files: list):
"""Atualiza o README.md com informações dos documentos processados"""
readme_path = Path(__file__).parent.parent / 'README.md'
content = """# SuperBot Knowledge Base
Base de Conhecimento para o SuperBot da Descomplicar.
## Documentos Processados
| Documento | Tipo | Data | Tags |
|-----------|------|------|------|
"""
for doc in processed_files:
tags = ', '.join(doc['tags']) if isinstance(doc['tags'], list) else doc['tags']
content += f"| {doc.get('título', 'Sem título')} | {doc.get('tipo_documento', 'N/A')} | {doc.get('data_original', 'N/A')} | {tags} |\n"
content += """
## Estrutura do Projeto
- `input/`: Diretório com os PDFs originais
- `output/`: Diretório com os documentos processados em markdown
- `src/`: Código fonte
- `processors/`: Módulos de processamento
- `pdf_processor.py`: Processamento de PDFs
- `db_processor.py`: Integração com banco de dados
- `embedding_processor.py`: Geração de embeddings
"""
readme_path.write_text(content)
def main():
"""Função principal."""
# Carregar variáveis de ambiente
load_dotenv()
# Configurar diretórios
project_root = Path(__file__).parent.parent
input_dir = project_root / 'input'
output_dir = project_root / 'output'
# Criar diretórios se não existirem
input_dir.mkdir(exist_ok=True)
output_dir.mkdir(exist_ok=True)
# Inicializar processadores
db = DBProcessor()
embedding = EmbeddingProcessor()
try:
# Inicializar schema do banco de dados
print("A inicializar schema do banco de dados...")
db.init_schema()
# Lista para armazenar informações dos documentos processados
processed_docs = []
new_files = []
# Processar cada PDF no diretório de entrada
for filename in os.listdir(input_dir):
if filename.endswith('.pdf'):
input_file = os.path.join(input_dir, filename)
print(f"\nA processar ficheiro: {input_file}")
# Criar diretório de saída específico
doc_output_dir = output_dir / filename.replace('.pdf', '')
doc_output_dir.mkdir(exist_ok=True)
# Processar PDF
processor = PDFProcessor(input_file)
processor.process_content()
# Salvar em markdown
output_file = doc_output_dir / 'conteudo.md'
processor.save_markdown(str(output_file))
# Salvar metadados
metadata_file = doc_output_dir / 'metadata.json'
with open(metadata_file, 'w', encoding='utf-8') as f:
json.dump(processor.metadata, f, ensure_ascii=False, indent=2)
# Salvar no banco de dados
print("A salvar no banco de dados...")
document_id = db.save_document(
title=processor.metadata.get('título', ''),
content=processor.content,
metadata=processor.metadata,
file_path=input_file
)
print(f"Documento salvo com ID: {document_id}")
# Gerar embeddings
print("A gerar embeddings...")
embedding.update_document_embeddings(document_id)
print("Embeddings gerados com sucesso")
# Adicionar à lista de documentos processados
processed_docs.append(processor.metadata)
new_files.append(filename)
print(f"\nResultado guardado em: {doc_output_dir}")
# Atualizar documentação
if processed_docs:
update_readme(processed_docs)
update_changelog(new_files)
print("\nDocumentação atualizada com sucesso!")
except Exception as e:
print(f"Erro: {str(e)}")
if __name__ == "__main__":
main()