skills-agent-proto
使用 LangChain 1.0 构建的 Skills Agent,演示 Skills 三层加载机制的底层原理。默认使用 Anthropic,也支持 OpenAI / OpenAI-compatible 接口。 B站视频: Skills到底怎么实现?我写了个Agent跑给你看
多平台新闻 & 内容爬虫集合 | Multi-platform News & Content Crawler Suite 支持:微信公众号、Twiiter、今日头条、网易新闻、搜狐新闻、腾讯新闻、Naver、Detik、Quora 等主流平台 Supports crawling news & content from WeChat, Toutiao, Netease, Sohu, Tencent, Naver, CNN, BCC, Detik, Quora, and more
$ npx -y skills add nanmicoder/newscrawler --agent claude-code
What's inside
NewsCrawler 的首要产品是可迁移的 news-extractor Agent Skill。它把 12 个新闻与内容平台的抓取代码打包在一个自包含目录中,让 Codex、Claude Code 或其他支持 SKILL.md 的 Agent 在本地直接提取文章,返回统一 JSON 或 Markdown。
| ID | URL 识别示例 |
|---|---|
wechat | mp.weixin.qq.com/s/... |
toutiao | toutiao.com/article/... |
netease | 163.com/news/article/... |
sohu | sohu.com/a/... |
tencent | news.qq.com/rain/a/... |
lenny | lennysnewsletter.com/... |
naver | *.naver.com/... |
detik | news.detik.com/... |
quora | *.quora.com/... |
bbc | bbc.com/news/articles/... |
cnn | cnn.com/YYYY/MM/DD/... |
twitter | x.com/<user>/status/<id> |
网站结构、登录策略和反爬规则会变化。遇到失败时,先确认 URL 形态、网络访问和 Cookie 要求,再检查对应 Adapter。
只把链接交给通用 Agent 时,它通常还要自己解决“如何打开网页、哪一块才是正文、菜单和推荐要不要保留、图片顺序是什么”等问题。
| 普通浏览器路径 | NewsCrawler Skill 路径 |
|---|---|
| URL → 打开浏览器 → 加载 DOM / 无障碍树 → 识别正文 → 清理噪声 → 推理 | URL → 匹配平台 → 代码提取正文 → 统一 NewsItem → 推理 |
| 上下文可能包含脚本、导航、广告、推荐与重复链接 | 上下文只包含标题、元数据、有序正文和媒体 |
| Agent 每次都要重新理解站点结构 | 平台规则由 Adapter 维护,可测试、可复用 |
| 需要浏览器会话与多轮工具调用 | 本地命令执行,不需要常驻服务 |
它节省的不只是抓取时间,更重要的是把昂贵的模型上下文留给总结、检索、比较和判断。
2026-07-20,我们用同一篇真实的 Detik News 文章 做了对照。Skill 成功提取 10 段正文和 1 张图片。
所有文本都使用同一个 tiktoken o200k_base 编码器计数:
| 输入给 Agent 的内容 | Token | 对比完整 DOM |
|---|---|---|
| 浏览器渲染 DOM | 59,788 | 基线 |
| 浏览器无障碍快照 | 6,842 | 少 88.56% |
| 浏览器可见文本 | 1,907 | 少 96.81% |
| Skill 结构化 JSON | 1,730 | 少 97.11% |
| Skill Markdown | 633 | 少 98.94% |
结构化 JSON 从 59,788 tokens 降到 1,730 tokens,体积约为浏览器 DOM 的 1/34.56。如果 Agent 只需要阅读正文,Markdown 只要 633 tokens,约为 1/94.45。
这个结果也有边界:
body.innerText 时,JSON 少 9.28%,Markdown 少 66.81%;Skill 的额外价值是正文已经分段、去除页面噪声并带有稳定字段,而不只是字符更少。完整计数、哈希和复现口径保存在 基准记录;原网页与文章内容没有复制进仓库。
浏览器侧使用同一无登录会话加载文章,并分别取得:
document.documentElement.outerHTML → 渲染 DOM
agent-browser snapshot -c → 无障碍快照
agent-browser get text body → 可见文本
Skill 侧执行:
cd .claude/skills/news-extractor
uv sync
uv run scripts/extract_news.py \
"https://news.detik.com/berita/d-8562773/gunung-anak-krakatau-erupsi-muntahkan-abu-vulkanik-150-meter" \
--format both
最后用 tiktoken.get_encoding("o200k_base") 分别统计 DOM、无障碍快照、可见文本、JSON 和 Markdown。
news-extractor 遵循开放的 Agent Skills 规范,可以被 vercel-labs/skills 从仓库中自动发现和安装。Skill 的源目录是 .claude/skills/news-extractor,其中包含完整的 SKILL.md、脚本、依赖和参考资料。
npx skills(推荐)不需要先克隆仓库,也不需要手工复制目录:
npx skills add NanmiCoder/NewsCrawler --skill news-extractor -g
命令会检测本机支持的 Agent,并让你选择安装目标。也可以明确指定:
# Codex
npx skills add NanmiCoder/NewsCrawler --skill news-extractor -g -a codex -y
# Claude Code
npx skills add NanmiCoder/NewsCrawler --skill news-extractor -g -a claude-code -y
npx skills 负责安装 Skill 文件;首次执行时,Agent 会按照 SKILL.md 在 Skill 目录运行 uv sync,安装 Python 依赖。
如果你不想自己执行命令,把下面整段内容直接交给 Codex、Claude Code 或其他支持 Skills 的 Agent:
请阅读这个项目的 README:
https://github.com/NanmiCoder/NewsCrawler/blob/main/README.md
按照 README 中的 Agent Skills 安装方式,为你自己安装 news-extractor Skill。
安装后运行 --list-platforms 验证,不要启动 Docker、MCP 或 Web UI。
Agent 会从 README 获得标准安装命令,并从仓库中的 SKILL.md 读取后续依赖与使用说明。
安装后,直接在 Agent 对话里给链接和任务:
使用 news-extractor Skill 提取并总结这篇文章:
https://news.detik.com/berita/d-8562773/gunung-anak-krakatau-erupsi-muntahkan-abu-vulkanik-150-meter
Agent 会根据 Skill 描述自动识别任务,并在本地执行对应脚本。无需启动 Web UI、FastAPI、MCP 或 Docker。
需要手动验证时,可以在 Skill 目录运行:
uv run scripts/extract_news.py "URL" --format json --output ./output
更多参数和示例见 Skill 使用说明。
所有平台都归一化为同一个 NewsItem:
{
"title": "文章标题",
"news_url": "https://example.com/article",
"news_id": "article-id",
"meta_info": {
"author_name": "作者",
"author_url": "https://example.com/author",
"publish_time": "2026-01-01 10:00:00"
},
"contents": [
{"type": "text", "content": "第一段正文", "desc": ""},
{"type": "image", "content": "https://example.com/image.jpg", "desc": ""},
{"type": "video", "content": "https://example.com/video.mp4", "desc": ""}
],
"texts": ["第一段正文"],
"images": ["https://example.com/image.jpg"],
"videos": ["https://example.com/video.mp4"]
}
contents 保留文本、图片和视频在原文中的顺序。texts、images、videos 方便 Agent 或下游程序直接访问特定类型。SKILL.md 的描述识别新闻提取任务。detector.py 根据 URL 选择平台。NewsItem 统一字段并保留内容顺序。news-extractor/
├── SKILL.md
├── pyproject.toml
├── references/
│ └── platform-patterns.md
└── scripts/
├── extract_news.py
├── detector.py
├── formatter.py
├── models.py
└── crawlers/ # 12 个平台的独立实现
# 根仓库依赖与测试
uv sync
uv run pytest
# 验证 Skill
cd .claude/skills/news-extractor
uv sync
uv run scripts/extract_news.py --list-platforms
新增平台时,请同时维护:
news_extractor_core/adapters/ 的服务化 Adapter。欢迎提交 Issue 或 Pull Request。请附上可复现 URL、预期字段和脱敏后的实际输出;不要提交 Cookie、Token 或站点凭据。
代码以 GNU General Public License v3.0 发布;许可权利与义务以 LICENSE 原文为准。被提取内容的版权和使用权限仍归原站点及内容权利人所有。
Skill 是推荐入口。只有在需要共享服务、HTTP 接口或人工界面时,才需要下面这些模式。
from news_extractor_core.services import ExtractorService, to_markdown
news, platform = ExtractorService.extract_news("URL")
print(news.to_dict())
print(to_markdown(news))
MCP 适合把提取能力作为共享 Agent 服务;FastAPI 和 Web UI 适合系统集成或人工操作。它们都不是使用 Skill 的前置条件。
docker compose up -d
| 服务 | 地址 |
|---|---|
| Web UI | http://localhost:3021 |
| FastAPI | http://localhost:8000/docs |
| MCP | http://localhost:8765/mcp |
完整说明见 Docker 部署文档 和 MCP 文档。
使用 LangChain 1.0 构建的 Skills Agent,演示 Skills 三层加载机制的底层原理。默认使用 Anthropic,也支持 OpenAI / OpenAI-compatible 接口。 B站视频: Skills到底怎么实现?我写了个Agent跑给你看
Claude Code Haha is a desktop Claude Code workspace for macOS, Windows, and Linux: multi-session workspaces, global search, branch / Worktree launch, diff review, built-in browser preview, GUI permission approval, any model — Claude, ChatGPT, Grok, presets,
FAQ
newscrawler is a Claude Code plugin with 1 hand-picked skill for data work, indexed on Flowy. Install it with the command on its page. It includes news-extractor. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it