News Crawler Skill 设计概览
设计目标
这套实现不是单纯把“抓新闻”做成一个脚本,而是把以下三件事合并成同一条产品链路:
- 新闻来源和分类的结构化配置。
- 面向站点消费的统一 JSON 契约。
- 能直接被团队阅读和维护的在线文档。
配置分层
| 文件 | 角色 | 为什么重要 |
|---|---|---|
config/categories.json | 定义五大专区的名称、图标、路径和关注重点 | 页面导航、组件渲染和文档说明都来自这里 |
config/news_sources.json | 定义来源、节奏、来源类型和备注 | 用来约束抓取器与来源矩阵,而不是散落在脚本里 |
scripts/crawl_news.js | 把配置翻译成可发布的数据产物 | 当前默认优先抓取真实源,并在源失败时按分类兜底 |
public/api/*.json | 前端运行时消费的数据 | 站点和 API 契约在同一仓库内闭环 |
能力拆分
查看 Mermaid 源码
flowchart TD
A["分类配置"] --> D["统一内容模型"]
B["来源配置"] --> D
C["真实源抓取 / 分类兜底脚本"] --> D
D --> E["latest.json"]
D --> F["categories/*.json"]
D --> G["daily/YYYY-MM-DD.json"]
E --> H["今日总览"]
F --> I["分类专区页"]
G --> J["归档与自动化"]
为什么采用“真实源优先 + 分类兜底”
- 真实抓取链路仍然会受网络、反爬和页面结构变化影响。
- 站点和自动化不能因为某一个来源失败就整体停摆。
- 只要输出结构保持一致,真实源、聚合 feed 和分类兜底都可以共存。
统一数据契约
json
{
"id": "tech-01",
"title": "企业级 Agent 产品开始进入流程重构阶段",
"source": "36氪",
"sourceId": "kr36",
"category": "tech",
"categoryName": "科技资讯",
"url": "https://36kr.com/",
"summary": "面向页面展示的原始摘要",
"aiSummary": "更强调结构化判断的摘要",
"tags": ["Agent", "企业软件"],
"hotValue": 995000,
"importance": 9.4,
"timestamp": "2026-03-24T08:39:00+08:00"
}设计原则
- 页面只依赖统一契约,不依赖具体抓取实现。
- 配置要能解释“为什么有这个专区/来源”,而不只是“如何抓取”。
- skill 文档要让后来的人能快速判断哪里该加来源、哪里该加页面、哪里该换脚本实现。