用 Python 学会抓取 TikTok 视频

最后更新于 April 15, 2026

TikTok 目前每月活跃用户大约有 ,而创作者每天上传的视频数量估计高达 2300 万条。哪怕你只想从这股数据洪流里捞出一小部分,真正上手过的人都知道有多折腾。

通常流程基本都是这样:你搜“用 Python 抓取 TikTok 视频”,复制一段教程里的代码(或者干脆让 ChatGPT 帮你生成),跑起来之后却发现……什么都没有。要么是空白 HTML,要么是 403 报错,要么更让人崩溃——“Process finished with exit code 0”,但就是没有任何输出。我在很多 GitHub issue 和 Reddit 讨论串里都见过这种情况,所以才写了这篇指南。本文会介绍 2025 年依然可用的 3 种 Python 方法,完整演示如何下载真正的 .mp4 视频文件(不是只拿元数据——大多数教程都只讲到这一步),并附上一张对比表,方便你按场景选最合适的方案。如果你根本不想写 Python,我还会介绍像 这样的无代码替代方案,基本两步就能拿到同样的数据。

“抓取 TikTok 视频”到底是什么意思?

在开始写代码前,先把概念说清楚很重要。因为“抓取 TikTok 视频”这句话,其实包含两件完全不同的事:

  1. 提取视频元数据:文案、标签、点赞数、评论数、分享数、播放量、发布时间、作者信息。这也是大多数教程主要讲的内容。
  2. 下载真正的视频文件(.mp4):把视频本身保存到本地。很多人在搜索“抓取 TikTok 视频”时真正想要的其实是这个,但几乎没有教程会讲。

这篇指南两种都覆盖。下面介绍的每种方法,都可以提取元数据,并拿到保存 .mp4 文件所需的下载链接。

为什么要用 Python 抓取 TikTok 视频?

TikTok 平均每位用户每天会观看约 ,而 TikTok Shop 还带来了 。对企业来说,TikTok 数据的商业价值非常可观。以下是我最常见到的应用场景:

应用场景抓取内容适用对象
达人与营销调研互动率、粉丝数、内容形式、标签表现营销团队、代理公司
内容策略热门标签、爆款视频形式、发布频率内容创作者、社媒运营
品牌监测品牌提及、活动覆盖、用户情绪品牌经理、公关团队
竞品分析竞品视频表现、广告素材、TikTok Shop 商品列表电商团队、产品团队
市场研究新兴趋势、用户行为、产品发现分析师、对冲基金、研究机构
归档与合规用于内部审查或留档的视频文件法务、合规、代理公司

商业回报也是真实存在的:预计 2026 年美国 TikTok 广告收入将达到 234 亿美元,而在 TikTok Shop 的头部类目中,联盟创作者贡献了 。如果你做电商或达人营销,这些数据直接关系到营收。

为什么基础版 Python 代码在 TikTok 上经常失效?

如果你已经试过类似下面的代码却一无所获,那你并不孤单:

1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...然后 HTML 里什么有用内容都没有

原因其实很直接:TikTok 是最难抓取的平台之一。普通的 requests.get() 拿到的通常只是一层几乎空白的 HTML 外壳,因为真正内容是靠浏览器里的 JavaScript 渲染出来的。除此之外,TikTok 还部署了非常激进的反爬机制,包括行为检测、TLS 指纹识别、一个会生成请求签名的 ,以及会频繁变化的动态 CSS 选择器。

tiktok-anti-bot-wall.webp

根据 Imperva 2025 年《Bad Bot Report》,自动化流量在 2024 年首次超过了人类流量——如今机器人已占据 。TikTok 对这一点非常清楚,所以防护体系也做得相当严。

下面这张快速诊断表,可以帮你判断问题出在哪儿,并直接跳到对应方法:

症状可能原因可解决的方法
HTML 为空 / 没有数据内容由 JS 渲染;requests 不能执行 JavaScript方法 1(隐藏 JSON)或方法 3(Playwright)
403 / 拒绝访问缺少或错误的请求头;触发反爬检测使用正确请求头的 方法 1
第一次能用,之后就失效频率限制 / IP 被封轮换代理(所有方法都适用)
出现登录墙需要会话 / Cookie方法 3(保留登录状态的浏览器)
ChatGPT 生成的代码没有结果TikTok 结构自模型训练后发生变化这 3 种方法都适用(都是最新方案)

大致来说,每个 IP 每分钟 30–60 次请求就可能开始触发软封或验证码。数据中心 IP 往往几分钟内就会被标记,住宅代理或移动代理在高频场景下几乎是必需品。

