Files
TextNLPClassifierApp/graphify-out/cache/ast/v0.9.47-s2/6e21eba445b58b4993c56ccfb6d1ec43858c6af6917306dce21c222f7cb25ea0.json
andreferraro 6e3d57619b feat(extractor): add Google News headlines extractor with Foxcape headless and URL resolution
- 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
2026-08-20 11:50:16 -03:00

1 line
13 KiB
JSON

{"nodes": [{"id": "$graphify-root$_readme_md", "label": "README.md", "file_type": "document", "node_kind": "page", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_textnlpclassifierapp", "label": "\ud83e\udde0 TextNLPClassifierApp", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_tabela_de_conte\u00fados", "label": "\ud83d\udcd1 Tabela de Conte\u00fados", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L13"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral", "label": "\ud83c\udf1f Vis\u00e3o Geral", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L34"}, {"id": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "label": "\u2699\ufe0f Instala\u00e7\u00e3o e Setup", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L43"}, {"id": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "label": "1. Clonar o Reposit\u00f3rio e Criar Ambiente Virtual", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L45"}, {"id": "$graphify-root$_readme_2_instalar_depend\u00eancias", "label": "2. Instalar Depend\u00eancias", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L58"}, {"id": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "label": "3. Baixar Bin\u00e1rios do Navegador Stealth (Camoufox)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L64"}, {"id": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "label": "1. \ud83e\udde0 Classificador de Conte\u00fado e Iner\u00eancia (NLP / LLM / ECP)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L74"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L76"}, {"id": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "label": "Arquitetura de Classifica\u00e7\u00e3o em 3 Tiers", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L82"}, {"id": "$graphify-root$_readme_categorias_de_decis\u00e3o", "label": "Categorias de Decis\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L103"}, {"id": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "label": "Formato do ECP Snapshot e Markdown", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L112"}, {"id": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "label": "Exemplo de ECP Snapshot (`ecp_sample.json`):", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L114"}, {"id": "$graphify-root$_readme_exemplos_de_uso_cli", "label": "Exemplos de Uso CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L136"}, {"id": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "label": "2. \ud83d\udcf0 Extrator de Manchetes do Google News", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L151"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_153", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L153"}, {"id": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "label": "Diferenciais T\u00e9cnicos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L157"}, {"id": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "label": "Argumentos e Flags de Linha de Comando", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L165"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L178"}, {"id": "$graphify-root$_readme_1_river_plate_argentina_espanhol_2_p\u00e1ginas_salvar_em_arquivo", "label": "1. River Plate (Argentina / Espanhol / 2 P\u00e1ginas / Salvar em Arquivo)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L180"}, {"id": "$graphify-root$_readme_2_cruzeiro_brasil_portugu\u00eas_formatado_no_terminal", "label": "2. Cruzeiro (Brasil / Portugu\u00eas / Formatado no Terminal)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L194"}, {"id": "$graphify-root$_readme_3_f\u00f3rmula_1_inglaterra_ingl\u00eas", "label": "3. F\u00f3rmula 1 (Inglaterra / Ingl\u00eas)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L199"}, {"id": "$graphify-root$_readme_4_filtragem_com_jq_em_modo_silencioso", "label": "4. Filtragem com `jq` em Modo Silencioso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L204"}, {"id": "$graphify-root$_readme_estrutura_do_projeto", "label": "\ud83d\udcc1 Estrutura do Projeto", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L211"}, {"id": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "label": "\ud83e\uddea Testes e Qualidade de C\u00f3digo", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L238"}, {"id": "$graphify-root$_readme_licen\u00e7a", "label": "\ud83d\udcc4 Licen\u00e7a", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L259"}], "edges": [{"source": "$graphify-root$_readme_md", "target": "$graphify-root$_readme_textnlpclassifierapp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_tabela_de_conte\u00fados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_vis\u00e3o_geral", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L34", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L43", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L45", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_2_instalar_depend\u00eancias", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L58", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L64", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L74", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L76", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L82", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_categorias_de_decis\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L103", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L112", "weight": 1.0}, {"source": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "target": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L114", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_exemplos_de_uso_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L136", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L151", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_153", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L153", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L157", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L165", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L178", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "target": "$graphify-root$_readme_1_river_plate_argentina_espanhol_2_p\u00e1ginas_salvar_em_arquivo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L180", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "target": "$graphify-root$_readme_2_cruzeiro_brasil_portugu\u00eas_formatado_no_terminal", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L194", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "target": "$graphify-root$_readme_3_f\u00f3rmula_1_inglaterra_ingl\u00eas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L199", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "target": "$graphify-root$_readme_4_filtragem_com_jq_em_modo_silencioso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L204", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_estrutura_do_projeto", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L211", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L238", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_licen\u00e7a", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L259", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}