TikTok 目前每月活躍用戶約有 19 億,而且創作者每天上傳的影片估計高達 2,300 萬支。只要你曾經想從這股龐大資料流中抓取哪怕一小部分,就會知道這有多讓人頭痛。
通常情況是這樣:你搜尋「用 Python 抓取 TikTok 影片」,複製教學裡的一段程式碼(或請 ChatGPT 幫你寫),執行後卻只得到……空白 HTML、403 錯誤,或最讓人崩潰的「Process finished with exit code 0」卻完全沒有輸出。我在無數 GitHub issue 和 Reddit 討論串裡都看過這個循環,這也是我寫這篇指南的原因。本文會介紹 2025 年真正可行的 3 種 Python 方法,完整示範如何下載真正的 .mp4 影片檔(不只是其他教學只做到的中繼資料),並附上比較表,幫你依需求挑選最適合的做法。如果你其實不需要 Python,我也會介紹像 Thunderbit 這類免程式碼方案,兩步左右就能拿到相同資料。
「抓取 TikTok 影片」到底是什麼意思?
在動手寫程式之前,先釐清大家說的「抓取 TikTok 影片」其實有兩種不同需求:
- 擷取影片中繼資料:包含字幕、標籤、按讚數、留言數、分享數、觀看數、發文日期、作者資訊。這也是大多數教學聚焦的內容。
- 下載真正的影片檔(.mp4):把影片本身存到你的裝置裡。這才是大多數人輸入「scrape TikTok videos」時真正想要的東西——而且幾乎沒什麼教學會完整講到這一塊。
這份指南兩者都會涵蓋。下面每個方法都能擷取中繼資料,也能提供你下載 .mp4 所需的影片網址。
為什麼要用 Python 抓取 TikTok 影片?
根據 每位使用者平均每天觀看約 280 支影片,再加上 TikTok Shop 帶來 超過 330 億美元的全球廣告收入,從 TikTok 資料挖掘商業價值的理由非常充分。以下是我最常看到的應用場景:
| 使用情境 | 你要抓取的內容 | 適合對象 |
|---|---|---|
| 網紅與行銷研究 | 互動率、粉絲數、內容格式、標籤表現 | 行銷團隊、代理商 |
| 內容策略 | 熱門標籤、爆款影片格式、發布頻率 | 內容創作者、社群經理 |
| 品牌監測 | 提及次數、活動觸及率、受眾情緒 | 品牌經理、公關團隊 |
| 競品情報 | 競品影片表現、廣告素材、TikTok Shop 商品頁 | 電商團隊、產品團隊 |
| 市場研究 | 新興趨勢、受眾行為、產品發現 | 分析師、避險基金、研究機構 |
| 歸檔與法遵 | 供內部審查或留存的影片檔 | 法務、合規、代理商 |
商業價值其實很明確:預估美國 TikTok 廣告收入在 2026 年將達到 234 億美元,而在熱門 TikTok Shop 類別中,聯盟創作者可帶來 82–84% 的收入。如果你在做電商或網紅行銷,這些資料就是直接能換算成金錢的資產。
為什麼你的基礎 Python 程式在 TikTok 上會失敗
如果你已經試過類似下面這段卻毫無收穫,那你並不孤單:
import requests
from bs4 import BeautifulSoup
resp = requests.get("https://www.tiktok.com/@someuser")
soup = BeautifulSoup(resp.text, "html.parser")
# ...接著 HTML 裡沒有任何有用資料
原因其實很直接:TikTok 是最難抓取的平台之一。單純的 requests.get() 回傳的多半只是空殼 HTML,真正內容是由瀏覽器中的 JavaScript 渲染出來的。除此之外,TikTok 還部署了非常強勢的反機器人機制,包括行為偵測、TLS 指紋辨識、會產生請求簽章的 自訂 JavaScript 虛擬機,以及會不定期變動的動態 CSS 選擇器。

