抖音评论采集
结论先行(务必告诉使用技能的人):
- 建议登录后抓取。不登录(游客态)抖音会弹「评论墙」,只能拿到前 ~14-20 条样本评论;登录后注入 cookie 通常能越过评论墙、拿到更多甚至全部。
- 取 cookie 不用开控制台:普通人运行
login_helper.py即可——看得见浏览器扫码/账号密码登录,自动存 cookie,零开发者工具操作。两条采集路径,按"有无 cookie"二选一:
- 无 cookie / 想免登录 → 加
--browser:真实 Chromium 游客态打开视频页,自动翻页抓评论(实测可用,但抖音对游客有评论墙,通常抓到前 ~14-20 条)。- 有本人 cookie → 默认 HTTP 创作者接口:账号授权通道,不受环境指纹风控,可抓全部评论(最稳)。
何时用
- 给定抖音视频的完整 URL、短链转发链接(
v.douyin.com/xxx/)或直接给 aweme_id,要把评论抓下来。 - 不想登录 / 没有 cookie → 用
--browser无头浏览器游客态方案(推荐)。 - 有本人 cookie、要抓全部评论 → 用默认纯 Python 签名 HTTP 创作者接口(最稳)。
- 抓完后还想做中文词频分析:jieba 分词 + 停用词过滤(可选功能)。
核心约束(先读,避免误判)
- 账号域隔离:创作者中心评论接口必须用目标视频发布账号本人的 cookie 调用,否则返回
status_code:5。cookie 通过--cookie或环境变量DOUYIN_COOKIE传入。任何人装上技能后填自己的 cookie + 自己的视频链接即可使用;抓别人视频需对方本人 cookie。 - 公开接口已加固(纯 HTTP 免登录不可行):
www.douyin.com/aweme/v1/web/comment/list/(aid=6383)自 ~2026-08-20 起对非真实浏览器静默空体——实测:零 cookie 打该接口返回 HTTP 200 但响应体为空(body='')。结论:纯 HTTP 免登录方案当前抓不到公开评论(全链路零 cookie 都通,唯独服务端空体)。--guest开关即为此验证场景预留,跑出来空体属预期。 - 无头浏览器可免登录,但有评论墙:
--browser用真实 Chromium 游客态打开视频页(绕过空体风控),实测能抓到真实评论;但抖音对游客有评论墙,滚到第 3 页左右(前 ~14-20 条)后不再加载更多(页面显示"请先登录后发表评论")。要抓全部评论仍需本人 cookie + 创作者接口。一次一个作品、只需部分样本时,浏览器方案足够。 - a_bogus 是逆向算法:抖音改签名即失效 → 表现为
status_code!=0/ 空响应体。纯 HTTP 路线此时不可用,需等算法更新或换浏览器方案。脚本会明确报错,不会静默吐空。
目录结构(全部自包含,不依赖本机其它代码)
抖音评论采集/
├── SKILL.md
├── scripts/
│ ├── fetch_comments.py # 统一主 CLI:解析 URL/转发链接 → 拉评论 → JSON/CSV(--browser 切浏览器模式)
│ ├── browser_fetch.py # 无头浏览器游客态采集(免登录,依赖 playwright)
│ ├── analyze.py # 可选:jieba 分词 + 停用词 + 词频(依赖 jieba)
│ ├── mstoken.py # mssdk 真 msToken 换发(零浏览器)
│ ├── self_check.py # 一键环境自检:必装层 FAIL 即 exit!=0,可选层缺失只告警
│ ├── install.py # 一键依赖安装器:装到「运行脚本的解释器」,装完跑自检
│ ├── login_helper.py # Cookie 获取助手:看得见浏览器扫码/账号密码登录,自动存 cookie(免开发者工具)
│ ├── douyin_cookie.json # login_helper 生成的登录态 cookie(被 --cookie-file 自动读取;不入库)
│ ├── requirements.txt # httpx(必) / jieba(可选) / playwright(浏览器模式可选)
│ └── sign/ # a_bogus 纯 Python 签名(零 node)
│ ├── __init__.py
│ ├── ab_pure.py # ABogusPureSigner
│ ├── fingerprint.py # 静态浏览器指纹
│ └── sm3.py # 国密 SM3
├── references/
│ └── api.md # 接口/签名顺序/踩坑点/ cookie 获取/浏览器方案
└── assets/
└── stopwords.txt # 默认中文停用词表(可用 --stopwords 覆盖)
使用流程
- 一键装依赖(推荐,装完即可跑):运行自带安装器,自动装到「运行脚本的解释器」,装完跑自检确认。
cd <skill>/scripts python install.py # 必装 httpx + 自检(核心抓取就绪) python install.py --all # 必装 + jieba(词频) + playwright+chromium(浏览器免登录)- 安装器始终用
sys.executable -m pip,不会装错解释器(这是「装完跑不起来」的头号原因)。 - 遇到系统 python 的 externally-managed 限制(PEP 668),安装器会提示在该目录建
.venv后重试。
- 安装器始终用
- 首次运行也会自愈:即使没先跑安装器,
fetch_comments.py启动时若发现缺 httpx,会自动装好再继续(装到当前解释器),不会直接报 ModuleNotFoundError 退出。 - 一键自检(可选,装后确认):确认环境就绪并定位「跑不起来」的根因,不联网。
python <skill>/scripts/self_check.py- 必装层(Python/httpx/签名子包/SM3/a_bogus/解析)有
❌→ 核心 HTTP 抓取不可用,exit!=0,按提示修。 - 可选层(jieba/playwright)
⚠️只告警,不影响核心;按需pip install。
- 必装层(Python/httpx/签名子包/SM3/a_bogus/解析)有
- 登录获取 cookie(免开发者工具,推荐):普通人不用去按 F12 翻控制台。直接跑登录助手,它会打开看得见的浏览器,你用手机抖音「扫一扫」或账号密码像平时一样登录,登录成功后自动把 cookie 存成文件,后续抓取脚本直接读取。
# 默认登 creator.douyin.com(与经纬系统一致:登录态落在 .douyin.com 通配域, # 对浏览器抓取 www.douyin.com 与纯 HTTP 创作者接口都生效) python <skill>/scripts/login_helper.py # 生成 douyin_cookie.json(浏览器注入) + douyin_cookie.txt(字符串,经纬同款) # 浏览器抓取会自动读取 .json;strings 可直接喂 HTTP 模式 --cookie💡 直接复用经纬现成 cookie:经纬已跑通扫码登录,本技能无需再扫。经纬的
data/.douyin_cookie.txt(字符串形态)可直接喂本技能:python fetch_comments.py <链接> --browser --cookie-file /path/to/matrix-radar/data/.douyin_cookie.txt或 HTTP 模式:python fetch_comments.py <链接> --cookie "$(cat /path/to/matrix-radar/data/.douyin_cookie.txt)"--cookie-file同时兼容 JSON 列表与「name=value;…」字符串两种格式。 ⚠️ 为什么建议登录:不登录(游客态)抖音会弹「评论墙」,通常只能拿到前 ~14-20 条样本评论;登录后注入 cookie 通常能越过评论墙,拿到更多甚至全部评论。洗稿/舆情/选题样本用游客态够用,要全量务必先登录。 登录态 cookie 含账号凭证,请勿分享给他人,也不要提交进 git。 - 抓评论:
# A) 免登录·无头浏览器(推荐无 cookie 场景,自动翻页) python <skill>/scripts/fetch_comments.py "https://v.douyin.com/iRxxxxxx/" --browser --output comments.json # 给完整 URL / 短链 / 数字 aweme_id 均可;可加 --no-headless 肉眼观察 # B) 有 cookie·纯 HTTP 创作者接口(抓全部评论,最稳) python <skill>/scripts/fetch_comments.py "https://www.douyin.com/video/7301234567890123456" --cookie "$DOUYIN_COOKIE" --format csv --output comments.csv - 可选词频分析(需 jieba,浏览器模式同样支持):
python <skill>/scripts/fetch_comments.py "<url>" --browser --analyze --top-n 50 --output comments.json # 分析结果写到 comments.analyze.json(词频 top N)
CLI 参数
| 参数 | 说明 |
|------|------|
| url(位置参数) | 完整URL / 短链转发链接 / 纯数字 aweme_id |
| --browser | 无头浏览器模式(推荐):真实 Chromium 自动翻页采集;默认游客态仅前~14-20条,登录后越评论墙拿全部 |
| --no-headless | 浏览器模式关闭无头(可肉眼观察是否被风控弹窗拦截) |
| --cookie-file | 登录态 cookie 文件(login_helper 生成);缺省自动探测 scripts/douyin_cookie.json。提供后浏览器以登录态抓取 |
| --cookie | 本人账号 cookie 串;或设环境变量 DOUYIN_COOKIE(HTTP 模式用) |
| --endpoint | creator(默认,需本人cookie)/ public(实验性,已加固) |
| --guest | 游客态:零 cookie 打公开接口,仅验证可用性(预期空体) |
| --count | 每页条数(默认 20,HTTP 模式) |
| --max-pages | HTTP 模式最大翻页数(默认 20,0=不限额) |
| --max-scrolls | 浏览器模式最大滚动加载次数(默认 20) |
| --format | json(默认)/ csv |
| --output | 输出文件路径(缺省打印 stdout) |
| --analyze | 附带 jieba 分词 + 停用词词频分析 |
| --top-n | 词频返回前 N 词(默认 50) |
| --stopwords | 自定义停用词文件(覆盖默认表) |
| --min-word-len | 词频最小词长(默认 2) |
实现要点(调用前必看 references/api.md)
- 参数顺序即签名的一部分:
device_platform→aid→app_id→channel_id→aweme_id→cursor→count→sort_options→screen_*→browser_*→engine_*→os_*→cpu_core_num→device_memory→platform→downlink→effective_type→round_trip_time→webid/verifyFp/fp→msToken,再算 a_bogus 追加。顺序在fetch_comments.py::fetch_raw固定,勿随意调整。 - 指纹同源:params 的指纹字段必须取自与签名器同一个
get_profile()。 - 避免二次编码:自拼 query 串后整 URL 直传 httpx,不让 httpx 重编码。
- 空 comments + has_more=0 属合法结果,不当失败。
验证
- 一键安装:
python <skill>/scripts/install.py输出「必装层通过,环境就绪」且exit 0。 - 一键自检:
python <skill>/scripts/self_check.py必装层全✅且exit 0即环境就绪。 - 离线:
python <skill>/scripts/sign/sm3.py应输出 SM3 自测 PASS。 - 离线:
ABogusPureSigner(fixed=True, aid=2906).sign_query("aid=2906")应返回定长 a_bogus 字符串(确定性,可用于单测)。 - 浏览器免登录(实测可用):
python <skill>/scripts/fetch_comments.py "https://v.douyin.com/xxx/" --browser应能返回真实评论(游客态,前 ~14-20 条)。 - Cookie 助手(免控制台):
python <skill>/scripts/login_helper.py打开可见浏览器,登录后生成douyin_cookie.json;再次--browser会自动读取并以登录态抓取(越评论墙)。 - 真机(HTTP 创作者接口):在 cookie 自然所在的账号环境跑
fetch_comments.py --cookie ...,确认返回 comments/total/has_more。异地登录可能触发风控,务必在目标账号本机/服务器验证。
微信扫一扫