总览:用 Python 抓取 TikTok 视频的 3 种方法

先给你一个路线图。每种方法都有不同取舍,下面我会给出可直接运行的代码:

  1. 隐藏 JSON 提取 — 解析 TikTok 页面里嵌入的 __UNIVERSAL_DATA_FOR_REHYDRATION__ 脚本标签。最快、最简单,不需要浏览器。
  2. TikTok 内部 API — 直接调用未公开的 /api/post/item_list/ 接口,通过游标分页批量获取数据。
  3. Playwright 浏览器自动化 — 在无头浏览器里渲染页面,处理无限滚动、动态内容和登录墙。

这三种方法都可以用来下载真正的 .mp4 视频文件——下载部分我会在方法讲解之后单独说明。最后还会给出完整对比表,帮助你做决定。

方法 1:用隐藏 JSON 抓取 TikTok 视频(适合新手)

我最推荐从这个方法开始。TikTok 几乎每次页面加载时,都会在一个 id 为 __UNIVERSAL_DATA_FOR_REHYDRATION__<script> 标签里嵌入一大段 JSON。这个 JSON 包含了前端本来要渲染的所有个人资料和视频数据,也就是说,你只需发起一次 HTTP 请求就能拿到它,不需要浏览器。

你需要准备什么

  • Python 3.8+
  • requests(或 httpx
  • beautifulsoup4(或 parsel
  • 合适的请求头:User-AgentRefererAccept-Language

安装依赖:

1pip install requests beautifulsoup4

分步骤:从脚本标签中提取 TikTok 视频数据

第 1 步:带上真实浏览器请求头发送 GET 请求。

这是很多新手最容易踩坑的地方。如果你直接裸发 requests.get() 不加请求头,TikTok 往往会回 403 或验证码页面。至少要带上当前浏览器风格的 User-AgentReferer

1import requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.tiktok.com/@charlidamelio"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
7    "Referer": "https://www.tiktok.com/",
8    "Accept-Language": "en-US,en;q=0.9",
9}
10resp = requests.get(url, headers=headers)

第 2 步:解析 HTML,找到 hydration 脚本标签。

1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")

如果 script_tagNone,要么是 TikTok 把你拦下来了(先看状态码),要么就是它改了标签 id(虽然不常见,但也有可能)。

第 3 步:把脚本内容加载为 JSON。

1data = json.loads(script_tag.string)

第 4 步:沿着 JSON 结构提取视频元数据。

数据结构会嵌在 __DEFAULT_SCOPE__ 下面。以用户主页为例:

1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# 个人主页统计数据
4stats = user_info["stats"]
5print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# 视频列表(第一页)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9    print(video["desc"])  # 视频文案
10    print(video["stats"]["playCount"])  # 播放量
11    print(video["video"]["playAddr"])  # 视频下载地址(无水印)
12    print(video["video"]["downloadAddr"])  # 视频下载地址(有水印)

第 5 步:提取视频下载链接。

playAddr 通常指向更干净的版本(一般没有 TikTok 水印叠层),而 downloadAddr 则是带标准水印的版本。两者都是 .mp4 文件的直链,不过下载时需要带特定请求头(下方下载部分会讲)。

现在你应该已经拿到了一组视频元数据对象,每个对象都包含文案、统计信息、创建时间、标签(在 challenges[]textExtra 中)以及直链视频 URL。

隐藏 JSON 方法的局限性

  • 只能拿到初始页面加载的数据——通常是主页前约 30 条视频
  • 无法处理无限滚动或分页(因为没有“下一页”可请求)
  • 如果 TikTok 改了脚本标签 id 或 JSON 结构,解析器就会失效(这种情况会周期性发生—— 可以帮助你尽早发现问题)
  • 适合:快速抓取主页、一次性拉取数据,或只需要最近发布的视频

方法 2:通过 TikTok 内部 API 抓取视频

TikTok 前端不会一次性加载所有视频,而是在你滚动页面时通过 XHR 去请求内部 API。用户视频最常见的接口是 /api/post/item_list/。你可以直接用 Python 调这个接口,这样就能拿到基于游标的分页数据,访问整个主页的所有视频,而不只是第一页。

如何找到内部 API 接口

在 TikTok 个人主页打开 Chrome DevTools,切到 Network 面板,按 XHR 过滤,然后向下滚动。你会看到类似这样的请求:

1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...

关键参数有:

  • secUid — 主页的唯一 ID(可以从方法 1 的 JSON 中提取,路径是 userInfo.user.secUid
  • cursor — 分页偏移量(从 0 开始,每次响应都会返回下一个 cursor)
  • count — 每页条数(通常是 30–35)

分步骤:用 Python 查询 TikTok 内部 API

第 1 步:获取目标主页的 secUid

你可以从隐藏 JSON(方法 1)里拿,也可以从主页 HTML 中提取。

第 2 步:构建并发送 API 请求。

1import requests
2import json
3sec_uid = "MS4wLjABAAAA..."  # 来自方法 1
4api_url = "https://www.tiktok.com/api/post/item_list/"
5params = {
6    "aid": "1988",
7    "secUid": sec_uid,
8    "count": 35,
9    "cursor": 0,
10}
11headers = {
12    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
13    "Referer": "https://www.tiktok.com/",
14}
15resp = requests.get(api_url, params=params, headers=headers)
16data = resp.json()

第 3 步:解析响应。

data["itemList"] 中的每个条目,都包含和方法 1 相同的视频结构:descstatsvideo.playAddrvideo.downloadAddr 等。

第 4 步:遍历全部视频分页。

1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5    params["cursor"] = cursor
6    resp = requests.get(api_url, params=params, headers=headers)
7    data = resp.json()
8    items = data.get("itemList", [])
9    all_videos.extend(items)
10    has_more = data.get("hasMore", False)
11    cursor = data.get("cursor", 0)
12    print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
13print(f"Total videos scraped: {len(all_videos)}")

每次循环都会返回下一批数据和新的 cursor。循环会一直持续,直到 hasMore 变成 False

内部 API 方法的局限性

  • TikTok 经常改这些接口和参数要求——这是维护成本最高的方法。最近几个月,有些请求开始要求 msTokenX-Bogus 或其他签名参数,而这些参数是由 TikTok 的 生成的(说白了,只靠纯 Python 复现并不轻松)。
  • 某些数据类型可能还需要会话 Cookie 或额外 token
  • 同样会受到基于 IP 的频率限制——建议使用代理轮换
  • 如果你开始拿到空的 itemList 数组,通常说明你的 msToken 已经过期了(它在浏览器里大约每 10 秒轮换一次)
  • 适合:需要批量提取、想拿到某个主页全部视频,而方法 1 只能拿到第一页时

方法 3:使用 Playwright 抓取 TikTok 视频(浏览器自动化)

当前两种方法都碰壁时——比如登录要求、验证码,或者你没法复现的签名参数——Playwright 就是备用方案。它会启动一个真实的(无头)浏览器,像真人一样访问 TikTok,并且可以处理 JavaScript 渲染、无限滚动,甚至已登录会话。

为 TikTok 抓取配置 Playwright

先安装 Playwright 及其浏览器内核:

1pip install playwright
2playwright install firefox

我建议在 TikTok 抓取里优先使用 Firefox,而不是 Chromium。社区测试普遍显示 Firefox 的 ,而 TikTok 的反爬对基于 Chromium 的无头浏览器尤其严。

如果想进一步增强隐蔽性,可以把 Playwright 和 (一个经过修补的 Playwright 分支)或 (在 C++ 层面做了反检测修改的 Firefox)搭配使用。根据 ,Camoufox 在主流反机器人检测服务面前能拿到接近满分的隐蔽性表现。

分步骤:用 Playwright 抓取 TikTok 主页视频

第 1 步:启动无头 Firefox 浏览器并进入主页。

1import asyncio
2from playwright.async_api import async_playwright
3import json
4async def scrape_tiktok_profile(username):
5    async with async_playwright() as p:
6        browser = await p.firefox.launch(headless=True)
7        context = await browser.new_context(
8            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
9            viewport={"width": 1280, "height": 720},
10        )
11        page = await context.new_page()
12        await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")

第 2 步:等待视频网格加载。

1        # 等待视频条目出现
2        await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

如果 TikTok 弹出 “Something went wrong” 覆盖层,你可能需要点击重试按钮:

1        retry_btn = page.locator('button:has-text("Retry")')
2        if await retry_btn.count() &gt; 0:
3            await retry_btn.click()
4            await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

第 3 步:从隐藏 JSON 中提取数据(即使用 Playwright 也建议这样做)。

即使使用浏览器,最稳妥的做法仍然是抓取 hydration JSON:

1        script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2        raw_json = await script_el.inner_text()
3        data = json.loads(raw_json)
4        # 和方法 1 相同的 JSON 解析方式
5        user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6        videos = user_detail.get("itemList", [])

第 4 步:通过滚动处理无限加载。

如果你需要的不只是最初的约 30 条视频,就向下滚动并捕获更多 XHR 响应:

1        all_videos = list(videos)
2        # 滚动时拦截 API 响应
3        api_responses = []
4        async def capture_response(response):
5            if "/api/post/item_list" in response.url:
6                try:
7                    body = await response.json()
8                    api_responses.append(body)
9                except:
10                    pass
11        page.on("response", capture_response)
12        # 向下滚动触发更多加载
13        for _ in range(5):  # 根据需要调整滚动次数
14            await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15            await asyncio.sleep(2)
16        # 从拦截到的响应中收集视频
17        for api_resp in api_responses:
18            items = api_resp.get("itemList", [])
19            all_videos.extend(items)
20        print(f"Total videos: {len(all_videos)}")
21        await browser.close()
22        return all_videos
23# 运行
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))

