• Blog
  • 使用场景
  • 爬虫实战教程:如何使用Python抓取TikTok的评论数据?
首页 » 使用场景 » 爬虫实战教程:如何使用Python抓取TikTok的评论数据?

爬虫实战教程:如何使用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 数据抓取的真正价值在于数据应用——将评论关键词与情感分析、用户画像、内容策略相结合,才能将原始数据转化为可执行的业务洞察。

滚动至顶部