- 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
4.3 KiB
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. |