微博/微信公众号内容导出为 Excel
定位
将指定微博博主或微信公众号的所有历史内容导出为 Excel 文件,包含四列:发布日期、标题(没有则空着)、正文内容、前 N 条热门评论(合并到一个单元格)。支持首次全量导出后,每周自动增量抓取新内容。
触发条件
当用户说出以下类似的话时调用:
- "帮我导出 XX 博主的微博"
- "把这个微博链接的内容导出成 Excel"
- "抓取 XX 的微博和评论"
- "导出 XX 微信公众号的文章"
- "每周自动抓取 XX 的新微博"
- "设置 XX 的定时增量更新"
- "每周自动抓取 XX 公众号的新文章"
输入规范
用户可能提供以下任一形式的输入:
- 微博博主昵称:如"迪丽热巴"
- 微博博主主页 URL:如
https://weibo.com/u/1669879400或https://m.weibo.cn/u/1669879400 - 微信公众号名称:如"人民日报"
- 微信公众号文章 URL:如
https://mp.weixin.qq.com/s/xxxxxx
输出规范
生成一个 .xlsx 文件,包含以下四列:
| 列号 | 列名 | 说明 |
|---|---|---|
| A | 发布日期 | 格式 YYYY-MM-DD |
| B | 标题 | 头条文章的标题;普通微博没有标题则留空 |
| C | 正文内容 | 微博正文全文(含展开后的长微博全文) |
| D | 热门评论 | 前 N 条热门评论,每条评论之间用换行符分隔,格式为「用户名:评论内容」 |
工作流程
第一步:解析输入,获取 user_id
- 如果用户给的是 URL:从 URL 中提取 user_id
- https://weibo.com/u/1669879400 → user_id = 1669879400 - https://m.weibo.cn/u/1669879400 → user_id = 1669879400 - https://weibo.com/1669879400 → user_id = 1669879400 - https://weibo.cn/u/1669879400 → user_id = 1669879400
- 如果用户给的是昵称:通过微博搜索接口解析 user_id
- 访问 https://m.weibo.cn/n/{昵称} 获取重定向后的 user_id - 或访问 https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D{昵称} 搜索
第二步:准备环境和 Cookie
2a. 安装 weibo-crawler
cd /data/user/work
git clone https://github.com/dataabc/weibo-crawler.git
cd weibo-crawler
pip install -r requirements.txt
2b. 获取 Cookie(优先方案:浏览器自动化)
尝试使用 Playwright 自动打开微博登录页让用户扫码:
pip install playwright --break-system-packages
playwright install chromium
运行浏览器自动化脚本获取 Cookie。如果环境不支持浏览器自动化,则回退到手动方案。
2c. 获取 Cookie(回退方案:手动提供)
引导用户手动获取 Cookie:
- 用 Chrome 打开
https://weibo.cn并登录 - 按 F12 打开开发者工具 → Network 标签
- 刷新页面,点击任意请求,在 Headers 中找到
Cookie字段 - 复制完整 Cookie 值
第三步:配置并运行 weibo-crawler
3a. 创建配置文件
参照 templates/config.json 模板,填入以下关键参数:
| 参数 | 值 | 说明 |
|---|---|---|
user_id_list |
[获取到的user_id] |
目标博主 ID |
only_crawl_original |
0 |
爬取全部微博(原创+转发) |
since_date |
1900-01-01 |
从最早开始爬 |
write_mode |
["csv"] |
输出 CSV(后续转 Excel) |
download_comment |
1 |
开启评论下载 |
comment_max_download_count |
100 |
每条微博最多抓 100 条评论(可调整) |
cookie |
用户提供的Cookie |
登录态 |
3b. 运行爬虫
cd /data/user/work/weibo-crawler
python weibo.py
爬取结果保存在 weibo/{博主昵称}/{user_id}.csv,评论保存在 weibo/{博主昵称}/comment/ 目录下。
第四步:后处理——转换为目标 Excel 格式
使用 templates/export_to_excel.py 脚本进行后处理:
python /data/user/work/weibo-crawler/export_to_excel.py \
--csv /data/user/work/weibo-crawler/weibo/{博主昵称}/{user_id}.csv \
--comment-dir /data/user/work/weibo-crawler/weibo/{博主昵称}/comment/ \
--output /workspace/{博主昵称}_微博导出.xlsx \
--top-comments 30
脚本会:
- 读取 weibo-crawler 的 CSV 文件
- 读取 comment 目录下每条微博的评论文件
- 按热度排序选取前 N 条评论,合并到一个单元格
- 生成四列 Excel:发布日期 | 标题 | 正文 | 热门评论
第五步:交付结果
将生成的 .xlsx 文件保存到 /workspace/ 目录,并向用户展示文件链接。
第六步:大批量导出自动恢复机制(100条以上)
当目标博主微博数超过100条时,爬取时间较长,环境可能会中断进程。必须启用以下双层自愈机制:
6a. 进程内自愈(auto_crawl.sh)
创建 auto_crawl.sh 包装脚本,功能:
- 启动爬虫,异常退出后等待10秒自动重启
- 断点续传(从进度文件恢复)
- 连续5次无进展自动停止(判断Cookie过期)
- 最多重启200次
#!/bin/bash
CRAWLER="/workspace/weibo_crawler.py"
PROGRESS_FILE="/workspace/weibo_crawl_progress.json"
WEIBO_UID="目标UID"
COOKIE='用户提供的Cookie'
TOP_COMMENTS=20
MAX_RESTARTS=200
RESTART_DELAY=10
COOKIE_FAIL_MAX=5
CONSECUTIVE_FAIL=0
for i in $(seq 1 $MAX_RESTARTS); do
# 启动爬虫
python3 "$CRAWLER" --uid "$WEIBO_UID" --cookie "$COOKIE" --top-comments $TOP_COMMENTS --output /workspace --resume 2>&1
# 检查是否完成
# 检查是否有进展(无进展计数+1,连续5次停止)
# 等待后重启
done
6b. 会话级定时任务(Schedule 工具)
使用 Schedule 工具创建每小时一次的定时任务,功能:
- 检查爬虫进程是否在运行
- 如果进程不在且Cookie有效,自动恢复
- 如果Cookie过期,通知用户
- 爬取完成后生成Excel并删除定时任务
Cron 表达式:0 (每小时整点)
注意:Schedule 最短间隔为1小时,无法设置为30-45分钟。需告知用户。
6c. 进度文件设计
进度文件保存在 /workspace/weibo_crawl_progress.json,包含:
last_page: 最后爬取的页码since_id: 游标ID(用于since_id分页)weibos: 已爬取的微博列表(含正文、评论)total: 微博总数long_text_count: 已补全长文数blogger_name: 博主昵称
关键:进度文件必须放在 /workspace/ 目录下,确保环境清理后仍保留。空数据不等于完成,不得删除进度文件。
重要约束
- Cookie 安全:Cookie 是敏感信息,不要写入 SKILL.md 或任何持久化文件中;运行结束后清理临时配置文件中的 Cookie
- 合规使用:仅用于个人研究和学习,遵守微博服务条款,不要高频请求
- 评论数量:
comment_max_download_count和--top-comments参数可根据用户需求调整,默认 100 条评论中取前 30 条热门 - 错误处理:如果 Cookie 过期导致爬取失败,提示用户重新获取 Cookie
- 大博主注意:粉丝量极大的博主微博数量多,爬取可能需要较长时间,需提前告知用户
- 大批量必开自愈:微博数超过100条时,必须启用 auto_crawl.sh + Schedule 双层自愈机制
- XSRF-TOKEN动态获取:必须先访问 weibo.com 主页建立会话,从响应cookie中提取动态XSRF-TOKEN,不能硬编码
第七步:定时增量抓取(每周自动更新)
用户完成首次全量导出后,可以启用每周定时增量抓取,自动获取上次爬取最新日期之后的新微博。
7a. 增量抓取原理
- 读取已有进度文件
/workspace/weibo_crawl_progress.json中的last_crawl_date字段 - 从第1页开始正向爬取(新微博在最前面)
- 使用内容去重(weibo_id + 日期+内容前50字符双重指纹)跳过已存在的微博
- 当遇到日期 <=
last_crawl_date的微博时,增量抓取完成 - 更新
last_crawl_date为本次抓取的最新日期 - 合并新数据到Excel文件
7b. 创建定时任务
使用 Schedule 工具创建每周一次的定时任务:
Cron 表达式:0 10 1(每周一上午10点)
定时任务 message 内容模板:
增量抓取微博博主「{博主昵称}」的新内容。
步骤:
1. 检查 /workspace/weibo_crawl_progress.json 是否存在
2. 读取 last_crawl_date(上次抓取的最新日期)和 blogger_name
3. 向用户请求最新的微博 Cookie(如果Cookie过期)
4. 运行爬虫:python3 /workspace/weibo_crawler.py --uid {UID} --cookie "Cookie" --top-comments 20 --output /workspace --resume
5. 爬虫会从第1页开始,遇到日期 <= last_crawl_date 的微博时自动停止
6. 生成更新后的Excel文件到 /workspace/{博主昵称}_微博全量导出.xlsx
7. 更新 last_crawl_date 为本次抓取的最新日期
8. 告知用户新增了多少条微博
注意:
- Cookie 可能已过期,需要用户重新提供
- 如果进度文件不存在,说明用户尚未完成首次全量导出,跳过本次执行
- 增量抓取通常只需要几页,不需要启用自愈脚本
7c. 进度文件增量字段
在进度文件中增加以下字段:
last_crawl_date: 上次增量抓取覆盖到的最新日期(格式 YYYY-MM-DD)incremental_mode: 是否为增量模式(true=增量,false=全量)
7d. 多账号管理
用户可能有多个微博/微信公众号需要定期追踪。为每个账号创建独立的定时任务:
| 账号 | 进度文件 | Excel文件 | 定时任务 |
|---|---|---|---|
| 针灸匠张宝旬 | /workspace/weibo_crawl_progress_{uid}.json |
/workspace/针灸匠张宝旬_微博全量导出.xlsx |
每周一10:00 |
| 其他博主 | /workspace/weibo_crawl_progress_{uid}.json |
/workspace/{博主昵称}_微博全量导出.xlsx |
每周一10:00 |
注意:每个账号使用独立的进度文件,以 {uid} 作为文件名后缀区分。
7e. 微信公众号全量导出
微信公众号文章的爬取使用独立的爬虫脚本 /workspace/wechat_crawler.py,基于搜狗微信搜索发现文章,再抓取 mp.weixin.qq.com 正文。
7e-1. 微信公众号爬取原理
- 文章发现:通过搜狗微信搜索(
weixin.sogou.com/weixin?type=2&query={公众号名称})搜索文章 - 链接解析:搜狗返回的链接为跳转链接,需解析为
mp.weixin.qq.com/s/xxx直链 - 正文抓取:模拟微信客户端 User-Agent 访问文章页,解析
#js_content获取正文 - 评论提取:从页面 JavaScript 变量中提取
comment_list或elected_comment - 无需登录:搜狗搜索不需要登录,适合自动化定时抓取
已知限制:搜狗微信搜索的跳转链接有严格的反爬验证码机制,自动解析直链可能触发验证码。当直链解析失败时,爬虫会自动使用搜索结果中的摘要作为正文内容(通常包含文章前50-100字)。如需完整正文,用户可手动提供文章直链(mp.weixin.qq.com/s/xxx),爬虫可直接抓取完整正文和评论。
7e-2. 首次全量导出流程
步骤1a:直接运行爬虫进行全量抓取
cd /workspace && python3 wechat_crawler.py \
--account "{公众号名称}" \
--max-pages 50 \
--top-comments 20 \
--output /workspace
步骤1b:(可选)使用自愈包装脚本进行大批量抓取
如果搜索结果较多(超过10页),建议使用自愈脚本防止中途崩溃:
cd /workspace && bash auto_crawl_wechat.sh "{公众号名称}" 50
自愈脚本功能:
- 爬虫崩溃后自动等待15秒重启(搜狗需要冷却时间)
- 断点续传(从进度文件恢复)
- 连续5次无进展自动停止(判断搜索结果已抓完或触发反爬)
- 最多重启50次
- 完成后自动导出 Excel
步骤2:爬虫会自动:
- 通过搜狗微信搜索逐页发现文章
- 解析搜狗跳转链接获取真实 URL
- 抓取每篇文章的正文和评论
- 保存进度到
/workspace/wechat_crawl_progress_{公众号名称}.json - 爬取完成后自动导出 Excel
步骤3:交付 Excel 文件 /workspace/{公众号名称}_公众号导出.xlsx
7e-3. 微信进度文件设计
进度文件保存在 /workspace/wechat_crawl_progress_{公众号名称}.json,包含:
| 字段 | 说明 |
|---|---|
account |
公众号名称 |
articles |
已爬取的文章列表(含标题、日期、正文、评论、URL) |
total |
文章总数 |
last_page |
最后爬取的搜索页码 |
last_crawl_date |
上次爬取的最新文章日期(格式 YYYY-MM-DD) |
incremental_mode |
是否增量模式 |
crawl_type |
固定为 wechat |
7f. 微信公众号定时增量抓取
7f-1. 增量抓取原理
- 读取进度文件中的
last_crawl_date字段 - 从搜狗搜索第1页开始正向搜索(新文章排在前面)
- 对每篇文章检查日期是否 >
last_crawl_date - 使用 URL + 标题双重指纹去重,跳过已存在的文章
- 当连续遇到5篇旧文章(date <= last_crawl_date)时,增量抓取完成
- 更新
last_crawl_date为本次抓取的最新日期 - 重新导出 Excel 文件
7f-2. 执行增量抓取
cd /workspace && python3 wechat_crawler.py \
--account "{公众号名称}" \
--incremental \
--max-pages 10 \
--top-comments 20 \
--output /workspace
参数说明:
--incremental:启用增量模式--max-pages 10:增量模式通常只需搜索前几页(默认10页)
7f-3. 创建微信定时任务
使用 Schedule 工具创建每周一次的定时任务:
Cron 表达式:0 10 0(每周日上午10点)
定时任务 message 内容模板:
增量抓取微信公众号「{公众号名称}」的新文章。
步骤:
1. 检查 /workspace/wechat_crawl_progress_{公众号名称}.json 是否存在
2. 读取 last_crawl_date(上次抓取的最新日期)
3. 运行增量爬虫:
cd /workspace && python3 wechat_crawler.py --account "{公众号名称}" --incremental --max-pages 10 --top-comments 20 --output /workspace
4. 爬虫会从搜狗搜索第1页开始,遇到日期 <= last_crawl_date 的文章时自动停止
5. 自动生成更新后的Excel文件到 /workspace/{公众号名称}_公众号导出.xlsx
6. 更新 last_crawl_date 为本次抓取的最新日期
7. 告知用户新增了多少篇文章
注意:
- 搜狗微信搜索不需要登录,无需 Cookie
- 如果搜狗触发反爬(验证码),等待几分钟后重试
- 如果进度文件不存在,说明用户尚未完成首次全量导出,跳过本次执行
- 增量抓取通常只需要几页搜索结果
7f-4. 微信与微博定时任务对比
| 维度 | 微博 | 微信公众号 |
|---|---|---|
| 爬虫脚本 | /workspace/weibo_crawler.py |
/workspace/wechat_crawler.py |
| 自愈包装脚本 | /workspace/auto_crawl.sh |
/workspace/auto_crawl_wechat.sh |
| 进度文件 | weibo_crawl_progress_{uid}.json |
wechat_crawl_progress_{公众号名称}.json |
| Excel文件 | {博主昵称}_微博全量导出.xlsx |
{公众号名称}_公众号导出.xlsx |
| 是否需要Cookie | 是(需用户提供) | 否(搜狗搜索无需登录) |
| 增量标识 | last_crawl_date |
last_crawl_date |
| 去重方式 | weibo_id + 日期+内容前50字 | URL + 标题前50字 |
| 定时频率 | 每周日10:00 | 每周日10:00 |
| 反爬风险 | 中等(API有频率限制) | 中等(搜狗有验证码机制) |
7f-5. 微信多账号管理
为每个公众号创建独立的定时任务:
| 账号 | 进度文件 | Excel文件 | 定时任务 |
|---|---|---|---|
| {公众号A} | wechat_crawl_progress_{A}.json |
{A}_公众号导出.xlsx |
每周日10:00 |
| {公众号B} | wechat_crawl_progress_{B}.json |
{B}_公众号导出.xlsx |
每周日10:00 |
注意:多个公众号的定时任务可以设置在不同的时间点运行,避免同时请求搜狗触发反爬。建议每个任务间隔至少30分钟。
7f-6. 微信爬取注意事项
- 搜狗反爬:搜狗微信搜索有频率限制,建议页间延迟2-4秒,文章间延迟1-2秒
- 搜索覆盖:搜狗搜索可能不覆盖公众号全部历史文章,全量导出时建议同时用多个关键词搜索
- 文章链接:搜狗返回的链接为跳转链接,脚本会自动尝试解析为
mp.weixin.qq.com直链 - 验证码限制:搜狗跳转链接可能触发验证码,导致无法获取完整正文。此时使用搜索摘要作为内容
- 手动直链:如需完整正文和评论,用户可手动提供
mp.weixin.qq.com/s/xxx链接,爬虫可直接抓取 - 正文解析:微信文章正文在
#js_content或.rich_media_content中,脚本会自动处理 - 评论:评论数据嵌入在页面 JavaScript 中,提取成功率取决于文章是否开启了评论
- 文章失效:部分文章可能已被删除或设为仅粉丝可见,会导致抓取失败
- 合规使用:仅用于个人研究和学习,遵守搜狗和微信的服务条款
参考文档
- 详细配置说明见
references/weibo-crawler-config.md - 后处理脚本见
templates/export_to_excel.py - 配置模板见
templates/config.json
技术来源
基于开源项目 dataabc/weibo-crawler(MIT 协议),在其基础上增加评论合并和 Excel 格式化输出。