Files
TextNLPClassifierApp/graphify-out/cache/ast/v0.9.47-s2/dcff19204ab04403030b2339663c0d3c161744f50a53f5254c459a894eb3b3c8.json
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

1 line
18 KiB
JSON

{"nodes": [{"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_md", "label": "googlenews_extractor_guia_completo.md", "file_type": "document", "node_kind": "page", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L1"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "label": "Extrator de Not\u00edcias do Google News \u2014 Guia Completo de Funcionamento", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L1"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_1_vis\u00e3o_geral_arquitetura", "label": "1. Vis\u00e3o geral (arquitetura)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L9"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_entrada", "label": "2. Entrada", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L56"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_1_dto_de_entrada_googlenews_etl_application_dtos_extract_news_dto_py", "label": "2.1 DTO de entrada (`googlenews_etl/application/dtos/extract_news_dto.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L58"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_2_value_object_de_valida\u00e7\u00e3o_googlenews_etl_domain_entities_search_query_py", "label": "2.2 Value Object de valida\u00e7\u00e3o (`googlenews_etl/domain/entities/search_query.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L77"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "label": "3. Processamento \u2014 passo a passo", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L117"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_1_o_caso_de_uso_googlenews_etl_application_use_cases_extract_news_use_case_py", "label": "3.1 O caso de uso (`googlenews_etl/application/use_cases/extract_news_use_case.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L119"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_2_a_porta_googlenews_etl_domain_ports_news_extractor_port_py", "label": "3.2 A porta (`googlenews_etl/domain/ports/news_extractor_port.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L173"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "label": "3.3 O adaptador concreto \u2014 o cora\u00e7\u00e3o do extrator (`googlenews_etl/infrastructure/adapters/google_news_extractor_adapter.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L188"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_1_inicializa\u00e7\u00e3o_sess\u00e3o_http_com_impersona\u00e7\u00e3o_de_browser", "label": "3.3.1 Inicializa\u00e7\u00e3o: sess\u00e3o HTTP com impersona\u00e7\u00e3o de browser", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L190"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_2_mapeamento_idioma_par\u00e2metros_hl_gl_get_hl_gl", "label": "3.3.2 Mapeamento idioma \u2192 par\u00e2metros `hl`/`gl` (`_get_hl_gl`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L220"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_3_extra\u00e7\u00e3o_do_rss_o_ponto_fundamental_fetch_rss", "label": "3.3.3 \u2605 Extra\u00e7\u00e3o do RSS \u2014 o ponto fundamental (`_fetch_rss`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L257"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_4_orquestra\u00e7\u00e3o_com_resolu\u00e7\u00e3o_de_urls_extract", "label": "3.3.4 Orquestra\u00e7\u00e3o com resolu\u00e7\u00e3o de URLs (`extract`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L313"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_4_resolu\u00e7\u00e3o_de_urls_googlenews_etl_infrastructure_adapters_playwright_url_resolver_adapter_py", "label": "3.4 Resolu\u00e7\u00e3o de URLs (`googlenews_etl/infrastructure/adapters/playwright_url_resolver_adapter.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L339"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_5_rate_limiter_googlenews_etl_domain_services_rate_limiter_service_py", "label": "3.5 Rate limiter (`googlenews_etl/domain/services/rate_limiter_service.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L395"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_4_entidade_de_dom\u00ednio_da_not\u00edcia_googlenews_etl_domain_entities_news_article_py", "label": "4. Entidade de dom\u00ednio da not\u00edcia (`googlenews_etl/domain/entities/news_article.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L414"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_sa\u00edda", "label": "5. Sa\u00edda", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L446"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_1_dtos_de_sa\u00edda_googlenews_etl_application_dtos_extract_news_dto_py", "label": "5.1 DTOs de sa\u00edda (`googlenews_etl/application/dtos/extract_news_dto.py`)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L448"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_2_exemplo_de_sa\u00edda_json", "label": "5.2 Exemplo de sa\u00edda JSON", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L472"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_6_resumo_do_fluxo_completo_entrada_sa\u00edda", "label": "6. Resumo do fluxo completo (entrada \u2192 sa\u00edda)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L497"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_7_depend\u00eancias_para_rodar_o_que_n\u00e3o_est\u00e1_nos_4_arquivos_centrais", "label": "7. Depend\u00eancias para rodar (o que N\u00c3O est\u00e1 nos 4 arquivos centrais)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L525"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_depend\u00eancias_de_bibliotecas_requirements", "label": "Depend\u00eancias de bibliotecas (requirements)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L540"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_comportamentos_observ\u00e1veis_honestidade", "label": "Comportamentos observ\u00e1veis (honestidade)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L548"}, {"id": "$graphify-root$_docs_googlenews_extractor_guia_completo_8_como_chamar_exemplo_de_uso", "label": "8. Como chamar (exemplo de uso)", "file_type": "document", "node_kind": "heading", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L559"}], "edges": [{"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_md", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_1_vis\u00e3o_geral_arquitetura", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L9", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_entrada", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_entrada", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_1_dto_de_entrada_googlenews_etl_application_dtos_extract_news_dto_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L58", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_entrada", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_2_2_value_object_de_valida\u00e7\u00e3o_googlenews_etl_domain_entities_search_query_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L77", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L117", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_1_o_caso_de_uso_googlenews_etl_application_use_cases_extract_news_use_case_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L119", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_2_a_porta_googlenews_etl_domain_ports_news_extractor_port_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L173", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L188", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_1_inicializa\u00e7\u00e3o_sess\u00e3o_http_com_impersona\u00e7\u00e3o_de_browser", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L190", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_2_mapeamento_idioma_par\u00e2metros_hl_gl_get_hl_gl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L220", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_3_extra\u00e7\u00e3o_do_rss_o_ponto_fundamental_fetch_rss", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L257", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_o_adaptador_concreto_o_cora\u00e7\u00e3o_do_extrator_googlenews_etl_infrastructure_adapters_google_news_extractor_adapter_py", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_3_4_orquestra\u00e7\u00e3o_com_resolu\u00e7\u00e3o_de_urls_extract", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L313", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_4_resolu\u00e7\u00e3o_de_urls_googlenews_etl_infrastructure_adapters_playwright_url_resolver_adapter_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L339", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_processamento_passo_a_passo", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_3_5_rate_limiter_googlenews_etl_domain_services_rate_limiter_service_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L395", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_4_entidade_de_dom\u00ednio_da_not\u00edcia_googlenews_etl_domain_entities_news_article_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L414", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_sa\u00edda", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L446", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_sa\u00edda", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_1_dtos_de_sa\u00edda_googlenews_etl_application_dtos_extract_news_dto_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L448", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_sa\u00edda", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_5_2_exemplo_de_sa\u00edda_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L472", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_6_resumo_do_fluxo_completo_entrada_sa\u00edda", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L497", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_7_depend\u00eancias_para_rodar_o_que_n\u00e3o_est\u00e1_nos_4_arquivos_centrais", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L525", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_7_depend\u00eancias_para_rodar_o_que_n\u00e3o_est\u00e1_nos_4_arquivos_centrais", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_depend\u00eancias_de_bibliotecas_requirements", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L540", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_7_depend\u00eancias_para_rodar_o_que_n\u00e3o_est\u00e1_nos_4_arquivos_centrais", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_comportamentos_observ\u00e1veis_honestidade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L548", "weight": 1.0}, {"source": "$graphify-root$_docs_googlenews_extractor_guia_completo_extrator_de_not\u00edcias_do_google_news_guia_completo_de_funcionamento", "target": "$graphify-root$_docs_googlenews_extractor_guia_completo_8_como_chamar_exemplo_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/googlenews_extractor_guia_completo.md", "source_location": "L559", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}