- Add standalone CLI script scripts/extract_google_news.py for Google News RSS scraping - Integrate foxcape in headless mode as primary stealth anti-bot engine - Implement parallel article URL resolution using googlenewsdecoder and ThreadPoolExecutor - Support language and regional locale mapping (-l, --lang, --locale) - Implement real-time progress logging in stderr and --silent flag - Add unit, integration, and live E2E tests in tests/test_extract_google_news.py - Add full SpecKit documentation (specs/002-google-news-extractor/) - Create comprehensive README.md covering both NLP Classifier and Google News Extractor
1 line
18 KiB
JSON
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": "L75"}, {"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": "L113"}, {"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": "L115"}, {"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": "L168"}, {"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": "L183"}, {"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": "L185"}, {"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": "L213"}, {"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": "L250"}, {"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": "L306"}, {"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": "L332"}, {"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": "L384"}, {"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": "L403"}, {"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": "L435"}, {"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": "L437"}, {"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": "L461"}, {"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": "L486"}, {"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": "L514"}, {"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": "L529"}, {"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": "L537"}, {"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": "L548"}], "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": "L75", "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": "L113", "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": "L115", "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": "L168", "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": "L183", "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": "L185", "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": "L213", "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": "L250", "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": "L306", "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": "L332", "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": "L384", "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": "L403", "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": "L435", "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": "L437", "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": "L461", "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": "L486", "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": "L514", "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": "L529", "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": "L537", "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": "L548", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} |