用 Python 把抖音评论导出到 Excel
不用抓包、不用 cookie:通过 API 拉取一条抖音视频的全部评论和楼中楼回复,按 cid 去重,导出成 Excel 能直接打开的 CSV,附完整 Python 代码。
做口碑分析、竞品调研时,抖音评论区是最直接的用户反馈。本文把一条抖音视频的全部评论和楼中楼回复拉下来,导出成 Excel 能直接打开的文件:不用抓包,不用 cookie,也不用登录抖音账号。
思路
抖音开放平台面向申请了资质、经用户授权的应用,一般拿不到任意视频的评论。Qovia 的抖音接口把这些公开数据做成了普通的 HTTPS 接口,带上 API Key 就能调用。你需要:
- Python 3.8 以上,装好
requests:pip install requests。 - 一个 Qovia 的 API Key,在控制台创建后放进环境变量:
export QOVIA_KEY="sk-qovia-..."
第 1 步:拿到视频 ID
视频 ID(抖音叫 aweme_id)就是视频链接 douyin.com/video/<视频 ID> 里那串长数字。分享出来的短链接(v.douyin.com/...)在浏览器里打开后,跳转后的地址里有同一串数字。
先用作品详情确认一下是不是这条视频:
import os import requests API = "https://api.qovia.ai/v1/raw/douyin" HEADERS = {"Authorization": f"Bearer {os.environ['QOVIA_KEY']}"} def call(endpoint, **params): resp = requests.get(f"{API}/{endpoint}", headers=HEADERS, params=params, timeout=60) if not resp.ok: raise RuntimeError(f"{endpoint}: HTTP {resp.status_code} {resp.text[:300]}") return resp.json()["data"] or {} VIDEO = "7681194457378688292" video = call("video", item_id=VIDEO) print(video["text"][:80], video["metrics"])
第 2 步:翻页拉取全部评论
作品评论每页最多 50 条。把上一页返回的 cursor 传回去就是下一页,has_more 为 false 时停止。抖音翻页时排序可能变化,相邻两页可能有重复的评论,所以用 cid 做键存进字典,重复的自然就去掉了。
def all_comments(item_id, max_pages=40): comments, cursor = {}, 0 for _ in range(max_pages): page = call("comments", item_id=item_id, cursor=cursor, count=50) for c in page.get("items", []): comments[c["cid"]] = c if not page.get("has_more"): break cursor = page["cursor"] return list(comments.values()) comments = all_comments(VIDEO) print(len(comments), "条评论")
每条评论有 cid、text、likes(点赞)、reply_count(回复数)、ip_location(IP 属地)、created_at、is_hot(是否热评)和作者昵称。
第 3 步:补上楼中楼回复
评论下面的回复用评论回复接口,翻页方式一样。每次调用都计费,所以建议只拉重要评论的回复,比如回复最多的前 20 条:
def replies(item_id, comment_id, max_pages=10): out, cursor = [], 0 for _ in range(max_pages): page = call("comment_replies", item_id=item_id, comment_id=comment_id, cursor=cursor, count=50) out += page.get("items", []) if not page.get("has_more"): break cursor = page["cursor"] return out busiest = sorted(comments, key=lambda c: c["reply_count"], reverse=True)[:20] reply_rows = [] for c in busiest: if c["reply_count"]: for r in replies(VIDEO, c["cid"]): r["parent"] = c["cid"] reply_rows.append(r)
第 4 步:导出到 Excel
用 utf-8-sig 编码写 CSV,Excel 打开时中文不会乱码。评论和回复放在同一张表里,parent 为空的是一级评论。
import csv with open("douyin_comments.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["cid", "parent", "created_at", "likes", "replies", "ip_location", "nickname", "text"]) for c in comments + reply_rows: writer.writerow([ c["cid"], c.get("parent", ""), c["created_at"], c["likes"], c.get("reply_count", 0), c["ip_location"], c["author"]["nickname"], c["text"], ])
想要真正的 .xlsx 文件?装好 pandas 和 openpyxl 后,一行 pandas.DataFrame(comments + reply_rows).to_excel("comments.xlsx", index=False) 就行。
费用和限制
- 每次返回了数据的调用按该接口的单价扣一次费(见定价)。空页、报错和超时都不扣费,每次返回的
meta.charged_usd写着这次扣了多少。 max_pages让每次运行的费用可预期;评论上万的视频可以调大。- 一分钟内请求太多会返回 429,按响应头
Retry-After等几秒再试。 - 数据请按适用法律和抖音的平台规则使用,详见服务条款。
下一步
- 想直接用自然语言分析评论?看在 Claude Code、Cursor 里用 MCP 查抖音、小红书、微博数据。
- 小红书也想这么做?看小红书有 API 吗?用 Python 拉取笔记和评论。
- 达人报价、传播表现和粉丝画像等投放数据在抖音星图页面。