微信公众号抓取与归档
抓取微信公众号内容并归档为 Markdown:单篇文章(mp.weixin.qq.com/s?...)与整个专辑/合集(mp.weixin.qq.com/mp/appmsgalbum?...)都支持,按输入 URL 自动分流。
默认只提取纯文字、不下载图片;需要图片时加 --images。
环境准备
以下命令示例用 PY 指代你的 Python 解释器、S 指代技能脚本路径;请按本机环境替换(WorkBuddy 托管 Python 或任意 Python 3.10+ 均可,需安装 requests beautifulsoup4 lxml)。
PY="python3" # 或 WorkBuddy 托管 Python 的绝对路径
S="<技能目录>/scripts/wechat_spider.py" # 技能解压后的脚本路径
"$PY" -c "import requests,bs4,lxml" 2>/dev/null || "$PY" -m pip install requests beautifulsoup4 lxml
入口:auto(自动分流)
"$PY" "$S" auto "<公众号URL>" -o <输出目录>
脚本识别 URL 类型后走对应流程:
| URL 特征 | 类型 | 行为 |
|---|---|---|
含 appmsgalbum 或 album_id= |
专辑 | 拉取全部文章列表,打印后续步骤指引 |
mp.weixin.qq.com/s?... 或 /s/ |
单篇 | 直接抓取并保存 .md |
无法识别时报错并提示支持的格式。
单篇文章
"$PY" "$S" auto "https://mp.weixin.qq.com/s/xxxxx" -o output
"$PY" "$S" article "<文章URL>" -o output --images # 需要图片时
输出 output/<标题>.md,含标题、公众号、发布时间、原文链接、抓取时间。
专辑(多篇文章)
分四步,第 2 步需人工判断,不可跳过。
1. 抓取文章列表
"$PY" "$S" list "<专辑URL>" -o data/album_list.json
自动翻页至 continue_flag=0,并用专辑声明的 article_count 校验是否抓全(缺篇会告警)。
2. 规划章节
先打印全部标题通读一遍:
"$PY" -c "import json;d=json.load(open('data/album_list.json',encoding='utf-8'));[print(i,it['title']) for i,it in enumerate(d['items'],1)]"
不要用正则自动解析章节号——标题里 第5章/第五章、【十】/(十) 混用,且有的系列整段不带章号(如「亚特兰提斯世界(一)…(十六)」夹在第 6 章与第 8 章之间)。通读后写死「正序序号区间 → 章节名」的映射:
[{"name": "01_第一部-救援地球任务", "from": 1, "to": 1},
{"name": "03_灵能新胚胎的星际教育", "from": 3, "to": 10}]
注意列表是倒序(最新在前),正序序号 p = 总篇数 + 1 - i。
3. 抓取正文
"$PY" "$S" crawl data/album_list.json -o output/<书名> -c data/chapters.json
输出 output/<书名>/<章节目录>/NN_标题.md。已处理纯文字提取、相邻重复段去重、限速重试、断点续跑;失败篇目记录在 data/failed.json。
不需要分章节时加 --flat 平铺输出。
4. 归档到知识库
- 每篇一个文件:直接用第 3 步结果
- 合并成章节大文件:每章一个
.md,篇降为## NN 标题
"$PY" "$S" merge output/<书名> -o "<你的知识库目录>/<书名>" --list data/album_list.json
合并后格式:
# 第N章 章节名
**章节**: 第N章 / 共 M 章 **本篇数**: N 篇 **字数**: 约 X 字
**抓取时间**: YYYY-MM-DD HH:MM:SS
---
## 01 文章标题
**原文链接**: http://...
**发布时间**: YYYY-MM-DD
---
正文
同时生成 000_总目录.md,用 Obsidian 双链 [[文件名|章节名]] 串联各章。
本机归档约定
- 知识库目录:
<你的 Obsidian 库路径>(任意笔记/知识库目录均可,不限于 Obsidian) - 每个来源单独建一个子目录(用户说「单独设立」即指此)
- 文件平铺,用
NNN_三位数序号前缀,与「阿乙莎天狼星书籍」等既有目录风格一致 - 元信息用
**字段**: 值独占一行——与上一行挤在一起会导致加粗失效 - 内容偏好:灵性/觉醒/健康/传统文化类,抓取时只要文字不要图片
详细技术参考
接口结构、cgiData 字段、分页参数等实现细节见 references/wechat-api.md。
修改 scripts/wechat_spider.py 前务必先读,其中记录了两个会导致静默漏抓的坑
(begin_itemidx 需递增重试、begin_msgid=0 无效)。
与其他公众号技能的关系
市场安装的 wechat-article-spider 只处理单篇 URL 且总是下载图片。本技能覆盖其全部场景,
并额外支持专辑批量,且默认纯文字。两者可共存;若希望只保留一个,在技能管理中停用前者即可。