问答
为什么抓到的抖音评论比视频显示的评论数少很多?
简短回答
抖音视频上的评论数包含楼中楼回复,还有一部分评论被折叠、隐藏或删除,所以公开的一级评论一定比它少。okdata 返回抖音公开提供的全部一级评论,每页约 20 条,$0.002 一次,每条带回复数,可以用来核对覆盖率;2,000 条评论共 $0.20。
视频显示 2,416 条评论,导出来只有 619 行。第一反应是爬虫坏了,有时确实如此:签名失败或者被拦截,翻页会悄悄提前结束,连报错都没有。但就算采集程序完美无缺,也到不了 2,416。先弄清原因,再决定要不要去查 bug。
评论去哪了
- **回复也算数。**抖音的评论数包含评论下面的回复。一条视频有 600 条一级评论、1,800 条回复,就会显示 2,400。
- **被折叠、隐藏的评论。**抖音会折叠低质量或被举报的评论,作者也可以隐藏或删除。这些都不公开提供。
- **特别大的评论区。**几万条评论的视频,抖音可能翻不到底就不再返回一级评论了。
核对覆盖率
抖音视频评论返回一级评论,每条带 replies 回复数。把采到的每条评论按 1 + replies 加总,再和视频详情里的 metrics.comments 比一比。两个数接近,说明公开的你都拿到了;如果加总远小于评论数,而最后一页还显示 has_more: true,那就是采集提前停了。
费用
| 采到的评论数 | 调用次数 | 费用 |
|---|---|---|
| 620(上面的例子) | 31 | $0.062 |
| 2,000 | 100 | $0.20 |
| 加上视频本身的评论数 | 1 | $0.002 |
核对用的代码
import os, requests
API, HEAD = "https://api.okdata.online", {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
vid = "7301234567890123456"
total = requests.get(API + "/v1/douyin/videos/get", headers=HEAD, params={"id": vid}, timeout=60).json()["data"]["item"]["metrics"]["comments"]
seen, params = 0, {"id": vid}
while True:
body = requests.get(API + "/v1/douyin/videos/comments/list", headers=HEAD, params=params, timeout=60).json()
seen += sum(1 + (c["replies"] or 0) for c in body["data"]["items"])
if not body["page"]["has_more"]:
break
params["cursor"] = body["page"]["next_cursor"]
print(f"covered {seen} of {total}")
每页单独扣费;某一页失败的话不扣费,用同一个游标重发即可。
如果你需要回复的具体内容
这里的接口只提供一级评论。回复正文需要别的工具:MediaCrawler 和 TikTokDownloader 可以用登录账号采回复,不过从它们的 issue 区看,回复接口比一级评论更容易失效。对大多数情感分析来说,按点赞数和回复数加权的一级评论已经足够说明问题。可以参考口碑分析方案。
更新于