2026年如何抓取公开的TikTok数据(有效方法)

TikTok的公开数据都在那里——隐藏的JSON数据块和游标分页的feed——但反机器人层是每个现成的抓取工具最终失效的原因。以下是仍然有效的方法,以及为什么移动IP很重要。

TikTok发布了大量令人惊讶的公开数据——个人资料、视频元数据、标签feed、互动计数——无需登录即可读取。抓取TikTok数据的难点不在于找到数据,而在于该网站的反机器人层会积极标记自动访问,这就是为什么每个现成的库最终会失效,以及您使用的出口IP决定了您是获得结果还是遇到CAPTCHA。本指南涵盖了公开数据的位置、分页的实际工作原理、为什么非官方工具会失效,以及为什么移动代理是务实的默认选择。它涉及的是公开的、非个人的研究数据——趋势、创作者、标签——而不是抓取私人账户。

公开数据的实际位置

TikTok是一个客户端渲染的应用程序,因此一个简单的GET请求只会返回一个外壳。有效内容位于两个地方:嵌入在页面中的隐藏JSON数据块(应用程序从中获取数据的通用数据脚本)和应用程序加载后调用的内部feed端点。在这两者之间,您几乎可以读取观众看到的所有内容:对于每个视频,标题textcreateTimediggCount(点赞)、shareCountplayCountcommentCountcollectCount,以及嵌套的authormusicstats对象。作者数据包括粉丝和总点赞数、验证状态、简介和简介链接。幻灯片帖子标记isSlideshow并携带图像链接数组而不是视频。

个人资料需要两个ID,而不仅仅是用户名

每次首次尝试时都会遇到的陷阱:提取用户的视频feed需要两个标识符,而不仅仅是用户名。您需要数字id(userID)secUid,这两个都来自于首先解析个人资料。如果错过secUid,feed调用将返回空结果。解析一次,然后分页浏览feed。

# Sketch of the account-free flow every TikTok scraper follows.
# 1) Resolve the profile to get BOTH ids
user = get_user("someusername")          # -> {"id": ..., "secUid": ...}
user_id, sec_uid = user["id"], user["secUid"]

# 2) Page the feed with those ids (see cursor loop below)
videos = user_feed(user_id, sec_uid)

分页是基于游标的(并限制在约30)

一个feed调用大约返回30个帖子——远不及完整时间线。TikTok使用游标分页:每个响应包括一个游标(此批结束的位置)和一个hasMore布尔值。要获取整个feed,您需要循环,将游标传回,直到hasMore为假。这也是您最容易暴露的地方——每个页面都是您IP的另一个请求,因此长时间线意味着从一个地址发出大量调用。

def crawl_feed(user_id, sec_uid):
    items, cursor, has_more = [], 0, True
    while has_more:
        page = user_feed(user_id, sec_uid, cursor=cursor)  # ~30 posts
        items.extend(page["itemList"])
        cursor = int(page["cursor"])
        has_more = page["hasMore"]
        # rotate / pace here — every loop is a fresh request from your IP
    return items
TikTok feed上游标分页的图示:解析用户到id和secUid,30个帖子的第一页,移动出口IP,在游标上循环直到hasMore
feed会给您一个游标和一个hasMore标志;继续传回游标,直到hasMore变为假。

为什么非官方库不断失效

如果您使用过流行的开源TikTok库,您会有这样的感觉:它工作一段时间,然后开始返回CAPTCHA或空结果,并出现分叉补丁以维持其运行。这种变化不是维护者的错——TikTok更改其签名和反机器人逻辑,每个非官方客户端都在努力跟上。由此得出两个教训。固定到一个维护的分叉,并期望更新它。不要将您的数据管道的可靠性绑定到一个脆弱的库上——持久的部分是您围绕当前有效的获取方法构建的解析和轮换层。

抓取的媒体URL会过期——快速获取它们

