TikTok 是目前全球用户规模最大的短视频社交平台之一,日活跃用户超过 10 亿,内容覆盖娱乐、教育、电商等各大垂类。在这个庞大的内容生态里,评论区往往比视频本身更具研究价值——用户的真实反馈、情感倾向、消费意图,全都沉淀在一条条评论文字中。
然而,TikTok 平台并未开放公共评论 API,且页面采用 JavaScript 动态加载机制,给数据获取带来了一定难度。本文将手把手带你用 Python 完成 TikTok 评论数据抓取的全流程。
一、TikTok 评论数据的核心应用场景
在正式动手之前,我们先明确一个问题:抓取 TikTok 评论数据,究竟能用来做什么?
- 竞品内容分析:通过批量抓取竞品账号热门视频下的 TikTok 评论,可以快速识别用户最关注的产品痛点和功能需求,为差异化内容策略提供依据。
- 爆款内容研究:高赞评论往往预示着用户的共鸣点。分析爆款视频的评论关键词分布,有助于创作团队找到下一个流量爆发点。
- 舆情监控与品牌管理:对品牌相关视频下的 TikTok 评论持续进行情感分析,可以实时感知舆论风向,为公关决策提供数据支撑。
- 用户画像构建:评论者的发言内容、互动频率、IP属地等信息,是构建精准用户画像的重要原始素材。
基于以上场景,本文的目标是:使用Python搭建一个轻量级的TikTok数据监控工具,并通过代理IP解决采集过程中常见的访问限制问题,让你的TikTok数据爬取任务更稳定、更高效。

二、Python 抓取 TikTok 评论数据:完整实战教程
了解了应用场景,我们正式进入技术实现环节。整个流程分为 8 个步骤,每步附完整可运行代码。
第 1 步:工具准备与依赖安装
在开始抓取 TikTok 评论之前,需要安装以下 Python 依赖库:
pip install requests pandas jieba wordcloud matplotlib
各库用途说明:
requests:发送 HTTP 请求pandas:数据清洗与 CSV 存储jieba:中文分词(用于评论关键词分析)wordcloud+matplotlib:词云可视化
同时建议按如下结构组织项目目录,便于后续管理:
TikTokCommentScraper/
├── data/ # 存放抓取结果
├── scripts/ # 爬虫脚本
├── logs/ # 运行日志
├── requirements.txt
└── README.md
第 2 步:分析 TikTok 评论加载机制
在编写代码之前,必须先通过浏览器开发者工具(F12)摸清 TikTok 评论的数据接口。
打开目标视频页面,在 Network 面板中筛选 XHR 请求,找到类似 /api/comment/list/ 的接口请求。该接口返回结构化 JSON 数据,包含评论内容、点赞数、用户信息、IP 属地等字段。
TikTok 评论页面通过 JavaScript 动态渲染,传统静态请求无法直接获取。核心参数中,cursor 字段用于控制翻页偏移量(通常步长为 20),aweme_id 为目标视频 ID,这两个参数是实现翻页抓取的关键。
第 3 步:构造请求,获取评论接口数据
从 Network 面板复制请求头中的 Cookie 和请求参数后,即可构造如下请求:
import requests
# 建议使用 Session
session = requests.Session()
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://www.tiktok.com/",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cookie": "你的完整Cookie"
}
def get_comments(aweme_id, cursor=0, count=20):
url = "https://www.tiktok.com/api/comment/list/"
# 注意:这里的 params 必须包含你从浏览器中抓到的所有加密参数(如 X-Bogus)
# 并且这些参数通常与当前的 cursor、timestamp 绑定,直接写死可能会导致翻页(cursor变动)时失效
params = {
"aweme_id": aweme_id,
"cursor": cursor,
"count": count,
# "X-Bogus": "xxxxxx", # 必须从抓包中获取
# "_signature": "xxxxxx",
}
try:
response = session.get(url, headers=HEADERS, params=params, timeout=10)
response.raise_for_status() # 如果返回 4xx 或 5xx 错误会抛出异常
return response.json()
except Exception as e:
print(f"请求失败: {e}")
return None
注意:Cookie 具有时效性,失效后需重新从浏览器获取。建议将 Cookie 存入独立配置文件,便于统一管理和更新。
第 4 步:配置代理,提升 TikTok 数据抓取稳定性
数据抓取过程中,频繁请求同一接口极易触发 TikTok 的风控机制,导致IP被封禁从而影响数据抓取进程。为保障 TikTok 数据抓取的稳定性,很多专业数据采集团队选择通过专业代理商(如IPFoxy)配置可轮换的动态代理池,作为解决方案。
下面以IPFoxy动态住宅代理为例,演示如何在 Python 中配置并使用代理。
- 获取代理信息
通过IPFoxy获取【动态住宅代理】,分别配置州城市、协议类型、会话轮换类型、代理格式等信息,获取到可用于链接的代理连接信息。

