news 2026/6/24 8:52:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
爬虫实战教程:如何使用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 前进行去重过滤。

日志记录:使用 Pythonlogging模块记录每次请求的状态码、抓取数量和异常信息,方便排查问题和统计进度。

四、常见问题

Q:没有 TikTok 账号可以抓取评论吗?

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

Q:能否同时抓取多个视频的评论?

A:可以。建议使用 Pythonconcurrent.futures模块实现多线程并发抓取,同时注意控制总体请求速率,避免触发平台风控。

Q:如何抓取二级回复(子评论)?

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

五、总结

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 8:51:48

微信小程序开店找哪家公司,正规靠谱怎么选?

微信小程序开店找哪家公司?全面比较与推荐一、先判断需求类型:明确要解决什么业务问题企业选型前,应先把目标拆成可执行场景,例如商品展示、交易转化、会员沉淀和日常运营。专业术语小提示:可以把需求分成三类&#xf…

作者头像 李华
网站建设 2026/6/24 8:47:33

以科技驱动——自动化缝制设备产业升级

在泉州惠安,誉财自动化设备有限公司的生产车间里,每天都呈现着一派繁忙而有序的景象。作为行业内专注于工装、休闲束脚裤等智能化升级的头部智造企业,誉财自动化正凭借其一系列先进的缝纫机产品,为全球服装制造业注入源源不断的活…

作者头像 李华
网站建设 2026/6/24 8:41:50

AT24MAC芯片实战:硬件唯一ID在嵌入式设备身份认证与量产中的应用

1. 项目概述:为什么我们需要带“身份证”的存储器?在嵌入式开发里,I2C EEPROM是个老朋友了,AT24C02、AT24C256这些型号大家闭着眼睛都能用。但不知道你有没有遇到过这样的场景:你设计了一款智能硬件,生产了…

作者头像 李华
网站建设 2026/6/24 8:41:30

不用 NVIDIA 也能搞分布式训练,RCCL 多卡通信实测

从单卡验证到多卡集群:RCCL 分布式训练实战 在之前的实践中,我们已经成功利用 LLaMA-Factory 配合 HIPify 工具链,在单张 AMD GPU 上完成了大模型的微调验证。对于很多算法工程师而言,单卡跑通只是“万里长征第一步”,…

作者头像 李华
网站建设 2026/6/24 8:40:49

Meltwater报告揭示的趋势:合规公关正在全球兴起

Meltwater报告揭示的趋势:合规公关正在全球兴起当前企业声誉管理服务市场已形成四大主流流派,各流派在服务理念、技术能力和适用场景上存在显著差异。对于面临声誉风险的企业而言,选择与自身需求匹配的服务流派,是危机应对成效的关…

作者头像 李华
网站建设 2026/6/24 8:40:29

ATDH1150USB下载线驱动安装与ATF15xx CPLD编程全攻略

1. 项目概述:从一根“古老”的下载线说起 如果你手头恰好有几片Atmel(现在已经是Microchip的一部分)的ATF15xx系列CPLD,比如ATF1502、ATF1504,想给它们烧录个逻辑代码,或者你的老设备上用的就是这些芯片需要…

作者头像 李华