📊 数据采集 · 技能 #2

微博/微信公众号内容导出为 Excel

定位

将指定微博博主或微信公众号的所有历史内容导出为 Excel 文件,包含四列:发布日期、标题(没有则空着)、正文内容、前 N 条热门评论(合并到一个单元格)。支持首次全量导出后,每周自动增量抓取新内容。

触发条件

当用户说出以下类似的话时调用:

输入规范

用户可能提供以下任一形式的输入:

输出规范

生成一个 .xlsx 文件,包含以下四列:

列号 列名 说明
A 发布日期 格式 YYYY-MM-DD
B 标题 头条文章的标题;普通微博没有标题则留空
C 正文内容 微博正文全文(含展开后的长微博全文)
D 热门评论 前 N 条热门评论,每条评论之间用换行符分隔,格式为「用户名:评论内容」

工作流程

第一步:解析输入,获取 user_id

  1. 如果用户给的是 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

  1. 如果用户给的是昵称:通过微博搜索接口解析 user_id

- 访问 https://m.weibo.cn/n/{昵称} 获取重定向后的 user_id - 或访问 https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D{昵称} 搜索

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:

  1. 用 Chrome 打开 https://weibo.cn 并登录
  2. 按 F12 打开开发者工具 → Network 标签
  3. 刷新页面,点击任意请求,在 Headers 中找到 Cookie 字段
  4. 复制完整 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

脚本会:

  1. 读取 weibo-crawler 的 CSV 文件
  2. 读取 comment 目录下每条微博的评论文件
  3. 按热度排序选取前 N 条评论,合并到一个单元格
  4. 生成四列 Excel:发布日期 | 标题 | 正文 | 热门评论

第五步:交付结果

将生成的 .xlsx 文件保存到 /workspace/ 目录,并向用户展示文件链接。

第六步:大批量导出自动恢复机制(100条以上)

当目标博主微博数超过100条时,爬取时间较长,环境可能会中断进程。必须启用以下双层自愈机制:

6a. 进程内自愈(auto_crawl.sh)

创建 auto_crawl.sh 包装脚本,功能:


#!/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 工具创建每小时一次的定时任务,功能:

Cron 表达式:0 (每小时整点)

注意:Schedule 最短间隔为1小时,无法设置为30-45分钟。需告知用户。

6c. 进度文件设计

进度文件保存在 /workspace/weibo_crawl_progress.json,包含:

关键:进度文件必须放在 /workspace/ 目录下,确保环境清理后仍保留。空数据不等于完成,不得删除进度文件。

重要约束

  1. Cookie 安全:Cookie 是敏感信息,不要写入 SKILL.md 或任何持久化文件中;运行结束后清理临时配置文件中的 Cookie
  2. 合规使用:仅用于个人研究和学习,遵守微博服务条款,不要高频请求
  3. 评论数量:comment_max_download_count 和 --top-comments 参数可根据用户需求调整,默认 100 条评论中取前 30 条热门
  4. 错误处理:如果 Cookie 过期导致爬取失败,提示用户重新获取 Cookie
  5. 大博主注意:粉丝量极大的博主微博数量多,爬取可能需要较长时间,需提前告知用户
  6. 大批量必开自愈:微博数超过100条时,必须启用 auto_crawl.sh + Schedule 双层自愈机制
  7. XSRF-TOKEN动态获取:必须先访问 weibo.com 主页建立会话,从响应cookie中提取动态XSRF-TOKEN,不能硬编码

第七步:定时增量抓取(每周自动更新)

用户完成首次全量导出后,可以启用每周定时增量抓取,自动获取上次爬取最新日期之后的新微博。

7a. 增量抓取原理

  1. 读取已有进度文件 /workspace/weibo_crawl_progress.json 中的 last_crawl_date 字段
  2. 从第1页开始正向爬取(新微博在最前面)
  3. 使用内容去重(weibo_id + 日期+内容前50字符双重指纹)跳过已存在的微博
  4. 当遇到日期 <= last_crawl_date 的微博时,增量抓取完成
  5. 更新 last_crawl_date 为本次抓取的最新日期
  6. 合并新数据到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. 进度文件增量字段

在进度文件中增加以下字段:

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. 微信公众号爬取原理

  1. 文章发现:通过搜狗微信搜索(weixin.sogou.com/weixin?type=2&query={公众号名称})搜索文章
  2. 链接解析:搜狗返回的链接为跳转链接,需解析为 mp.weixin.qq.com/s/xxx 直链
  3. 正文抓取:模拟微信客户端 User-Agent 访问文章页,解析 #js_content 获取正文
  4. 评论提取:从页面 JavaScript 变量中提取 comment_list 或 elected_comment
  5. 无需登录:搜狗搜索不需要登录,适合自动化定时抓取

已知限制:搜狗微信搜索的跳转链接有严格的反爬验证码机制,自动解析直链可能触发验证码。当直链解析失败时,爬虫会自动使用搜索结果中的摘要作为正文内容(通常包含文章前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

自愈脚本功能:

步骤2:爬虫会自动:

步骤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. 增量抓取原理

  1. 读取进度文件中的 last_crawl_date 字段
  2. 从搜狗搜索第1页开始正向搜索(新文章排在前面)
  3. 对每篇文章检查日期是否 > last_crawl_date
  4. 使用 URL + 标题双重指纹去重,跳过已存在的文章
  5. 当连续遇到5篇旧文章(date <= last_crawl_date)时,增量抓取完成
  6. 更新 last_crawl_date 为本次抓取的最新日期
  7. 重新导出 Excel 文件

7f-2. 执行增量抓取


cd /workspace && python3 wechat_crawler.py \
  --account "{公众号名称}" \
  --incremental \
  --max-pages 10 \
  --top-comments 20 \
  --output /workspace

参数说明:

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. 微信爬取注意事项

  1. 搜狗反爬:搜狗微信搜索有频率限制,建议页间延迟2-4秒,文章间延迟1-2秒
  2. 搜索覆盖:搜狗搜索可能不覆盖公众号全部历史文章,全量导出时建议同时用多个关键词搜索
  3. 文章链接:搜狗返回的链接为跳转链接,脚本会自动尝试解析为 mp.weixin.qq.com 直链
  4. 验证码限制:搜狗跳转链接可能触发验证码,导致无法获取完整正文。此时使用搜索摘要作为内容
  5. 手动直链:如需完整正文和评论,用户可手动提供 mp.weixin.qq.com/s/xxx 链接,爬虫可直接抓取
  6. 正文解析:微信文章正文在 #js_content 或 .rich_media_content 中,脚本会自动处理
  7. 评论:评论数据嵌入在页面 JavaScript 中,提取成功率取决于文章是否开启了评论
  8. 文章失效:部分文章可能已被删除或设为仅粉丝可见,会导致抓取失败
  9. 合规使用:仅用于个人研究和学习,遵守搜狗和微信的服务条款

参考文档

技术来源

基于开源项目 dataabc/weibo-crawler(MIT 协议),在其基础上增加评论合并和 Excel 格式化输出。