- 在Python中配置代理
将刚刚在IPFoxy复制的代理连接信息粘贴到配置以下配置示例代码中,如代理连接信息是:username:password@gate-us-ipfoxy.io:58688,那么配置代码示例如下:
import urllib.request
if __name__ == '__main__':
proxy = urllib.request.ProxyHandler({
'https': 'username:password@gate-us-ipfoxy.io:58688',
'http': 'username:password@gate-us-ipfoxy.io:58688',
})
opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
content = urllib.request.urlopen('http://www.ip-api.com/json').read()
print(content)
这时,直醒行代码就可以从日志看到出口IP改变,此时信息配置成功,可以进行下一步操作。

除了代理轮换,还建议在每次请求之间加入随机延迟(如 time.sleep(random.uniform(1.5, 3.5))),模拟真实用户的浏览节奏,显著降低被封禁的概率。
第 5 步:解析 TikTok 评论 JSON 数据
接口返回的 JSON 中,评论核心字段集中在 comments 数组内。以下代码完成字段提取:
from datetime import datetime
def parse_comments(json_data):
# 如果整个 json_data 为空或不是字典,直接返回空列表
if not json_data or not isinstance(json_data, dict):
return []
comment_list = json_data.get("comments") or [] # 防止返回的 comments 字段本身为 None
results = []
for item in comment_list:
# 安全地转换时间戳为可读格式格式:YYYY-MM-DD HH:MM:SS
raw_time = item.get("create_time")
formatted_time = ""
if raw_time:
try:
formatted_time = datetime.fromtimestamp(int(raw_time)).strftime('%Y-%m-%d %H:%M:%S')
except Exception:
formatted_time = str(raw_time) # 转换失败则保留原始数据
results.append({
"comment_id": item.get("cid"),
"text": item.get("text"),
"like_count": item.get("digg_count", 0), # 缺省为 0,方便后续数学计算
"reply_count": item.get("reply_comment_total", 0), # 缺省为 0
"create_time": formatted_time, # 已转换为可读时间
"ip_location": item.get("ip_label", "未知"), # 缺省为未知
"user_name": item.get("user", {}).get("nickname", "已注销用户"), # 链式安全获取,防止报错
})
return results
可提取的字段包括:评论 ID、评论内容、点赞数、发布时间、IP 属地、用户昵称、回复数等十余个维度,足以支撑大多数业务分析需求。
第 6 步:将评论数据保存至 CSV
使用 pandas 将解析结果持久化存储,并支持增量写入(避免重复覆盖已有数据):
import pandas as pd
import os
def save_to_csv(data, filepath="data/comments.csv"):
# 防护 1:如果没有数据,直接返回
if not data:
print("没有收到任何评论数据,跳过保存。")
return
# 防护 2:自动创建缺失的文件夹(如 data/)
dir_name = os.path.dirname(filepath)
if dir_name and not os.path.exists(dir_name):
os.makedirs(dir_name)
print(f"已自动创建目录: {dir_name}")
df = pd.DataFrame(data)
# 增量写入逻辑
if os.path.exists(filepath):
df.to_csv(filepath, mode="a", header=False, index=False, encoding="utf_8_sig")
else:
df.to_csv(filepath, mode="w", header=True, index=False, encoding="utf_8_sig")
print(f"成功保存 {len(data)} 条评论至 {filepath}")
使用 utf_8_sig 编码可避免 Excel 打开 CSV 时出现中文乱码问题。
第 7 步:自动翻页,抓取更多 TikTok 评论
单次请求默认返回 20 条评论,通过循环递增 cursor 值即可实现批量抓取:
import time
import random
def scrape_all_comments(aweme_id, max_pages=50):
all_comments = []
cursor = 0
# 动态定义文件名,将不同视频的评论区分开
filepath = f"data/comments_{aweme_id}.csv"
print(f"开始抓取视频 {aweme_id} 的评论,预计保存至 {filepath}...")
for page in range(max_pages):
# 1. 构造请求
data = get_comments(aweme_id, cursor=cursor)
# 鲁棒性检查:如果接口请求彻底失败(比如网络超时返回 None 或非字典)
if not data or not isinstance(data, dict):
print(f"第 {page+1} 页请求异常,未获取到有效 JSON 数据,停止抓取。")
break
# 2. 解析数据
comments = parse_comments(data)
# 3. 判断是否抓取完毕
if not comments:
print("本页未解析出任何评论,可能已抓取完毕或触发风控。")
break
# 4. 数据合并与即时保存
all_comments.extend(comments)
save_to_csv(comments, filepath=filepath) # 传入动态路径
print(f"第 {page+1} 页:本页抓取 {len(comments)} 条,累计已抓取 {len(all_comments)} 条评论")
# 5. 判断是否还有下一页 (TikTok 的 has_more 通常是 1 或 True)
has_more = data.get("has_more")
if not has_more or has_more in [0, "0", False]:
print("接口返回 has_more 为空或为 False,评论已全部加载完毕。")
break
# 6. 安全更新 cursor
next_cursor = data.get("cursor")
if next_cursor is not None:
cursor = next_cursor
else:
# 如果接口没返回 cursor,保守地通过 count 自增,防止死循环
cursor += 20
# 7. 随机延迟(频率控制)
sleep_time = random.uniform(2.0, 4.5) # 稍微拉长一点延迟,TikTok 风控极严格
time.sleep(sleep_time)
print(f"抓取任务结束!共成功抓取 {len(all_comments)} 条评论。")
return all_comments
通过 has_more 字段判断是否还有更多评论,避免无效请求造成资源浪费。
第 8 步:TikTok 评论关键词分析与词云可视化
抓取完成后,可对评论文本做进一步挖掘。以下示例使用 jieba 分词生成词云图:
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
def analyze_keywords(csv_path="data/comments.csv", top_n=20):
# 1. 安全读取数据
try:
df = pd.read_csv(csv_path, encoding="utf_8_sig")
except FileNotFoundError:
print(f"未找到数据文件: {csv_path},请先确认数据已抓取并保存。")
return
# 提取评论文本并去空
comments_text = " ".join(df["text"].dropna().astype(str).tolist())
# 2. 自定义停用词列表(根据业务需要随时自行添加)
stopwords = {"的", "了", "在", "是", "我", "你", "他", "她", "它", "们",
"这", "那", "有", "都", "去", "和", "就", "也", "很", "到",
"哈哈", "哈哈哈", "谢谢", "视频", "真的", "感觉", "一个"}
# 3. 使用 jieba 分词并清洗数据
# 过滤掉单字(len > 1)以及停用词
cleaned_words = [w for w in jieba.cut(comments_text) if len(w) > 1 and w not in stopwords]
# 4. 统计高频词
freq = Counter(cleaned_words).most_common(top_n)
print(f" 过滤后的高频关键词 Top {top_n}:")
for word, count in freq:
print(f" {word}: {count} 次")
# 5. 关键修正:将清洗好的词用空格拼接成字符串,再传给 WordCloud
wordcloud_input_text = " ".join(cleaned_words)
if not wordcloud_input_text.strip():
print("警告:没有足够的有效词汇用于生成词云!")
return
# 6. 生成并渲染词云
# 注意:font_path 的 simhei.ttf 确保你电脑系统里有这个字体,Mac 系统建议改为 "Arial Unicode.ttf"
print("正在生成词云图...")
wc = WordCloud(
font_path="simhei.ttf",
width=800,
height=400,
background_color="white",
max_words=100 # 限制词云图上最多显示的词数,画面更整洁
).generate(wordcloud_input_text)
# 7. 展示与保存
plt.figure(figsize=(10, 5)) # 设置画布比例
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
# 确保 data 目录存在(复用前面的逻辑防错)
import os
os.makedirs(os.path.dirname(csv_path), exist_ok=True)
output_img_path = os.path.join(os.path.dirname(csv_path), "wordcloud.png")
plt.savefig(output_img_path, dpi=150, bbox_inches='tight')
print(f" 词云图已成功保存至: {output_img_path}")
plt.show()
词云图直观呈现高频词汇,便于快速识别用户讨论热点,为内容选题和运营策略提供数据参考。
三、TikTok 评论抓取:效率与稳定性提升策略
基础流程跑通后,实际生产环境中还需考虑以下几个关键问题:
请求频率控制:除随机延迟外,可引入令牌桶算法精确控制 QPS,避免短时间内请求量过于集中。
Cookie 自动刷新:Cookie 失效是导致抓取中断的首要原因。建议将 Cookie 有效期监测纳入脚本逻辑,到期前自动发出告警或触发更新流程。
异常重试机制:网络波动或接口报错时,加入指数退避重试策略(如最多重试 3 次,每次等待时间翻倍),可大幅提高任务完成率。
数据去重:翻页过程中偶有评论重复返回,建议以 comment_id 为唯一键在写入 CSV 前进行去重过滤。
日志记录:使用 Python logging 模块记录每次请求的状态码、抓取数量和异常信息,方便排查问题和统计进度。
四、常见问题
A:部分接口无需登录即可访问,但稳定性较差,建议使用有效账号的 Cookie 以提高成功率。
A:可以。建议使用 Python concurrent.futures 模块实现多线程并发抓取,同时注意控制总体请求速率,避免触发平台风控。
A:在请求参数中额外传入 comment_id 即可调取对应的回复列表接口,逻辑与根评论完全一致,可直接复用翻页代码。
五、总结
本文完整演示了使用 Python 进行 TikTok 评论数据抓取的 8 个核心步骤:从安装依赖、分析接口机制,到配置代理、解析存储、翻页抓取,以及最终的评论关键词分析。针对实际运营中的稳定性挑战,我们也补充了请求频控、Cookie 管理、异常重试等工程化实践。
TikTok 数据抓取的真正价值在于数据应用——将评论关键词与情感分析、用户画像、内容策略相结合,才能将原始数据转化为可执行的业务洞察。