根據 Imperva 2025《Bad Bot Report》,2024 年自動化流量首次超過人類流量,現在機器人已占 全球網路流量的 51%。TikTok 非常清楚這件事,因此防護機制也相當完整。
下面這張快速診斷表,能幫你判斷問題出在哪裡,並直接跳到對應方法:
| 症狀 | 可能原因 | 可解決的方法 |
|---|---|---|
| 空白 HTML / 沒資料 | 內容由 JS 渲染;requests 無法執行 JavaScript | 方法 1(隱藏 JSON)或方法 3(Playwright) |
| 403 / 拒絕存取 | 標頭缺失或錯誤;被反機器人偵測 | 方法 1 搭配正確標頭 |
| 第一次能抓,之後就失敗 | 觸發頻率限制 / IP 封鎖 | 代理輪換(所有方法都適用) |
| 出現登入牆 | 需要 session / cookie | 方法 3(使用已保存 session 的瀏覽器) |
| ChatGPT 產生的程式碼沒有輸出 | TikTok 結構已在模型訓練後變更 | 3 種方法都可參考(更新版做法) |
頻率限制大約是每個 IP 每分鐘 30–60 次請求,超過後就可能開始出現軟封鎖或 CAPTCHA。資料中心 IP 幾乎在幾分鐘內就會被標記;要有一定量級,住宅或行動代理幾乎是必需品。
總覽:用 Python 抓取 TikTok 影片的 3 種方法
先看整體路線圖。每種方法都有不同取捨,下面三種我都會附上可用程式碼:
- 隱藏 JSON 擷取——解析 TikTok 頁面內嵌的
__UNIVERSAL_DATA_FOR_REHYDRATION__script 標籤。最快、最簡單,不需要瀏覽器。 - TikTok 內部 API——直接呼叫未公開文件化的
/api/post/item_list/端點,透過游標分頁批量抓資料。 - 使用 Playwright 做瀏覽器自動化——用無頭瀏覽器渲染頁面,處理無限捲動、動態內容與登入牆。
這三種方法都能下載真正的 .mp4 影片檔——我會在方法教學後,另外用專章說明。最後還會附上完整比較表,方便你做決策。
方法 1:使用隱藏 JSON 抓取 TikTok 影片(適合新手)
這是我最推薦先從這裡開始的方法。TikTok 幾乎在每次頁面載入時,都會在 <script> 標籤中嵌入一大包 JSON,id 為 __UNIVERSAL_DATA_FOR_REHYDRATION__。這包資料包含前端 JavaScript 原本要渲染的所有個人頁與影片資訊——也就是說,你只需要一次 HTTP 請求就能拿到,不必開瀏覽器。
你需要準備什麼
- Python 3.8+
requests(或httpx)beautifulsoup4(或parsel)- 正確的標頭:
User-Agent、Referer、Accept-Language
安裝依賴:
pip install requests beautifulsoup4
步驟教學:從 script 標籤中擷取 TikTok 影片資料
步驟 1:用接近真實瀏覽器的標頭送出 GET 請求。
這是最多初學者卡關的地方。如果你直接裸送 requests.get() 而不帶標頭,TikTok 可能回傳 403 或 CAPTCHA 頁面。至少要有目前常見的瀏覽器 User-Agent 與 Referer。
import requests
from bs4 import BeautifulSoup
import json
url = "https://www.tiktok.com/@charlidamelio"
headers = {
"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",
"Referer": "https://www.tiktok.com/",
"Accept-Language": "en-US,en;q=0.9",
}
resp = requests.get(url, headers=headers)
步驟 2:解析 HTML,找到 hydration script 標籤。
soup = BeautifulSoup(resp.text, "html.parser")
script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
如果 script_tag 是 None,代表 TikTok 可能擋下你了(請先檢查狀態碼),或是它改了標籤 ID(雖然少見,但有可能)。
步驟 3:將 script 內容讀成 JSON。
data = json.loads(script_tag.string)
步驟 4:進入 JSON 結構,擷取影片中繼資料。
資料會巢狀在 __DEFAULT_SCOPE__ 底下。以使用者個人頁為例:
user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
user_info = user_detail["userInfo"]
# 個人檔案統計
stats = user_info["stats"]
print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
# 影片清單(第一頁)
item_list = user_detail.get("itemList", [])
for video in item_list:
print(video["desc"]) # 字幕
print(video["stats"]["playCount"]) # 觀看數
print(video["video"]["playAddr"]) # 影片下載網址(無浮水印)
print(video["video"]["downloadAddr"]) # 影片下載網址(含浮水印)
步驟 5:擷取影片下載網址。
playAddr 通常提供較乾淨的版本(常常沒有 TikTok 浮水印),而 downloadAddr 則包含標準浮水印。這兩者都是可直接下載 .mp4 的網址,但下載時需要特定標頭(下面下載章節會說明)。
到這裡,你應該已經拿到一組影片資料物件,每個物件都包含字幕、統計數字、建立時間、標籤(在 challenges[] 和 textExtra 裡),以及可直接使用的影片網址。
隱藏 JSON 方法的限制
- 只能抓到初始載入的資料——通常只有個人頁前約 30 支影片
- 無法處理無限捲動或分頁(因為沒有「下一頁」可請求)
- 如果 TikTok 更改 script 標籤 ID 或 JSON 結構,解析器就會失效(這種情況會週期性發生——Pydantic 驗證可提早幫你抓到錯誤)
- 適合:快速抓個人頁、一次性資料擷取、或只需要最近幾支影片時使用
方法 2:透過 TikTok 內部 API 抓取影片
TikTok 前端不會一次把所有影片都載入,而是在你捲動時,透過 XHR 呼叫內部 API 端點。抓使用者影片最主要的端點是 /api/post/item_list/. 你可以直接用 Python 呼叫這個端點,拿到基於 cursor 的分頁,進而取得個人頁上的所有影片,不只第一頁。
如何找到內部 API 端點
在 TikTok 個人頁打開 Chrome DevTools,切到 Network 分頁,篩選 XHR,然後往下捲動。你會看到類似這樣的請求:
https://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 請求。
import requests
import json
sec_uid = "MS4wLjABAAAA..." # 來自方法 1
api_url = "https://www.tiktok.com/api/post/item_list/"
params = {
"aid": "1988",
"secUid": sec_uid,
"count": 35,
"cursor": 0,
}
headers = {
"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",
"Referer": "https://www.tiktok.com/",
}
resp = requests.get(api_url, params=params, headers=headers)
data = resp.json()
步驟 3:解析回應。
data["itemList"] 裡的每個項目都包含與方法 1 相同的影片結構——例如 desc、stats、video.playAddr、video.downloadAddr 等。
步驟 4:把所有影片都分頁抓下來。
all_videos = []
cursor = 0
has_more = True
while has_more:
params["cursor"] = cursor
resp = requests.get(api_url, params=params, headers=headers)
data = resp.json()
items = data.get("itemList", [])
all_videos.extend(items)
has_more = data.get("hasMore", False)
cursor = data.get("cursor", 0)
print(f"抓到 {len(items)} 支影片,總計:{len(all_videos)},hasMore:{has_more}")
print(f"已抓取影片總數:{len(all_videos)}")
每次迴圈都會回傳下一批資料與新的 cursor。只要 hasMore 是 False,迴圈就會結束。
內部 API 方法的限制
- TikTok 會頻繁更動這些端點與必要參數——因此這是維護成本最高的方法。近幾個月來,有些請求開始需要
msToken、X-Bogus或其他由 TikTok 自訂 JavaScript VM 產生的簽章參數(先說結論:要純 Python 完整重現並不容易)。 - 某些資料類型可能需要 session cookie 或額外 token
- 仍然會受到 IP 型速率限制——建議搭配代理輪換
- 如果
itemList開始回傳空陣列,通常代表你的msToken已過期(瀏覽器中大約每 10 秒輪替一次) - 適合:需要一次批量抓取個人頁全部影片,且方法 1 的「只能抓第一頁」限制無法接受時
方法 3:使用 Playwright 抓取 TikTok 影片(瀏覽器自動化)
當前兩種方法都碰壁——例如需要登入、遇到 CAPTCHA,或是簽章參數無法重現——Playwright 就是備用方案。它會啟動真實的(無頭)瀏覽器,像真人一樣瀏覽 TikTok,能處理 JavaScript 渲染、無限捲動,甚至已登入的 session。
為 TikTok 抓取設定 Playwright
安裝 Playwright 與瀏覽器元件:
pip install playwright
playwright install firefox
如果是抓 TikTok,我會推薦 Firefox 而不是 Chromium。社群測試一再顯示 Firefox 的指紋相容性更好,而且 TikTok 對 Chromium 系列的無頭瀏覽器偵測特別嚴格。
若要進一步提升隱匿性,可以搭配 patchright(Playwright 的補丁版分支)或 Camoufox(在 C++ 層級修改過、專門對抗偵測的 Firefox)。根據 獨立基準測試,Camoufox 對主流反機器人偵測服務的隱匿分數幾乎接近滿分。
步驟教學:用 Playwright 抓取 TikTok 個人頁影片
步驟 1:啟動無頭 Firefox,前往個人頁。
import asyncio
from playwright.async_api import async_playwright
import json
async def scrape_tiktok_profile(username):
async with async_playwright() as p:
browser = await p.firefox.launch(headless=True)
context = await browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
viewport={"width": 1280, "height": 720},
)
page = await context.new_page()
await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
步驟 2:等待影片網格載入。
# 等待影片項目出現
await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
如果 TikTok 出現「Something went wrong」覆蓋層,可能需要按重試按鈕:
retry_btn = page.locator('button:has-text("Retry")')
if await retry_btn.count() > 0:
await retry_btn.click()
await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
步驟 3:即使使用 Playwright,也直接從隱藏 JSON 擷取資料。
最穩定的方式,仍然是在瀏覽器環境中抓 hydration JSON:
script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
raw_json = await script_el.inner_text()
data = json.loads(raw_json)
# 與方法 1 相同的 JSON 導覽方式
user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
videos = user_detail.get("itemList", [])
步驟 4:需要更多影片時,處理無限捲動。
如果你要的不只初始約 30 支影片,可以向下捲動並攔截更多 XHR 回應:
all_videos = list(videos)
# 捲動時攔截 API 回應
api_responses = []
async def capture_response(response):
if "/api/post/item_list" in response.url:
try:
body = await response.json()
api_responses.append(body)
except:
pass
page.on("response", capture_response)
# 向下捲動以觸發更多載入
for _ in range(5): # 可依需求調整捲動次數
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await asyncio.sleep(2)
# 從攔截到的回應中收集影片
for api_resp in api_responses:
items = api_resp.get("itemList", [])
all_videos.extend(items)
print(f"影片總數:{len(all_videos)}")
await browser.close()
return all_videos
# 執行
videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
現在你應該已經能取得初始頁面與捲動後新增載入的影片物件清單。
Playwright 方法的限制
- 速度是三種方法中最慢的(完整頁面渲染、網路往返、捲動延遲)
- 資源消耗較高——每個瀏覽器實例都會吃掉不少記憶體與 CPU
- 在大規模操作下仍可能被 IP 封鎖——建議搭配代理輪換
- 適合:複雜互動、需要登入牆內容、要處理 CAPTCHA,或前兩種方法失效時使用
如何用 Python 下載 TikTok 影片(.mp4)
這一段補上了幾乎所有其他 TikTok 教學都沒講清楚的最大缺口。擷取中繼資料當然有用,但大多數搜尋「抓取 TikTok 影片」的人,真正想要的是影片檔本身。
TikTok 會把下載網址嵌在影片資料物件中:
playAddr—— 通常是無浮水印或較低浮水印版本downloadAddr—— TikTok 預期用於 App 內下載的版本,會包含 TikTok 浮水印覆蓋層
這兩個網址都有時效性,通常幾個小時後就會失效,所以在擷取後要盡快下載。
步驟教學:下載 TikTok 影片檔
步驟 1:從上面三種方法中的任一種,擷取影片網址。
video_url = video["video"]["playAddr"] # 無浮水印版本
# 或
video_url = video["video"]["downloadAddr"] # 含浮水印版本
步驟 2:帶著正確標頭發送 GET 請求。
這一步最容易出錯。如果你直接 requests.get(video_url),通常會拿到 403。TikTok 會檢查 Referer 標頭,也會期待像瀏覽器一樣的 User-Agent。
import requests
headers = {
"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",
"Referer": "https://www.tiktok.com/",
}
resp = requests.get(video_url, headers=headers, stream=True)
步驟 3:把回應內容寫入 .mp4 檔。
使用 stream=True 並分段寫入——TikTok 影片可能很大,不要一次載入到記憶體裡:
video_id = video["id"]
filename = f"tiktok_{video_id}.mp4"
with open(filename, "wb") as f:
for chunk in resp.iter_content(chunk_size=1024 * 1024): # 1MB 一段
if chunk:
f.write(chunk)
print(f"已下載:{filename}")
完成後,你就會在本機得到可播放的 .mp4 檔。
有浮水印與無浮水印下載的差別
TikTok 會為每支影片同時保留有浮水印與無浮水印版本。playAddr 通常是較乾淨的版本(也就是播放器實際使用的版本),而 downloadAddr 則包含創作者帳號的 TikTok 浮水印。
這裡補一句倫理上的提醒:浮水印的存在是為了標示創作者來源。如果你是為了研究、分析或內部審查而下載影片,使用 playAddr 通常沒問題;但如果你要重新散播或轉載內容,移除創作者標示就會牽涉到倫理與著作權問題。下面的法律章節會再談。
如果你想要更穩定的下載流程,可以考慮 yt-dlp——它的 TikTok 解析器會自動處理簽章計算與網址解析,你就不用自己管理標頭與 token 到期的問題。
並排比較:你應該用哪一種 Python 方法?
這是我當初開始做 TikTok 抓取時,希望有人直接給我的比較表:
| 比較項目 | 方法 1:隱藏 JSON | 方法 2:內部 API | 方法 3:Playwright |
|---|---|---|---|
| 難度 | 初級 | 中級 | 中級 |
| 速度 | 快(每頁 1 次請求) | 快(JSON API) | 慢(完整頁面渲染) |
| 反機器人韌性 | 中等 | 低(端點常變) | 高(模擬真實瀏覽器) |
| 可下載影片 .mp4? | 可以(擷取 playAddr) | 可以(回應中有網址) | 可以(攔截網路請求) |
| 支援無限捲動 | 不行(僅第一頁) | 可以(cursor 分頁) | 可以(模擬捲動) |
| 大規模時需要代理 | 是 | 是 | 是 |
| 維護成本 | 中等(JSON 結構會變) | 高(端點 / 簽章常變) | 低到中(瀏覽器可自適應) |
| 最適合 | 快速一次性抓個人頁 | 大量資料擷取、全部影片 | 有登入牆或複雜內容 |
我的建議是:
- 只想快速看某個個人頁的快照? 先從方法 1 開始。設定大概 30 秒,每頁回資料不到 1 秒。
- 需要帶分頁抓完整個人頁影片? 方法 2 比較適合,但要有心理準備,TikTok 一改 API 參數就得維護。
- 遇到登入牆、CAPTCHA,或需要最高穩定性? 用方法 3 的 Playwright。它速度較慢、資源消耗較高,但也最難被 TikTok 擋下。
實務上,我通常先從方法 1 開始,只有在受限時才升級到方法 2 或 3。這樣基礎架構最簡單,成本也最低。
不想寫 Python?也可以用免程式碼工具抓 TikTok 影片
很多搜尋「用 Python 抓 TikTok 影片」的人,其實並不是真的需要 Python,他們只是需要資料而已。如果你是行銷分析師,只想從幾個競品帳號拿影片中繼資料;或你是品牌經理,想追蹤提及內容,那麼為了代理輪換和簽章處理去架 Python 環境,其實太大材小用了。

