---
url: 'https://www.ipfoxy.net/blog/use-cases/6518'
title: 爬虫实战教程：如何使用Python抓取TikTok的评论数据？
date: '2026-06-23T17:30:59+08:00'
modified: '2026-06-23T17:31:01+08:00'
type: post
summary: 本文详细介绍如何使用 Python 抓取 TikTok 评论数据，并结合 rotating residential proxy 提升采集稳定性，最终通过关键词分析和词云可视化挖掘用户洞察。
categories:
  - 使用场景
published: true
---

# 爬虫实战教程：如何使用Python抓取TikTok的评论数据？

文章大纲            

        [
                一、TikTok 评论数据的核心应用场景
    ](#yiTikTok_ping_lun_shu_ju_de_he_xin_ying_yong_chang_jing)
        [
                二、Python 抓取 TikTok 评论数据：完整实战教程
    ](#erPython_zhua_qu_TikTok_ping_lun_shu_ju_wan_zheng_shi_zhan_jiao_cheng)
        [
                第 1 步：工具准备与依赖安装
    ](#di_1_bu_gong_ju_zhun_bei_yu_yi_lai_an_zhuang)
        [
                第 2 步：分析 TikTok 评论加载机制
    ](#di_2_bu_fen_xi_TikTok_ping_lun_jia_zai_ji_zhi)
        [
                第 3 步：构造请求，获取评论接口数据
    ](#di_3_bu_gou_zao_qing_qiu_huo_qu_ping_lun_jie_kou_shu_ju)
        [
                第 4 步：配置代理，提升 TikTok 数据抓取稳定性
    ](#di_4_bu_pei_zhi_dai_li_ti_sheng_TikTok_shu_ju_zhua_qu_wen_ding_xing)
        [
                第 5 步：解析 TikTok 评论 JSON 数据
    ](#di_5_bu_jie_xi_TikTok_ping_lun_JSON_shu_ju)
        [
                第 6 步：将评论数据保存至 CSV
    ](#di_6_bu_jiang_ping_lun_shu_ju_bao_cun_zhi_CSV)
        [
                第 7 步：自动翻页，抓取更多 TikTok 评论
    ](#di_7_bu_zi_dong_fan_ye_zhua_qu_geng_duo_TikTok_ping_lun)
        [
                第 8 步：TikTok 评论关键词分析与词云可视化
    ](#di_8_buTikTok_ping_lun_guan_jian_ci_fen_xi_yu_ci_yun_ke_shi_hua)
        [
                三、TikTok 评论抓取：效率与稳定性提升策略
    ](#sanTikTok_ping_lun_zhua_qu_xiao_lu_yu_wen_ding_xing_ti_sheng_ce_lue)
        [
                四、常见问题
    ](#si_chang_jian_wen_ti)
        [
                五、总结
    ](#wu_zong_jie)
    

TikTok 是目前全球用户规模最大的短视频社交平台之一，日活跃用户超过 10 亿，内容覆盖娱乐、教育、电商等各大垂类。在这个庞大的内容生态里，**评论区**往往比视频本身更具研究价值——用户的真实反馈、情感倾向、消费意图，全都沉淀在一条条评论文字中。

然而，TikTok 平台并未开放公共评论 API，且页面采用 JavaScript 动态加载机制，给数据获取带来了一定难度。本文将手把手带你用 Python 完成 TikTok 评论数据抓取的全流程。

## 一、TikTok 评论数据的核心应用场景

在正式动手之前，我们先明确一个问题：抓取 TikTok 评论数据，究竟能用来做什么？

- **竞品内容分析**：通过批量抓取竞品账号热门视频下的 TikTok 评论，可以快速识别用户最关注的产品痛点和功能需求，为差异化内容策略提供依据。

- **爆款内容研究**：高赞评论往往预示着用户的共鸣点。分析爆款视频的评论关键词分布，有助于创作团队找到下一个流量爆发点。

- **舆情监控与品牌管理**：对品牌相关视频下的 TikTok 评论持续进行情感分析，可以实时感知舆论风向，为公关决策提供数据支撑。

- **用户画像构建**：评论者的发言内容、互动频率、IP属地等信息，是构建精准用户画像的重要原始素材。

基于以上场景，本文的目标是：使用Python搭建一个轻量级的TikTok数据监控工具，并通过代理IP解决采集过程中常见的访问限制问题，让你的TikTok数据爬取任务更稳定、更高效。

![](https://blog-s21n.ipfoxy.com/wp-content/uploads/2026/06/3-27.webp)

## 二、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](https://app.ipfoxy.net/login?source=blog)）配置可轮换的动态代理池，作为解决方案。

下面以[IPFoxy](https://app.ipfoxy.net/login?source=blog)动态住宅代理为例，演示如何在 Python 中配置并使用代理。

- **获取代理信息**

通过[IPFoxy](https://app.ipfoxy.net/login?source=blog)获取【动态住宅代理】，分别配置州城市、协议类型、会话轮换类型、代理格式等信息，获取到可用于链接的代理连接信息。

[前往免费试用IPFoxy](https://app.ipfoxy.net/login?source=blog)

![](https://blog-s21n.ipfoxy.com/wp-content/uploads/2026/06/4-24-1024x362.webp)

- **在Python中配置代理**

将刚刚在[IPFoxy](https://app.ipfoxy.net/login?source=blog)复制的代理连接信息粘贴到配置以下配置示例代码中，如代理连接信息是：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改变，此时信息配置成功，可以进行下一步操作。

![](https://blog-s21n.ipfoxy.com/wp-content/uploads/2026/06/5-15.webp)

除了代理轮换，还建议在每次请求之间加入随机延迟（如 `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 数据抓取的真正价值在于数据应用——将评论关键词与情感分析、用户画像、内容策略相结合，才能将原始数据转化为可执行的业务洞察。