现在你应该已经拿到了一组视频对象,既包括初始页面加载的数据,也包括滚动后加载的额外分页数据。

Playwright 方法的局限性

  • 速度最慢(完整页面渲染、网络往返、滚动等待)
  • 资源占用更高——每个浏览器实例都会消耗不少内存和 CPU
  • 在规模化场景下仍然可能被基于 IP 的封锁影响——建议配合代理轮换
  • 适合:复杂交互、带登录墙的内容、需要处理验证码,或当方法 1 和 2 都被拦时

如何用 Python 下载 TikTok 视频(.mp4)

这一部分补上了几乎所有 TikTok 抓取教程里最大的空白。提取元数据当然有用,但大多数搜索“抓取 TikTok 视频”的人,想要的是实际的视频文件。

TikTok 会把下载链接嵌在视频数据对象中:

  • playAddr — 通常是无水印或低水印版本
  • downloadAddr — TikTok 设计用于应用内下载的版本(包含 TikTok 水印叠层)

这两个链接都有时效性,通常只在短时间内有效(一般几个小时),所以提取后要尽快下载。

分步骤:下载 TikTok 视频文件

第 1 步:从上面三种方法中的任意一种提取视频 URL。

1video_url = video["video"]["playAddr"]  # 无水印版本
2# 或者
3video_url = video["video"]["downloadAddr"]  # 带水印版本

