# TikTok API Python 教程：导出视频评论做情感分析（2026）

> 按关键词搜 TikTok，把头部视频下的评论一页页拉下来，用 Python 和 requests 写成一份能直接做情感分析的干净 CSV。参数、代码和花费。

网页版：https://okdata.online/zh/guides/tiktok-comments-python/

两个接口：先用 TikTok 视频搜索挑视频，再对每条视频逐页调 TikTok 视频评论。下面的示例一共 11 次调用，花费 $0.022；失败的调用不扣费。

更新于 2026-11-12

要做的事：想知道 TikTok 上的人怎么看一个产品或话题，依据是大家写了什么，而不是播放量。这就需要从讨论最集中的那几条视频下面拿几百条真实评论，存成情感模型或大模型能直接读的文件。TikTok 自己的 Research API 里有评论，但只开放给经 TikTok 审核通过的研究者，企业怎么办见[TikTok Research API 只给学术用，企业用什么](https://okdata.online/zh/answers/tiktok-research-api-alternative/)。这里每次调用就是一个带 API key 的 HTTPS GET，不需要 TikTok 账号，也不用登录，依赖只有 `requests`。

最后得到 `tiktok_comments.csv`：每条评论一行，带所属视频、视频语言、评论内容、点赞、回复数和时间，已去重，空内容已剔除。

## 分步操作

先设好 key：`export OKDATA_API_KEY=okd_...`。每次返回都有 `code`（成功为 `"ok"`）；列表结果在 `data.items`，`page` 里带着下一页的 cursor。

### 第一步：找到讨论多的视频

[TikTok 视频搜索](https://okdata.online/zh/apis/tiktok/videos/search/)有 `query` 和 `sort` 两个参数，`sort` 可选 `relevance`（默认）、`most_liked` 或 `latest`。TikTok 的搜索以相关性为主，`latest` 并不是严格按时间排，在意日期的话自己按 `published_at` 过滤。一次调用返回约 30 条视频，每次 $0.002，每条有 `id`、文案 `text`、`lang`、`published_at`、`author.username`，以及 `metrics.views`、`metrics.likes`、`metrics.comments` 和 `metrics.shares`。按 `metrics.comments` 挑视频：400 万播放、80 条评论的视频，对这件事没什么用。

```bash
curl -G "https://api.okdata.online/v1/tiktok/videos/search" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'query=air fryer' --data-urlencode 'sort=most_liked' \
  --data-urlencode 'fields=id,text,lang,author.username,metrics.comments,published_at'
```

### 第二步：逐页拉评论

[TikTok 视频评论](https://okdata.online/zh/apis/tiktok/videos/comments/list/)的 `id` 填视频的数字 ID（比如 `7429815063927400734`）。一次调用返回约 50 条一级评论，每次 $0.002，每条有 `id`、`text`、`likes`、`replies`（回复数）、`published_at`、`author.username`，TikTok 显示了地区的话还有 `ip_location`。下一页就把 `page.next_cursor` 原样作为 `cursor` 传回去；`page.has_more` 为 `false` 时停下。

```bash
curl -G "https://api.okdata.online/v1/tiktok/videos/comments/list" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=7429815063927400734'
```

### 第三步：完整脚本

脚本搜索一次，留下评论最多的 `VIDEOS` 条视频，每条最多读 `PAGES_PER_VIDEO` 页，清洗文本后写进 CSV。每条视频读同样的页数，可以避免一条爆款把其他视频的声音盖过去。辅助函数遇到限流或上游繁忙就用同一个 `Idempotency-Key` 重试，重试不会重复扣费；搜索之后被删掉的视频直接跳过。

```python
import csv
import os
import re
import time
import uuid

import requests

API = "https://api.okdata.online"
KEY = os.environ["OKDATA_API_KEY"]
QUERY = "air fryer"
VIDEOS = 5            # 读几条视频
PAGES_PER_VIDEO = 2   # 每条视频读几页评论；每页一次调用


def call(path, **params):
    headers = {"Authorization": f"Bearer {KEY}", "Idempotency-Key": str(uuid.uuid4())}
    for attempt in range(4):
        body = requests.get(API + path, headers=headers, params=params, timeout=60).json()
        if body["code"] == "ok":
            return body
        if body["code"] == "not_found":
            return None  # 已删除或不公开：不扣费
        if body.get("retry") in ("yes", "same_key"):
            time.sleep(body.get("retry_after_seconds") or 2 ** attempt)
            continue
        raise RuntimeError(f"{body['code']}: {body['message']} (request {body['request_id']})")
    raise RuntimeError(f"{path}: 重试 4 次仍然失败")


def comments(video_id, max_pages):
    cursor = None
    for _ in range(max_pages):
        body = call("/v1/tiktok/videos/comments/list", id=video_id, **({"cursor": cursor} if cursor else {}))
        if body is None:
            return
        yield from body["data"]["items"]
        if not body["page"]["has_more"]:
            return
        cursor = body["page"]["next_cursor"]


def clean(text):
    return re.sub(r"\s+", " ", text or "").strip()


videos = call("/v1/tiktok/videos/search", query=QUERY, sort="most_liked")["data"]["items"]
videos = sorted(videos, key=lambda v: v["metrics"]["comments"] or 0, reverse=True)[:VIDEOS]

seen = set()
with open("tiktok_comments.csv", "w", newline="", encoding="utf-8-sig") as f:
    out = csv.writer(f)
    out.writerow(["video_id", "video_lang", "video_caption", "comment_id", "text", "likes", "replies", "published_at", "author"])
    for v in videos:
        for c in comments(v["id"], PAGES_PER_VIDEO):
            text = clean(c["text"])
            if not text or c["id"] in seen:
                continue
            seen.add(c["id"])
            out.writerow([v["id"], v["lang"], clean(v["text"])[:120], c["id"], text,
                          c["likes"], c["replies"], c["published_at"], c["author"]["username"]])

print(f"{len(seen)} 条评论，来自 {len(videos)} 条视频")
```

跑一遍就是上面的示例：1 次搜索加 10 页评论，约 500 条。想要更大的样本，20 条视频各读 4 页是 80 次评论调用，搜索之外再花 $0.16。

### 第四步：打分

CSV 已经可以交给任何打分工具。下面三个习惯能让结果更可信：

- **按点赞加权。** 一条有 900 个赞的抱怨，代表的人比一条零赞的多。分数旁边保留 `likes`，报告时同时给出“评论数占比”和“点赞数占比”。
- **处理语言。** 评论本身没有语言字段。`video_lang` 可以作为整串评论的参考；多语言混杂的评论区，需要多语种模型或者先做语言检测。
- **人工抽查。** 反讽和网络用语哪个模型都会看错。每个标签先读 30 条，再决定信不信这个比例。

用大模型的话，每批 50 到 100 条评论、把视频文案作为上下文，效果不错：让它给每条评论打标签，再总结出最常见的三个好评点和三个槽点。这一段流程见[用 TikTok 评论做情感分析](https://okdata.online/zh/answers/tiktok-comments-api-sentiment-analysis/)。

## 注意事项

- **只有一级评论。** 每条评论带回复数，不带回复正文，所以导出的行数会比视频的 `metrics.comments` 少，后者把回复也算进去了。
- **顺序。** 评论按 TikTok 自己的顺序返回，没有排序参数。每条视频读两页，是 TikTok 排在前面的那部分，不是随机样本。
- **地区。** `ip_location` 只在 TikTok 显示了地区时才有值，当作可选字段处理。
- **精简返回。** `fields=id,text,likes,replies,published_at` 能让返回更短，适合直接交给模型读。价格不变。
- **不收钱的情况。** 搜索之后被删掉的视频返回 `not_found`，不扣费，限流和其他错误也一样。24 小时内同样的请求配同样的 `Idempotency-Key`，会拿回存下的结果，`meta.replayed` 为 `true`，不再扣费。

只导出一条视频的评论到 Excel 的话，[把 TikTok 评论导出成 CSV](https://okdata.online/zh/answers/export-tiktok-comments-csv/)更简单。

## 示例花费

搜一次 air fryer（空气炸锅），取评论最多的 5 条视频，各读 2 页评论（约 100 条）

| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| [TikTok 视频搜索](https://okdata.online/zh/apis/tiktok/videos/search/) | 1 | $0.002 | $0.002 |
| [TikTok 视频评论](https://okdata.online/zh/apis/tiktok/videos/comments/list/) | 10 | $0.002 | $0.02 |
| 合计 | 11 |  | $0.022 |

按本页生成时的价格计算。失败的调用不扣费。

## 在你的 AI 里用（MCP）

先接好 MCP 服务，然后直接说你要什么。智能体会自己找到这些接口、看清价格，再用你的余额调用。

可以这样说：在 TikTok 搜 air fryer，取评论最多的 5 条视频，每条拿 100 条左右评论，告诉我大家喜欢什么、抱怨什么，再给个大致的正负面比例。

```json
{
  "endpoint": "tiktok.videos.search",
  "params": {
    "query": "ai agents"
  },
  "idempotency_key": "<新的 UUID>"
}
```

MCP：`https://api.okdata.online/mcp`

## 本指南用到的接口

- [TikTok 视频搜索](https://okdata.online/zh/apis/tiktok/videos/search/) `tiktok.videos.search`：$0.002/次 · 每页约 30 条视频
- [TikTok 视频评论](https://okdata.online/zh/apis/tiktok/videos/comments/list/) `tiktok.videos.comments.list`：$0.002/次 · 每页约 50 条评论

## 更多TikTok内容

- [TikTok API](https://okdata.online/zh/apis/tiktok/)
- [怎么拉取 TikTok 创意中心热门广告，再到广告库里查某个品牌](https://okdata.online/zh/guides/tiktok-creative-center-top-ads/)
- [怎么按关键词批量采集 TikTok Shop 商品评价](https://okdata.online/zh/guides/tiktok-shop-product-reviews/)
- [爬抖音、TikTok 一定要买代理 IP 吗？要花多少钱？](https://okdata.online/zh/answers/do-i-need-proxies-for-social-media-scraping/)
- [TikTok Research API 只给高校研究者，企业要拿 TikTok 公开数据用什么？](https://okdata.online/zh/answers/tiktok-research-api-alternative/)
- [有没有能让 Claude 读取 TikTok、YouTube 和 X 数据的 MCP 服务？](https://okdata.online/zh/answers/tiktok-youtube-x-mcp-server/)
- [TikTokApi 一直报 EmptyResponseException，有没有更稳的 TikTok 数据获取方式？](https://okdata.online/zh/answers/tiktokapi-emptyresponseexception/)
- [做情感分析，用哪个 TikTok 评论 API？](https://okdata.online/zh/answers/tiktok-comments-api-sentiment-analysis/)
- [社媒接口的结果该缓存多久，才能少花冤枉钱？](https://okdata.online/zh/answers/cache-social-media-api-results/)
- [平台官方 API 和第三方数据接口怎么选（2026）](https://okdata.online/zh/compare/official-apis-vs-data-apis/)
- [怎么选社交媒体数据 API（2026）](https://okdata.online/zh/compare/social-media-data-apis/)
- [评论接口](https://okdata.online/zh/roles/posts-comments-list/)
- [内容搜索接口](https://okdata.online/zh/roles/posts-search/)
