學會用 Python 抓取 TikTok 影片

最後更新於 April 15, 2026

TikTok 目前每月活躍用戶約有 ,而且創作者每天上傳的影片估計高達 2,300 萬支。只要你曾經想從這股龐大資料流中抓取哪怕一小部分,就會知道這有多讓人頭痛。

通常情況是這樣:你搜尋「用 Python 抓取 TikTok 影片」,複製教學裡的一段程式碼(或請 ChatGPT 幫你寫),執行後卻只得到……空白 HTML、403 錯誤,或最讓人崩潰的「Process finished with exit code 0」卻完全沒有輸出。我在無數 GitHub issue 和 Reddit 討論串裡都看過這個循環,這也是我寫這篇指南的原因。本文會介紹 2025 年真正可行的 3 種 Python 方法,完整示範如何下載真正的 .mp4 影片檔(不只是其他教學只做到的中繼資料),並附上比較表,幫你依需求挑選最適合的做法。如果你其實不需要 Python,我也會介紹像 這類免程式碼方案,兩步左右就能拿到相同資料。

「抓取 TikTok 影片」到底是什麼意思?

在動手寫程式之前,先釐清大家說的「抓取 TikTok 影片」其實有兩種不同需求:

  1. 擷取影片中繼資料:包含字幕、標籤、按讚數、留言數、分享數、觀看數、發文日期、作者資訊。這也是大多數教學聚焦的內容。
  2. 下載真正的影片檔(.mp4):把影片本身存到你的裝置裡。這才是大多數人輸入「scrape TikTok videos」時真正想要的東西——而且幾乎沒什麼教學會完整講到這一塊。

這份指南兩者都會涵蓋。下面每個方法都能擷取中繼資料,也能提供你下載 .mp4 所需的影片網址。

為什麼要用 Python 抓取 TikTok 影片?

根據 ,再加上 TikTok Shop 帶來 ,從 TikTok 資料挖掘商業價值的理由非常充分。以下是我最常看到的應用場景:

使用情境你要抓取的內容適合對象
網紅與行銷研究互動率、粉絲數、內容格式、標籤表現行銷團隊、代理商
內容策略熱門標籤、爆款影片格式、發布頻率內容創作者、社群經理
品牌監測提及次數、活動觸及率、受眾情緒品牌經理、公關團隊
競品情報競品影片表現、廣告素材、TikTok Shop 商品頁電商團隊、產品團隊
市場研究新興趨勢、受眾行為、產品發現分析師、避險基金、研究機構
歸檔與法遵供內部審查或留存的影片檔法務、合規、代理商

商業價值其實很明確:預估美國 TikTok 廣告收入在 2026 年將達到 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 封鎖代理輪換(所有方法都適用)
出現登入牆需要 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

安裝依賴:

1pip install requests beautifulsoup4

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

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

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

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

如果 script_tagNone,代表 TikTok 可能擋下你了(請先檢查狀態碼),或是它改了標籤 ID(雖然少見,但有可能)。

步驟 3:將 script 內容讀成 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 裡),以及可直接使用的影片網址。

隱藏 JSON 方法的限制

  • 只能抓到初始載入的資料——通常只有個人頁前約 30 支影片
  • 無法處理無限捲動或分頁(因為沒有「下一頁」可請求)
  • 如果 TikTok 更改 script 標籤 ID 或 JSON 結構,解析器就會失效(這種情況會週期性發生——可提早幫你抓到錯誤)
  • 適合:快速抓個人頁、一次性資料擷取、或只需要最近幾支影片時使用

方法 2:透過 TikTok 內部 API 抓取影片

TikTok 前端不會一次把所有影片都載入,而是在你捲動時,透過 XHR 呼叫內部 API 端點。抓使用者影片最主要的端點是 /api/post/item_list/. 你可以直接用 Python 呼叫這個端點,拿到基於 cursor 的分頁,進而取得個人頁上的所有影片,不只第一頁。

如何找到內部 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"抓到 {len(items)} 支影片,總計:{len(all_videos)},hasMore:{has_more}")
13print(f"已抓取影片總數:{len(all_videos)}")

每次迴圈都會回傳下一批資料與新的 cursor。只要 hasMoreFalse,迴圈就會結束。

內部 API 方法的限制

  • TikTok 會頻繁更動這些端點與必要參數——因此這是維護成本最高的方法。近幾個月來,有些請求開始需要 msTokenX-Bogus 或其他由 TikTok 產生的簽章參數(先說結論:要純 Python 完整重現並不容易)。
  • 某些資料類型可能需要 session cookie 或額外 token
  • 仍然會受到 IP 型速率限制——建議搭配代理輪換
  • 如果 itemList 開始回傳空陣列,通常代表你的 msToken 已過期(瀏覽器中大約每 10 秒輪替一次)
  • 適合:需要一次批量抓取個人頁全部影片,且方法 1 的「只能抓第一頁」限制無法接受時