第 2 步:使用正确的请求头发送 GET 请求。

这一步最容易出错。如果你直接 requests.get(video_url),通常会拿到 403。TikTok 会检查 Referer 请求头,并且期待一个像浏览器一样的 User-Agent

1import requests
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
4    "Referer": "https://www.tiktok.com/",
5}
6resp = requests.get(video_url, headers=headers, stream=True)

第 3 步:把响应内容写入 .mp4 文件。

使用 stream=True 并分块写入——TikTok 视频可能很大,不要一次性把整个文件直接塞进内存:

1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4    for chunk in resp.iter_content(chunk_size=1024 * 1024):  # 每块 1MB
5        if chunk:
6            f.write(chunk)
7print(f"Downloaded: {filename}")

现在你应该已经在本地机器上得到一个可播放的 .mp4 文件了。

水印版 vs 无水印版下载

TikTok 会同时保存每条视频的带水印和无水印版本。playAddr 往往提供的是更干净的版本(也就是播放器实际使用的那个),而 downloadAddr 则包含 TikTok 水印以及创作者用户名。

这里顺带说一句伦理问题:水印的作用是给创作者署名。如果你是为了研究、分析或内部审查而下载视频,使用 playAddr 通常没问题。但如果你要重新分发或搬运内容,去掉创作者标识就会涉及伦理和版权问题。下面的法律部分会继续说明。

如果你想要更稳妥的下载流程,可以考虑 ——它的 TikTok 提取器会自动处理签名计算和链接解析,你就不必自己管理请求头和 token 过期问题了。

横向对比:你该用哪种 Python 方法?

这是我刚开始做 TikTok 抓取项目时最希望看到的那张对比表:

