# English Financial News — 项目开发计划 > 国际财经新闻抓取与深度研究平台 > > 对标 `news/` (A 股 Deep Research),复用其架构模式,聚焦英文财经源。 --- ## 一、项目定位 构建面向国际财经新闻的私有化 Deep Research 平台。 核心能力: - 英文财经新闻抓取(Crawl4AI) - 新闻联播数据接入(api.doorcome.cn) - 全文英译中(LLM) - 投资事件抽取(LLM) - 双语向量知识库(Qdrant) - MCP 服务 + Cherry Studio / Claude Code Agent 深度研究 - 每日 AI 摘要日报(含新闻联播投资相关解读) 本项目不是: - 交易系统 - 预测系统 - 投资顾问 --- ## 二、部署拓扑 ``` ┌──────────────────────────────────────────────────────────────┐ │ Overseas Server (国外) │ │ M1 Crawl4AI 抓取 → data/raw/{source}/{YYYYMMDD}/ │ │ ↓ │ │ rsync 增量推送 (定时) │ └──────────────────────────┬───────────────────────────────────┘ │ SSH / rsync ▼ ┌──────────────────────────────────────────────────────────────┐ │ Domestic Server (国内) │ │ M2 正文提取 → M3 去重 → M4 翻译+事件抽取(LLM) │ │ → M5 向量生成 → M6 Qdrant 入库 │ │ → M7 定时调度 → M8 MCP 服务 │ │ → 日报生成 (AI 摘要 + 重要事件 + 新闻联播投资解读) │ │ │ │ ┌── 新闻联播数据源 (独立 API) ──┐ │ │ │ GET api.doorcome.cn/api/xwlbFine/ │ │ │ → LLM 筛选投资相关 → 重要性评分 → AI 解读 │ │ └──────────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘ ``` 同步机制: - 海外服务器每天定时 `rsync -avz` 推送 `data/raw/` 到国内 - 国内定时任务先拉取同步,再执行 M2→M8 管道 - rsync 天然增量(只传新文件),带宽高效 --- ## 三、Milestone 分解 ### M0 — 项目骨架 - `pyproject.toml`(Python 3.11 + uv) - `.env.example` - `configs/sources.yaml`(英文财经源配置) - `CLAUDE.md` - 目录结构初始化 - CLI 入口:`en-news` ### M1 — 新闻抓取(海外服务器) **技术选型**:Crawl4AI(异步 + Playwright JS 渲染),与 A 股项目一致。 **英文财经源**(初始 12 个): | 源 ID | 名称 | 类型 | |-------|------|------| | reuters | Reuters | 综合财经 | | cnbc | CNBC | 市场新闻 | | marketwatch | MarketWatch | 市场数据 | | ft | Financial Times | 财经深度 | | yahoo_finance | Yahoo Finance | 综合 | | investing | Investing.com | 全球市场 | | seekingalpha | Seeking Alpha | 投资分析 | | barrons | Barrons | 市场评论 | | wsj | WSJ | 综合财经 | | economist | The Economist | 经济分析 | | forexlive | ForexLive | 外汇新闻 | | zerohedge | ZeroHedge | 另类财经 | 每个源配置字段: ```yaml - id: "reuters" name: "Reuters" enabled: true homepage: "https://www.reuters.com/business/" article_url_pattern: "/[^/]+/[^/]+/" js_render: true max_articles_per_run: 30 ``` **产物**:`data/raw/{source_id}/{YYYYMMDD}/{url_hash}.html` + `index.jsonl` **同步守护进程**: ```bash # 海外 crontab:每天 05:00 UTC 推送 0 5 * * * rsync -avz --ignore-existing /app/data/raw/ user@domestic:/app/data/raw/ ``` ### M2 — 正文提取(国内服务器) **输入**:`data/raw/{source_id}/{date}/`(rsync 同步后) **提取方案**: - 优先使用 Crawl4AI 输出的 Markdown(`{url_hash}.md`) - 对未生成 Markdown 的源,用 `trafilatura`(英文正文提取,类 GNE 但针对英文优化) - 输出标准化 `Article` 模型(`title` / `content` / `publish_time` / `author` / `source_id`) **产物**:`data/processed/{source_id}/{YYYYMMDD}/{url_hash}.json` ### M3 — 去重 与 A 股项目相同的三层去重: 1. URL Hash(精确) 2. 内容 Hash(SHA256 前 64 字符) 3. SimHash 模糊(汉明距离 ≤ 3,30 天窗口) **产物**:`data/deduped/{YYYYMMDD}/uniques/{url_hash}.json` ### M4 — 翻译 + 投资事件抽取(LLM) **单次 LLM 调用完成两件事**(节省 token): Prompt 设计: ``` 输入:英文财经新闻全文 输出 JSON: { "translation_zh": "中文全文翻译", "events": [ { "event_type": "并购/财报/政策/行业/...", "stock_codes": ["AAPL", "TSLA"], "sentiment": "positive/negative/neutral", "importance": 1-5, "summary_zh": "事件中文摘要" } ] } ``` **LLM Provider**:DeepSeek(默认)/ Qwen 备选 **产物**:`data/events/{YYYYMMDD}/{url_hash}.json` ```json { "title": "Apple Reports Record Q2 Earnings", "title_zh": "苹果公布创纪录第二季度财报", "content_en": "...", "content_zh": "...", "events": [...] } ``` ### M5 — 向量生成 - Embedding Provider:DashScope `text-embedding-v3`(1024 维) - 对中文翻译内容向量化(`content_zh` + `title_zh` + 事件摘要拼接) - 也可选择英文原文向量化,支持双语检索 **产物**:`data/embeddings/{YYYYMMDD}/{url_hash}.json` ### M6 — Qdrant 入库与检索 与 A 股项目相同: - 本地文件模式(默认)或 Docker Server 模式 - Collection:`en_finance_news` - Payload:`source_id` / `title` / `title_zh` / `url` / `publish_time` / `events` / `sentiment` / `importance` - Vector:从 M5 产物加载 ```python uv run en-news search "Fed interest rate decision" ``` ### M7 — 新闻联播数据源(独立模块) **数据获取**: ``` GET https://api.doorcome.cn/api/xwlbFine/?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD ``` **响应结构**: ```json { "status": "success", "data": { "news": [ { "news_days": "2026-06-20", "daily_sub_id": 1, "news_title": "牢记总书记嘱托 各地在文脉赓序中推动城市高质量发展", "news_improve": "历史文化是城市的灵魂...(全文约3000字)" } ] } } ``` 每天约 12-15 条新闻,每条含完整文字稿。 **处理流程**: 1. **获取** — 日报生成前拉取昨日新闻联播数据。例如 6/21 早上执行日报 → 拉取 6/20 的新闻联播(前一日 19:00 播出,次日凌晨 API 已就绪) 2. **投资相关性筛选(LLM)** — 用 DeepSeek 逐条判断是否与投资相关 - 经济数据、产业政策、贸易谈判 → **高相关**(importance 4-5) - 科技创新、区域发展、基建项目 → **中相关**(importance 2-3) - 文化、民生、体育、天气 → **非相关**(跳过) 3. **AI 解读** — 对投资相关条目生成 2-3 句投资视角解读: - 对哪些行业/板块有影响 - 政策信号含义 - 市场可能的反应 4. **纳入日报** — 单独一节展示,区别于英文财经新闻 **产物**:`data/xwlb/{YYYYMMDD}/index.jsonl` ```json { "news_days": "2026-06-20", "daily_sub_id": 5, "news_title": "中欧班列统一品牌十周年", "is_investment_related": true, "importance": 4, "category": "贸易/物流", "ai_interpretation": "中欧班列十年数据将直接反映一带一路贸易活跃度,利好物流、港口、跨境贸易板块..." } ``` ### M8 — 定时调度 - 国内 crontab 或 APScheduler 守护进程 - 日期规则:T 日早上生成的日报覆盖 T-1 日数据(新闻 + 新闻联播) - 流程: ``` 06:00 等待海外 rsync 完成(检查哨兵文件) 06:30 M2→M3→M4→M5→M6 全链路(处理 T-1 日英文新闻) 07:00 拉取 T-1 日新闻联播 → LLM 筛选解读 → 日报生成 12:00 增量(只处理当日新增) 18:00 增量 22:00 增量 + 日报 ``` ### M9 — MCP 服务 暴露 5 个 MCP 工具给 Cherry Studio / Claude Code: | 工具 | 功能 | |------|------| | `search_en_news` | 通用语义检索(中文查询 → 中文翻译向量匹配) | | `search_by_company` | 按公司名/股票代码检索 | | `search_by_sentiment` | 按情绪检索+统计 | | `search_by_event_type` | 按事件类型检索 | | `get_daily_report` | 获取最新日报 | --- ## 四、数据模型 ```python class EnArticle(BaseModel): source_id: str url: str url_hash: str title: str # 英文原标题 title_zh: str # 中文翻译标题 content_en: str # 英文原文 content_zh: str # 中文全文翻译 author: str publish_time: datetime source_name: str word_count: int word_count_zh: int class EnExtractedEvent(BaseModel): article_url_hash: str event_type: str # 并购/财报/政策/行业/市场/... stock_codes: list[str] # 涉及美股代码 sentiment: str # positive/negative/neutral importance: int # 1-5 summary_zh: str # 中文摘要 summary_en: str # 英文摘要 class XwlbItem(BaseModel): """新闻联播条目(经 LLM 筛选和解读)。""" news_days: str # 播出日期 "2026-06-20" daily_sub_id: int # 当日序号 (1-15) news_title: str # 标题 news_improve: str # 完整文字稿 is_investment_related: bool # 是否投资相关 importance: int # 投资重要性 1-5 (非投资为 0) category: str # 投资类别 (贸易/产业政策/科技/基建/金融/...) ai_interpretation: str # AI 投资解读 2-3 句 ``` --- ## 五、日报设计 命令:`uv run en-news pipeline --once --report` 执行顺序:新闻联播拉取 → LLM 筛选解读 → 日报 HTML 生成 六段式结构: 1. **AI 摘要**(24h 国际财经 + 昨日新闻联播投资相关,≤500 字,最后一条不截断) 2. **重要事件:国际新闻**(24h 英文源,importance ≥ 4 逐级回退,最多 20 篇) 3. **📺 新闻联播投资解读**(昨日播出,投资相关条目 + AI 解读) - 展示格式:标题 | 投资相关性类别 | 重要度 | AI 解读(2-3 句) - 非投资相关条目不显示 - 示例: ``` 📺 中欧班列统一品牌十周年 [贸易/物流] ⭐⭐⭐⭐ AI解读: 中欧班列十年数据将直接反映一带一路贸易活跃度。 关注物流、港口、跨境贸易板块。政策利好中国外运、中远海控等。 ``` 4. **市场情绪分布**(利好/利空/中性,24h 国际新闻 + 新闻联播合并统计) 5. **数据总览**(M1→M6 管道统计 + 各源抓取量 6 列网格 + 重要度分布 + 事件类型分布 + 新闻联播条目数) 6. **完整新闻联播条目列表**(当天的全部条目,标题+简要,含非投资类,供快速浏览) --- ## 六、配置规范 ### configs/sources.yaml ```yaml settings: concurrency: 5 user_agent: "Mozilla/5.0 ..." output_root: "data/raw" sources: - id: "reuters" name: "Reuters" enabled: true homepage: "https://www.reuters.com/business/" article_url_pattern: "/[^/]+/[^/]+/" js_render: false max_articles_per_run: 30 ``` ### .env 关键配置 ```bash # LLM LLM_PROVIDER=deepseek LLM_MODEL=deepseek-v4-flash DEEPSEEK_API_KEY=sk-xxx # Embedding EMBEDDING_PROVIDER=dashscope DASHSCOPE_API_KEY=sk-xxx # 新闻联播 XWLB_API_BASE=https://api.doorcome.cn # Schedule SCHEDULE_TIMES=06:30,12:00,18:00,22:00 SYNC_WAIT_SEC=300 # Qdrant QDRANT_COLLECTION=en_finance_news # Overseas → Domestic SYNC_HOST=user@domestic-server SYNC_PORT=22 SYNC_SENTINEL=/tmp/en_news_sync_done ``` --- ## 七、目录结构 ``` english-news/ ├── crawler/ # M1 新闻抓取(Crawl4AI, 部署海外) ├── extractor/ # M2 英文正文提取(trafilatura) ├── dedup/ # M3 三层去重 ├── translator/ # M4a 全文翻译(LLM) ├── llm/ # M4b 投资事件抽取 ├── embedding/ # M5 向量生成 ├── vectorstore/ # M6 Qdrant 客户端 ├── xwlb/ # M7 新闻联播数据源 ├── scheduler/ # M8 定时任务 ├── mcp_server/ # M9 MCP 服务 ├── app/ # CLI 入口(en-news) ├── configs/ # sources.yaml / system config ├── prompts/ # LLM Prompt 模板 ├── scripts/ # 部署 & 运维脚本 │ ├── sync_daemon.sh # 海外 rsync 推送脚本 │ └── wait_for_sync.py # 国内等待同步完成 ├── tests/ # pytest ├── docs/ # 设计文档 ├── data/ # 数据目录(git ignored) │ ├── raw/ # M1 产物(海外与国内共享) │ ├── processed/ # M2 产物 │ ├── deduped/ # M3 产物 │ ├── events/ # M4 产物 │ ├── embeddings/ # M5 产物 │ ├── xwlb/ # 新闻联播数据(经 LLM 筛选与解读) │ ├── qdrant_storage/ # M6 Qdrant 本地存储 │ └── reports/ # 日报 HTML ├── logs/ # 运行日志 ├── pyproject.toml ├── CLAUDE.md └── README.md ``` --- ## 八、技术选型对比 | 模块 | A 股项目 | 英文财经项目 | 差异 | |------|---------|-------------|------| | 抓取 | Crawl4AI | Crawl4AI | 一致 | | 正文提取 | GNE | trafilatura | 英文优化 | | 翻译 | — | LLM (DeepSeek) | **新增** | | 去重 | 三层 | 三层 | 一致 | | LLM 事件 | DeepSeek/Qwen | DeepSeek/Qwen | 一致 | | Embedding | DashScope | DashScope | 一致 | | 向量库 | Qdrant | Qdrant | 一致 | | 新闻联播 | — | api.doorcome.cn + LLM 筛选 | **新增** | | 调度 | APScheduler | APScheduler | 一致 | | MCP | FastMCP | FastMCP | 一致 | | CLI | a-share | en-news | 命名区分 | --- ## 九、开发优先级(建议顺序) | 序号 | Milestone | 预估工期 | 依赖 | |------|-----------|---------|------| | 1 | M0 项目骨架 | 0.5 天 | — | | 2 | M1 抓取(海外) | 2 天 | M0 | | 3 | rsync 同步机制 | 0.5 天 | M1 | | 4 | M2 正文提取 | 1 天 | 同步就绪 | | 5 | M3 去重 | 1 天 | M2 | | 6 | M4 翻译+事件抽取 | 1.5 天 | M3 | | 7 | M5 向量 + M6 Qdrant | 1 天 | M4 | | 8 | M7 新闻联播数据源 | 1 天 | — (独立模块) | | 9 | M8 调度 + 日报 | 1.5 天 | M6, M7 | | 10 | M9 MCP 服务 | 1 天 | M6 | | **总计** | | **~11 天** | | --- ## 十、关键风险 | 风险 | 缓解措施 | |------|---------| | 英文源 JS 渲染复杂 | Crawl4AI 已有 Playwright 支持,优先使用轻量级源 | | LLM 翻译质量不稳定 | System prompt 约束翻译风格,保留原文备查 | | rsync 网络不稳定 | 添加重试机制 + 哨兵文件完整性检查 | | 海外 IP 被封 | 轮换 User-Agent,控制请求频率(≥ 2s/req) | | DeepSeek API 限流 | 并发控制 + Qwen 备选 provider | --- > 本计划文件:`~/Downloads/cc-projects/english-news-plan.md` > > 最后更新:2026-06-20