用 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/...)在浏览器里打开后,跳转后的地址里有同一串数字。

先用作品详情确认一下是不是这条视频:

Python
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 做键存进字典,重复的自然就去掉了。

Python
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 条:

Python
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 为空的是一级评论。

Python
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 等几秒再试。
  • 数据请按适用法律和抖音的平台规则使用,详见服务条款。

下一步

本文用到的接口

更多教程

你的 Agent 能看到什么,取决于你给它什么数据

把抖音、小红书、公众号和电商评价交给它:结构化,按次计费,失败不扣费。