对比维度方法 1:隐藏 JSON方法 2:内部 API方法 3:Playwright
难度入门中级中级
速度快(每页 1 次请求)快(JSON API)慢(完整页面渲染)
反爬抗性中等低(接口经常变化)高(模拟真实浏览器)
能下载 .mp4 吗?可以(提取 playAddr可以(响应里就有 URL)可以(拦截网络请求)
支持无限滚动不支持(只有第一页)支持(游标分页)支持(模拟滚动)
大规模场景需要代理吗需要需要需要
维护成本中等(JSON 结构会变)高(接口/签名经常变)低-中(浏览器更稳定)
最适合快速一次性抓主页批量提取、拿全量视频带登录墙或复杂内容

我的建议是:

  • 只想快速看一个主页的快照? 先用方法 1。配置大约 30 秒,每页返回数据不到 1 秒。
  • 需要带分页地抓取某个主页的全部视频? 方法 2 更合适,但要做好 TikTok 修改 API 参数后需要维护的准备。
  • 遇到登录墙、验证码,或者你想要最高稳定性? 用方法 3 的 Playwright。虽然更慢、更重,但也是 TikTok 最难拦的方案。

实际项目里,我通常会先用方法 1,只有在遇到限制时才升级到方法 2 或 3。这样可以保持基础设施简单、成本也更低。

不想写 Python?用无代码工具也能抓 TikTok 视频

很多搜索“用 Python 抓取 TikTok 视频”的人,其实并不真正需要 Python,他们只是需要数据而已。如果你是营销分析师,想从几个竞品主页拿视频元数据;或者你是品牌经理,需要追踪品牌提及,那为了代理轮换和签名处理去搭 Python 环境,多少有点杀鸡用牛刀。

python-vs-nocode-ai-comparison.webp

下面是几种方案的真实对比:

方案技能要求成本维护成本最适合
Python(自建)中级及以上免费(+ 代理成本)高(脚本易失效)完全控制、定制化流程
Thunderbit(Chrome 扩展)新手有免费额度无(AI 每次都会重新读页面)快速提取视频数据、导出到 Sheets/Excel
Apify TikTok Scraper新手付费(按次)低(由 Apify 维护)批量定时运行
TikAPI开发者订阅付费中等基于 TikTok 数据开发应用

Thunderbit 如何处理 TikTok 抓取

是我们在 Thunderbit 团队打造的 AI 网页爬虫。它的工作方式和传统抓取工具不一样。它不是依赖预设好的 CSS 选择器或 XPath 规则(这些规则一旦 TikTok 改版就会失效),而是每次都会重新读取页面结构,并自动建议相关字段——例如文案、点赞、标签、视频链接、作者等。

整个流程真的只要两步:

  1. 在 Chrome 中打开 TikTok 主页,点击 Thunderbit 扩展,再点 “AI Suggest Fields”。Thunderbit 会扫描页面并生成一个表格结构。
  2. 检查推荐字段,按需调整,然后点击 “Scrape”。

数据可以直接导出到 Google Sheets、Excel、Airtable 或 Notion。无需维护 CSS 选择器,也不用调试代码,更不需要配置代理。对于只需要从少数几个主页提取视频元数据的营销分析师来说,这比搭 Python 环境要快得多,而且 TikTok 前端改版时也不会轻易失效(根据社区反馈,TikTok 这类改动通常每隔几周就会发生一次)。

Thunderbit 还支持 ——它可以继续打开每条视频的详情页,为你的表格补充更多信息,比如完整评论数、音乐信息或视频时长。

你可以通过 免费试用。想了解更多工作原理,可以查看我们的

抓取 TikTok 时的法律与伦理边界

这个话题里,排名靠前的教程几乎都没提合法性问题,这点非常值得注意,因为 TikTok 其实已经对一些抓取服务采取过法律行动。下面是你需要了解的内容。

TikTok 的服务条款(§ 4.1) 明确禁止自动化访问。违反条款属于合同违约,而不是刑事犯罪——但可能会导致账号封禁、IP 封锁,甚至民事诉讼。

对于公开数据,法律环境其实比很多人想象得更宽松。 代表性判例是 Meta Platforms v. Bright Data(美国加州北区,2024 年 1 月),法院认为,在未登录状态下抓取公开可访问数据,不违反 Meta 的服务条款。Meta 随后撤诉并放弃上诉。更早的 hiQ v. LinkedIn 第九巡回法院判决(在 Van Buren 后再次确认)也确立了:抓取公开可访问的数据不构成 CFAA 违规——不过 hiQ 最终还是和解了,支付了 50 万美元,并同意永久禁令,这说明服务条款执法依然可能带来风险。

如果你收集的是欧盟或加州用户的个人数据,还要考虑 GDPR 和 CCPA。 抓公开帖子是一回事;建立个人用户的个人信息数据库则是另一回事。

实用建议:

  • 控制请求频率,不要猛刷 TikTok 服务器
  • 不要抓取私人账号或未成年人内容
  • 不要商业化再分发受版权保护的视频内容
  • 尊重 robots.txt(TikTok 对大多数自动爬取行为是禁止的)
  • 出于个人研究或分析目的下载视频,与重新搬运视频不是一回事——请理解其中区别

免责声明: 这只是教育内容,不构成法律建议。如果你要基于抓取到的 TikTok 数据开发商业产品,请咨询律师。

总结:重点回顾

2025 年的 TikTok 抓取依然是一个动态变化的目标。这个平台的反爬体系属于网页里最复杂的一档,简单粗暴的方法(裸用 requests、ChatGPT 生成的片段、过时教程)基本都会失败。但只要方法对,完全可以做成。

你可以记住这几点:

  • 方法 1(隐藏 JSON) 最快也最简单——适合快速抓一个主页。
  • 方法 2(内部 API) 能做分页和批量抓取,但因为接口和签名要求经常变化,维护成本最高。
  • 方法 3(Playwright) 对反爬最稳,但速度和资源消耗也最大。
  • 这三种方法 都能提取视频下载链接——而这篇指南是少数会带你真正下载 .mp4 文件并正确设置请求头的内容。
  • 对于非技术用户 能更快拿到同样的数据,而且不需要写或维护代码。它基于 AI 的方式意味着 TikTok 改版时不容易失效——而根据社区反馈,这种改版发生的频率比大家希望的要高得多。

如果你想不搭 Python 环境就直接开始,建议先试试 ——免费额度足够你在几个主页上测试,看看是否适合你的工作流。至于走 Python 路线的人,建议先从方法 1 开始,验证数据正确后再逐步扩展。

如果你想进一步深入网页抓取技巧,可以看看我们的这些指南:

常见问题

用 Python 抓取 TikTok 视频合法吗?

抓取公开可访问的数据属于法律灰区,并不是明确违法。Meta v. Bright Data(2024)这一判决支持了“在未登录状态下抓取公开数据,不违反平台服务条款”的观点。不过,TikTok 的服务条款明确禁止自动化访问,而 GDPR/CCPA 也会对个人数据提出要求。它并不像很多人担心的那样直接违法,但也不是零风险。具体场景请咨询法律专业人士。

用于 TikTok 抓取的最佳 Python 库是什么?

这取决于你的方案。若是隐藏 JSON 提取(方法 1),requests + beautifulsoup4 就够了。若是调用内部 API(方法 2),requestshttpx 都可以。若是浏览器自动化(方法 3),playwright 是目前标准方案——新项目里它在采用率上已经超过 Selenium,PyPI 月下载量约为 ,而 Selenium 约为 5300 万。如果你想要更高层的接口,也可以考虑 TikTok-Api 包装器(GitHub 约 6300 星),不过它相对更脆弱。

能不能用 Python 下载没有水印的 TikTok 视频?

可以。TikTok 自己的数据里就包含一个 playAddr URL,通常会提供不带标准水印叠层的视频版本。本文已经演示了如何从三种方法中的任意一种提取这个链接,并使用正确请求头下载 .mp4 文件。相对地,downloadAddr 字段通常包含水印。

为什么我的 TikTok 爬虫返回空数据?

最常见的原因是 TikTok 需要 JavaScript 才能渲染内容。普通的 requests.get() 只能拿到外壳 HTML——真实数据要么藏在隐藏的 JSON 脚本标签里(方法 1),要么是通过 JavaScript 动态加载的(方法 3)。如果你拿到的是空白 HTML,先试方法 1。若仍失败,检查请求头(缺少 Referer 是导致 403 的头号原因),或者直接切到使用 Playwright 的方法 3。

抓取 TikTok 时怎样避免被封?

使用真实浏览器风格的请求头(包括 User-AgentRefererAccept-Language),轮换住宅或移动代理(数据中心 IP 往往几分钟内就会被标记),在请求之间加入随机延迟(至少 1–3 秒),并避免超高频抓取。方法 3(Playwright)因为更像真实浏览器会话,所以抗封能力最好。只要你有一定规模的抓取需求,就要把代理成本算进去——主流服务商的入门级住宅代理价格大约是

  • 了解更多
Topics
抓取 TikTok PythonTikTok 数据提取 PythonPython TikTok 爬虫脚本如何用 Python 抓取 TikTok 视频
目录

试试 Thunderbit

只需 2 次点击即可抓取线索和其他数据。由 AI 驱动。

获取 Thunderbit 免费试用
使用 AI 提取数据
轻松将数据转移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week