对于任何存档内容的人来说,这是一个微妙的陷阱:TikTok的头像、封面和视频URL是带时间签名的。它们携带x-expiresx-signature查询参数,并在数小时内停止工作。因此,您今天早上抓取的链接到晚上就失效了。如果您需要媒体本身,请在发现它的同一运行中下载它;如果您只需要元数据,请存储稳定的ID,并根据需要重新解析新的URL。

为什么特别是移动代理

TikTok是一个移动优先的平台,具有移动级别的反机器人期望,而这就是IP选择决定一切的地方。数据中心IP很快就会被标记。住宅IP要好得多。但移动代理是最强的选择,因为运营商网络的工作方式:移动运营商通过少量共享IP(CGNAT)路由数千名真实用户,因此单个移动IP看起来像是一群真实用户。阻止它意味着阻止真实客户,平台极不愿意这样做——我们在为什么移动IP如此受信任中解释了原因。移动出口还允许您采样特定地区的feed:TikTok根据国家调整趋势,因此英国出口和美国出口返回不同的“为您推荐”内容。

获取TikTok数据的移动代理

TikTok商店和地理差异

TikTok商店产品数据遵循相同的结构——公开列表、结构化JSON、游标分页——但可用性受到地理限制,因此您只能从该地区的出口IP看到该地区的目录。这也是TikTok增长工作依赖于位置匹配IP的原因:无论您是在查看商店库存还是趋势feed,您获得的内容取决于您的IP所显示的位置。从匹配的出口采样每个市场,并将结果视为地区特定的,而不是全球的。

抓取公开的TikTok数据时有效和有问题的事项清单,包括隐藏的JSON、游标分页、过期的媒体URL和数据中心IP标记
无需登录即可访问所有公开数据——摩擦点在于反机器人标记、过期的URL和30帖子的限制。

何时跳过DIY堆栈

维护一个TikTok抓取器意味着追逐签名更改、处理CAPTCHA和照看一个分叉——这是一种持续的负担,而不是一次性构建。如果TikTok数据是产品的输入而不是产品本身,那么一个Scraper API可以渲染页面、轮换移动级IP并返回干净的JSON,从而减轻您的维护负担。在学习结构时运行自己的堆栈;当维护成本超过洞察力时,切换到托管的获取层。

常见问题解答

可以在没有账户的情况下抓取TikTok数据吗?

可以——公开的个人资料、视频、标签及其互动元数据无需登录即可读取,因为TikTok将它们嵌入在隐藏的JSON数据块中,并通过内部feed端点提供。您仍然需要解析个人资料的数字id和secUid,然后分页其feed,并且如果没有干净、轮换的IP,您将遇到反机器人标记。

为什么我的TikTok抓取器会遇到CAPTCHA?

TikTok会标记表现得像自动化的IP——请求过多、数据中心地址范围或声誉不佳的IP。游标分页使情况更糟,因为完整的时间线是从一个IP发出的许多调用。将请求分散到轮换的移动或住宅池中,控制节奏,并验证响应。移动IP因由真实用户共享而最不易引起怀疑。

一个请求可以返回多少TikTok数据?

单个feed调用大约返回30个帖子。要收集完整的时间线,您需要循环响应给您的游标,每次传回,直到hasMore标志为假。因为每个页面都是您IP的另一个请求,较长的时间线意味着更多的暴露——这就是为什么轮换和节奏在计数增加时很重要。

我需要TikTok的移动代理吗?

不严格需要,但它们是最强的选择。数据中心IP很快被标记;住宅IP效果更好;移动代理效果最佳,因为运营商CGNAT意味着一个移动IP由许多真实用户共享,因此平台不愿意阻止它。移动出口还允许您通过选择出口国家获取地理特定的趋势和商店数据。

TikTok的公开数据无需登录即可访问——难点在于保持可访问性。解析两个个人资料ID,循环游标,立即获取签名媒体,并通过移动级IP路由,使您的请求看起来像他们隐藏的人群。正确设置IP层,其余的只是JSON。

从QuantumProxies移动代理开始