方法 3:使用 Playwright 抓取 TikTok 影片(瀏覽器自動化)

當前兩種方法都碰壁——例如需要登入、遇到 CAPTCHA,或是簽章參數無法重現——Playwright 就是備用方案。它會啟動真實的(無頭)瀏覽器,像真人一樣瀏覽 TikTok,能處理 JavaScript 渲染、無限捲動,甚至已登入的 session。

為 TikTok 抓取設定 Playwright

安裝 Playwright 與瀏覽器元件:

1pip install playwright
2playwright install firefox

如果是抓 TikTok,我會推薦 Firefox 而不是 Chromium。社群測試一再顯示 ,而且 TikTok 對 Chromium 系列的無頭瀏覽器偵測特別嚴格。

若要進一步提升隱匿性,可以搭配 (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:即使使用 Playwright,也直接從隱藏 JSON 擷取資料。

最穩定的方式,仍然是在瀏覽器環境中抓 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"影片總數:{len(all_videos)}")
21        await browser.close()
22        return all_videos
23# 執行
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))

現在你應該已經能取得初始頁面與捲動後新增載入的影片物件清單。

Playwright 方法的限制

  • 速度是三種方法中最慢的(完整頁面渲染、網路往返、捲動延遲)
  • 資源消耗較高——每個瀏覽器實例都會吃掉不少記憶體與 CPU
  • 在大規模操作下仍可能被 IP 封鎖——建議搭配代理輪換
  • 適合:複雜互動、需要登入牆內容、要處理 CAPTCHA,或前兩種方法失效時使用

如何用 Python 下載 TikTok 影片(.mp4)

這一段補上了幾乎所有其他 TikTok 教學都沒講清楚的最大缺口。擷取中繼資料當然有用,但大多數搜尋「抓取 TikTok 影片」的人,真正想要的是影片檔本身。

TikTok 會把下載網址嵌在影片資料物件中:

  • playAddr —— 通常是無浮水印或較低浮水印版本
  • downloadAddr —— TikTok 預期用於 App 內下載的版本,會包含 TikTok 浮水印覆蓋層

這兩個網址都有時效性,通常幾個小時後就會失效,所以在擷取後要盡快下載。

步驟教學:下載 TikTok 影片檔

步驟 1:從上面三種方法中的任一種,擷取影片網址。

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"已下載:{filename}")

完成後,你就會在本機得到可播放的 .mp4 檔。

有浮水印與無浮水印下載的差別

TikTok 會為每支影片同時保留有浮水印與無浮水印版本。playAddr 通常是較乾淨的版本(也就是播放器實際使用的版本),而 downloadAddr 則包含創作者帳號的 TikTok 浮水印。

這裡補一句倫理上的提醒:浮水印的存在是為了標示創作者來源。如果你是為了研究、分析或內部審查而下載影片,使用 playAddr 通常沒問題;但如果你要重新散播或轉載內容,移除創作者標示就會牽涉到倫理與著作權問題。下面的法律章節會再談。

如果你想要更穩定的下載流程,可以考慮 ——它的 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 開發的 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 也支援 ——它可以逐一進入每支影片頁面,為你的資料表補充更多資訊,例如完整留言數、音樂資訊或影片長度。

你可以透過 免費試用。想了解更多運作方式,可到我們的 查看。

抓取 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 檔的教學。
  • 對非技術使用者來說 提供了一條更快的路徑,不必撰寫或維護程式碼,就能拿到相同資料。它的 AI 方法代表 TikTok 改版時不容易壞掉——而根據社群回報,這種改版頻率其實比大家想像得更高。

如果你想完全不用 Python 就開始,——免費方案就足夠讓你在幾個個人頁上測試,看看是否符合你的工作流程。若你要走 Python 路線,建議先從方法 1 開始,驗證資料,再逐步擴大。

想更深入了解網頁爬蟲技巧嗎?可以參考我們的指南:、以及

常見問題

用 Python 抓取 TikTok 影片是否合法?

抓取公開可存取的資料屬於法律灰色地帶,不是絕對違法。Meta v. Bright Data(2024)的判決支持這樣的觀點:在登出狀態下抓取公開資料,不會違反平台服務條款。不過,TikTok 的 TOS 明確禁止自動化存取,而且如果涉及個人資料,GDPR / CCPA 也可能適用。它不像多數人擔心的那樣直接違法,但也絕非零風險。請針對你的實際情境諮詢法律專業人士。

TikTok 抓取最好用哪個 Python 套件?

這取決於你的方法。若是隱藏 JSON 擷取(方法 1),requests + beautifulsoup4 就夠了。若是呼叫內部 API(方法 2),requestshttpx 都可以。若是瀏覽器自動化(方法 3),playwright 是目前主流——在新的抓取專案裡,它的採用率已超越 Selenium,根據 ,高於 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 ,視供應商而定。

  • 延伸閱讀
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