爬虫实战教程:如何使用Python抓取TikTok的评论数据?

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 模块记录每次请求的状态码、抓取数量和异常信息,方便排查问题和统计进度。

四、常见问题

Q:没有 TikTok 账号可以抓取评论吗? A:部分接口无需登录即可访问,但稳定性较差,建议使用有效账号的 Cookie 以提高成功率。

Q:能否同时抓取多个视频的评论? A:可以。建议使用 Python concurrent.futures 模块实现多线程并发抓取,同时注意控制总体请求速率,避免触发平台风控。

Q:如何抓取二级回复(子评论)? A:在请求参数中额外传入 comment_id 即可调取对应的回复列表接口,逻辑与根评论完全一致,可直接复用翻页代码。

五、总结

本文完整演示了使用 Python 进行 TikTok 评论数据抓取的 8 个核心步骤:从安装依赖、分析接口机制,到配置代理、解析存储、翻页抓取,以及最终的评论关键词分析。针对实际运营中的稳定性挑战,我们也补充了请求频控、Cookie 管理、异常重试等工程化实践。

TikTok 数据抓取的真正价值在于数据应用——将评论关键词与情感分析、用户画像、内容策略相结合,才能将原始数据转化为可执行的业务洞察。