學會用 Python 抓取 TikTok 影片

最後更新:April 15, 2026
學會用 Python 抓取 TikTok 影片

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 影片」其實有兩種不同需求:

  1. 擷取影片中繼資料:包含字幕、標籤、按讚數、留言數、分享數、觀看數、發文日期、作者資訊。這也是大多數教學聚焦的內容。
  2. 下載真正的影片檔(.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 選擇器。

tiktok-anti-bot-wall.webp

根據 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 種方法

先看整體路線圖。每種方法都有不同取捨,下面三種我都會附上可用程式碼:

  1. 隱藏 JSON 擷取——解析 TikTok 頁面內嵌的 __UNIVERSAL_DATA_FOR_REHYDRATION__ script 標籤。最快、最簡單,不需要瀏覽器。
  2. TikTok 內部 API——直接呼叫未公開文件化的 /api/post/item_list/ 端點,透過游標分頁批量抓資料。
  3. 使用 Playwright 做瀏覽器自動化——用無頭瀏覽器渲染頁面,處理無限捲動、動態內容與登入牆。

這三種方法都能下載真正的 .mp4 影片檔——我會在方法教學後,另外用專章說明。最後還會附上完整比較表,方便你做決策。

方法 1:使用隱藏 JSON 抓取 TikTok 影片(適合新手)

這是我最推薦先從這裡開始的方法。TikTok 幾乎在每次頁面載入時,都會在 <script> 標籤中嵌入一大包 JSON,id 為 __UNIVERSAL_DATA_FOR_REHYDRATION__。這包資料包含前端 JavaScript 原本要渲染的所有個人頁與影片資訊——也就是說,你只需要一次 HTTP 請求就能拿到,不必開瀏覽器。

你需要準備什麼

  • Python 3.8+
  • requests(或 httpx
  • beautifulsoup4(或 parsel
  • 正確的標頭:User-AgentRefererAccept-Language

安裝依賴:

pip install requests beautifulsoup4

步驟教學:從 script 標籤中擷取 TikTok 影片資料

步驟 1:用接近真實瀏覽器的標頭送出 GET 請求。

這是最多初學者卡關的地方。如果你直接裸送 requests.get() 而不帶標頭,TikTok 可能回傳 403 或 CAPTCHA 頁面。至少要有目前常見的瀏覽器 User-AgentReferer

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_tagNone,代表 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 相同的影片結構——例如 descstatsvideo.playAddrvideo.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。只要 hasMoreFalse,迴圈就會結束。

內部 API 方法的限制

  • TikTok 會頻繁更動這些端點與必要參數——因此這是維護成本最高的方法。近幾個月來,有些請求開始需要 msTokenX-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-vs-nocode-ai-comparison.webp

下面是幾種做法的誠實比較:

做法技能門檻成本維護量最適合
Python(自己做)中級以上免費(另加代理費)高(程式容易壞)完整控制、自訂流程
Thunderbit(Chrome 擴充功能)新手有免費方案幾乎不用維護(AI 每次都重新讀頁)快速擷取影片資料、匯出到 Sheets / Excel
Apify TikTok Scraper新手付費(按次計費)低(由 Apify 維護)大量排程自動執行
TikAPI開發者訂閱制付費中等在 TikTok 資料之上開發應用程式

Thunderbit 如何處理 TikTok 抓取

Thunderbit 是我們在 Thunderbit 開發的 AI 網頁爬蟲,運作方式和傳統工具很不一樣。它不是依賴預先寫好的 CSS 選擇器或 XPath 規則(這些規則只要 TikTok 改版就容易失效),而是由 AI 每次重新讀取頁面結構,並自動建議合適欄位——例如字幕、按讚數、標籤、影片網址、作者等等。

整個流程真的只要兩步:

  1. 在 Chrome 裡開啟 TikTok 個人頁,點 Thunderbit 擴充功能,再按「AI Suggest Fields」。Thunderbit 會掃描頁面並提出表格欄位建議。
  2. 檢查建議欄位,必要時調整,然後按「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),requestshttpx 都可以。若是瀏覽器自動化(方法 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-AgentRefererAccept-Language),輪換住宅或行動代理(資料中心 IP 常在幾分鐘內被標記),在請求之間加入隨機延遲(至少 1–3 秒),並避免極高頻率抓取。方法 3(Playwright)因為會模擬真實瀏覽器 session,所以最不容易被擋。若你要做較大量的操作,務必把代理成本算進去——入門級住宅代理大約每 GB 2–4 美元,視供應商而定。

  • 延伸閱讀
Shuai Guan
Shuai Guan
Thunderbit 執行長|AI 資料自動化專家 Shuai Guan 是 Thunderbit 的執行長,畢業於密西根大學工程學院。憑藉近十年在科技與 SaaS 架構領域的經驗,他專注於把複雜的 AI 模型轉化為實用、免程式碼的資料擷取工具。在這個部落格中,他分享經過實戰驗證、毫無保留的網頁爬取與自動化策略見解,幫助你打造更聰明、以數據驅動的工作流程。當他不在優化資料流程時,也會把同樣的細膩與專注投入到攝影興趣中。
Topics
使用 Python 抓取 TikTokPython 抓取 TikTok 資料Python TikTok 爬蟲腳本如何用 Python 抓取 TikTok 影片

試試 Thunderbit

只要 2 下點擊,就能抓取名單與其他資料。由 AI 驅動。

取得 Thunderbit 完全免費
用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week