下面是幾種做法的誠實比較:
| 做法 | 技能門檻 | 成本 | 維護量 | 最適合 |
|---|---|---|---|---|
| Python(自己做) | 中級以上 | 免費(另加代理費) | 高(程式容易壞) | 完整控制、自訂流程 |
| Thunderbit(Chrome 擴充功能) | 新手 | 有免費方案 | 幾乎不用維護(AI 每次都重新讀頁) | 快速擷取影片資料、匯出到 Sheets / Excel |
| Apify TikTok Scraper | 新手 | 付費(按次計費) | 低(由 Apify 維護) | 大量排程自動執行 |
| TikAPI | 開發者 | 訂閱制付費 | 中等 | 在 TikTok 資料之上開發應用程式 |
Thunderbit 如何處理 TikTok 抓取
Thunderbit 是我們在 Thunderbit 開發的 AI 網頁爬蟲,運作方式和傳統工具很不一樣。它不是依賴預先寫好的 CSS 選擇器或 XPath 規則(這些規則只要 TikTok 改版就容易失效),而是由 AI 每次重新讀取頁面結構,並自動建議合適欄位——例如字幕、按讚數、標籤、影片網址、作者等等。
整個流程真的只要兩步:
- 在 Chrome 裡開啟 TikTok 個人頁,點 Thunderbit 擴充功能,再按「AI Suggest Fields」。Thunderbit 會掃描頁面並提出表格欄位建議。
- 檢查建議欄位,必要時調整,然後按「Scrape」。
資料可以直接匯出到 Google Sheets、Excel、Airtable 或 Notion。不需要維護 CSS 選擇器、不需要 debug 程式、不需要設定代理。對於只需要幾個帳號的影片中繼資料的行銷分析師來說,這比搭 Python 環境還快,而且 TikTok 前端更新時也不容易壞掉(根據社群回報,這種更新通常每幾週就會發生一次一次)。
Thunderbit 也支援 子頁面抓取——它可以逐一進入每支影片頁面,為你的資料表補充更多資訊,例如完整留言數、音樂資訊或影片長度。
你可以透過 Thunderbit Chrome Extension 免費試用。想了解更多運作方式,可到我們的 YouTube 頻道 查看。
抓取 TikTok 時的法律與倫理界線
在這個主題上,幾乎沒有任何高排名教學會談到合法性,但考量到 TikTok 其實曾對抓取服務採取法律行動,這是非常值得注意的缺口。以下是你需要知道的重點。
TikTok 的服務條款(§ 4.1) 明確禁止自動化存取。違反 TOS 屬於違約,不是刑事犯罪——但可能導致帳號停權、IP 封鎖,甚至民事訴訟。
對公開資料的法律環境,比許多人想像中寬鬆。 具有代表性的先例是 Meta Platforms v. Bright Data(北加州聯邦地院,2024 年 1 月),法院認定在登出狀態下抓取公開可見資料,並不違反 Meta 的服務條款。Meta 最後撤案並放棄上訴。更早的 hiQ v. LinkedIn 第九巡迴法院判決(在 Van Buren 後仍被重申)也確立:抓取公開資料不構成 CFAA 違反——不過 hiQ 最終仍以和解收場,支付 50 萬美元並同意永久禁制令,這也說明 TOS 執行仍然可能帶來實際風險。
如果你蒐集的是 EU 或加州使用者的個人資料,GDPR 與 CCPA 也可能適用。 抓取公開貼文是一回事;建立個人使用者資料庫又是另一回事。
實務建議:
- 控制請求頻率(不要一直猛打 TikTok 伺服器)
- 不要抓取私人帳號或未成年內容
- 不要商業性再散播受著作權保護的影片內容
- 尊重
robots.txt(TikTok 多數自動爬行都禁止) - 為個人研究或分析而下載影片,和重新轉載影片是兩件事——請清楚區分
免責聲明: 本文僅供教育用途,不構成法律建議。如果你要基於抓取的 TikTok 資料打造商業產品,請諮詢律師。
結語:重點整理
2025 年的 TikTok 抓取仍然是個移動中的目標。這個平台的反機器人機制是網路上最複雜的一類之一,而天真的作法(直接 requests、ChatGPT 產生的片段、過時教學)幾乎都會失敗。但只要方法正確,這件事完全做得到。
你可以記住這幾點:
- 方法 1(隱藏 JSON) 最快也最簡單——如果你只是想快速抓個人頁,就從這裡開始。
- 方法 2(內部 API) 能提供分頁與批量存取,但因為端點與簽章需求常常變動,維護成本最高。
- 方法 3(Playwright) 對反機器人措施最有韌性,但速度與資源消耗較高。
- 三種方法都能 擷取影片下載網址——而這份指南也是少數真正帶你用正確標頭下載 .mp4 檔的教學。
- 對非技術使用者來說,Thunderbit 提供了一條更快的路徑,不必撰寫或維護程式碼,就能拿到相同資料。它的 AI 方法代表 TikTok 改版時不容易壞掉——而根據社群回報,這種改版頻率其實比大家想像得更高。
如果你想完全不用 Python 就開始,試試 Thunderbit Chrome 擴充功能——免費方案就足夠讓你在幾個個人頁上測試,看看是否符合你的工作流程。若你要走 Python 路線,建議先從方法 1 開始,驗證資料,再逐步擴大。
想更深入了解網頁爬蟲技巧嗎?可以參考我們的指南:如何從任何網站抓取資料、網頁爬蟲最佳實踐、以及抓取到 Google Sheets。
常見問題
用 Python 抓取 TikTok 影片是否合法?
抓取公開可存取的資料屬於法律灰色地帶,不是絕對違法。Meta v. Bright Data(2024)的判決支持這樣的觀點:在登出狀態下抓取公開資料,不會違反平台服務條款。不過,TikTok 的 TOS 明確禁止自動化存取,而且如果涉及個人資料,GDPR / CCPA 也可能適用。它不像多數人擔心的那樣直接違法,但也絕非零風險。請針對你的實際情境諮詢法律專業人士。
TikTok 抓取最好用哪個 Python 套件?
這取決於你的方法。若是隱藏 JSON 擷取(方法 1),requests + beautifulsoup4 就夠了。若是呼叫內部 API(方法 2),requests 或 httpx 都可以。若是瀏覽器自動化(方法 3),playwright 是目前主流——在新的抓取專案裡,它的採用率已超越 Selenium,根據 PyPI 每月下載量約 5,900 萬,高於 Selenium 的約 5,300 萬。若你想用更高階的介面,也可以考慮 TikTok-Api 包裝器(約 6,300 顆 GitHub stars),但它穩定性可能比較脆弱。
我可以用 Python 下載沒有浮水印的 TikTok 影片嗎?
可以。TikTok 自己的資料中就包含 playAddr 網址,通常能提供沒有標準浮水印覆蓋的版本。本指南示範了如何從前述三種方法中擷取該網址,並搭配正確標頭下載 .mp4 檔。相對地,downloadAddr 欄位則會包含浮水印。
為什麼我的 TikTok 爬蟲回傳空資料?
最常見的原因是 TikTok 需要 JavaScript 才會渲染內容。基礎的 requests.get() 只會拿到外殼 HTML——真正資料要嘛藏在隱藏的 JSON script 標籤裡(方法 1),要嘛是透過 JavaScript 動態載入(方法 3)。如果你看到的是空白 HTML,先試方法 1;如果仍失敗,檢查你的標頭(缺少 Referer 是 403 的頭號原因),或直接升級到 Playwright 的方法 3。
抓 TikTok 時要怎麼避免被封?
使用接近真實瀏覽器的標頭(包括 User-Agent、Referer、Accept-Language),輪換住宅或行動代理(資料中心 IP 常在幾分鐘內被標記),在請求之間加入隨機延遲(至少 1–3 秒),並避免極高頻率抓取。方法 3(Playwright)因為會模擬真實瀏覽器 session,所以最不容易被擋。若你要做較大量的操作,務必把代理成本算進去——入門級住宅代理大約每 GB 2–4 美元,視供應商而定。
- 延伸閱讀


