Files
andreferraro 6a45368cb0 feat(extractor): implement multi-engine article content extractor
- Added scripts/extract_article_contents.py for batch scraping with stealth Foxcape and triple extraction (Trafilatura, Newspaper4k, Readability)
- Created unit, integration, and E2E test suite in tests/test_extract_article_contents.py (90/90 passing)
- Updated specs/003-article-content-extractor and README.md with usage documentation and CLI contracts
- Passed ruff linting/formatting and mypy type checking cleanly
2026-08-20 19:22:20 -03:00

4.3 KiB

Data Model: Article Content Multi-Engine Extractor

1. Entities & Value Objects

1.1 InputArticle (Value Object)

Representa uma notícia contida no arquivo JSON de entrada.

Campo Tipo Obrigatório Descrição
titulo str Sim Título original capturado na busca.
url str Sim URL final/resolvida da matéria.
pagina int Não (default: 1) Página em que o artigo foi encontrado.
subtitulo `str None` Não
quando_publicado `str None` Não

1.2 TrafilaturaData (Value Object)

Dados estruturados extraídos pelo motor Trafilatura.

Campo Tipo Descrição
title `str None`
author `str None`
date `str None`
description `str None`
categories list[str] Categorias editoriais extraídas.
tags list[str] Tags associadas ao artigo.
canonical_url `str None`
text str Texto principal limpo e higienizado.
raw_json dict[str, Any] Payload completo retornado pelo trafilatura.extract(..., output_format='json').
error `str None`

1.3 NewspaperData (Value Object)

Dados estruturados e enriquecidos com NLP pelo motor Newspaper4k.

Campo Tipo Descrição
title `str None`
authors list[str] Lista de autores extraídos.
publish_date `str None`
text str Texto integral limpo da matéria.
summary `str None`
keywords list[str] Palavras-chave relevantes identificadas por NLP.
top_image `str None`
images list[str] Lista de URLs de imagens presentes no artigo.
meta_data dict[str, Any] Dicionário com metadados brutos OpenGraph e Schema.
error `str None`

1.4 ReadabilityData (Value Object)

Dados higienizados pelo algoritmo Readability (readability-lxml).

Campo Tipo Descrição
title `str None`
short_title `str None`
cleaned_html `str None`
cleaned_text `str None`
error `str None`

1.5 ExtractedArticle (Entity)

Resultado consolidado da extração de uma notícia específica.

Campo Tipo Descrição
input_meta InputArticle Metadados da notícia original.
extraction_status Literal["success", "failed"] Status global do processamento do artigo.
error_message `str None`
crawled_url str URL efetivamente navegada no navegador.
page_title `str None`
http_status `int None`
trafilatura `TrafilaturaData None`
newspaper4k `NewspaperData None`
readability `ReadabilityData None`

1.6 ExtractionBatchReport (Aggregate Root)

Relatório consolidado de saída do processamento de um lote.

Campo Tipo Descrição
source_file str Caminho do arquivo JSON de entrada processado.
processed_at str Timestamp ISO 8601 UTC do momento da execução.
total_articles int Total de artigos processados do arquivo de entrada.
successful_articles int Quantidade de artigos extraídos com sucesso.
failed_articles int Quantidade de artigos que falharam na extração.
articles list[ExtractedArticle] Lista de artigos enriquecidos com suas extrações.