TikTok 目前每月活躍用戶大約有 ,而創作者每天上傳的影片估計高達 2,300 萬支。若你曾經想從這股內容洪流中擷取哪怕只是一小部分資料,就會知道這件事有多棘手。
通常流程是這樣:你搜尋「用 Python 抓取 TikTok 影片」,從教學文章複製一段程式碼(或直接請 ChatGPT 幫你寫),執行後卻發現……什麼都沒有。不是空白 HTML,就是 403 錯誤;再不然就是那個最令人崩潰的「Process finished with exit code 0」,但完全沒有輸出。我在無數 GitHub issue 和 Reddit 討論串裡都看過這種情況,這也是我寫這篇指南的原因。接下來我會介紹 2025 年真正可用的三種 Python 方法,完整示範如何下載真正的 .mp4 影片檔(不是只有中繼資料——大多數教學都只停在這一步),並附上一張比較表,幫你選出最適合的做法。如果你其實不需要 Python,我也會介紹像 這類免寫程式工具,只要大約兩下點擊,就能拿到相同資料。
「抓取 TikTok 影片」到底是什麼意思?
在進入程式碼之前,先釐清一下大家說「抓取 TikTok 影片」時,通常其實指的是兩件很不同的事:
- 擷取影片中繼資料:例如文案、標籤、按讚數、留言數、分享數、觀看數、發布日期、作者資訊。這也是大多數教學文章的重點。
- 下載真正的影片檔(.mp4):把影片本身存到你的電腦。這才是大多數人在輸入「抓取 TikTok 影片」時真正想要的,但幾乎沒有人完整教這部分。
這篇指南兩種都會講。下面介紹的每個方法,不只可以擷取中繼資料,也能拿到下載 .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 選擇器。

根據 Imperva 2025 Bad Bot Report,2024 年自動化流量首次超過人類流量——機器人如今占了。TikTok 很清楚這一點,所以防護機制也相當到位。
下面這張快速診斷表可以幫你判斷問題出在哪裡,並直接跳到對應的方法:
| 症狀 | 可能原因 | 可解決的方法 |
|---|---|---|
| 空白 HTML / 沒有資料 | 內容由 JS 渲染;requests 無法執行 JavaScript | 方法 1(隱藏 JSON)或方法 3(Playwright) |
| 403 / 拒絕存取 | 標頭缺失或錯誤;被反機器人偵測 | 帶正確標頭的 方法 1 |
| 第一次可用,之後失效 | 速率限制 / IP 封鎖 | 代理輪換(所有方法都需要) |
| 出現登入牆 | 需要 session / cookie | 方法 3(保留登入狀態的瀏覽器) |
| ChatGPT 產生的程式碼沒結果 | TikTok 結構已在模型訓練後變動 | 這三種方法(都是最新做法) |
速率限制的門檻大約是每個 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 幾乎在每次頁面載入時,都會把一大包 JSON 內容塞在 id 為 __UNIVERSAL_DATA_FOR_REHYDRATION__ 的 <script> 標籤中。這些 JSON 包含前端 JavaScript 原本會渲染的所有個人頁與影片資料——也就是說,你只要一個 HTTP 請求就能拿到,不需要瀏覽器。
你需要準備什麼
- Python 3.8+
requests(或httpx)beautifulsoup4(或parsel)- 正確的標頭:
User-Agent、Referer、Accept-Language
安裝依賴:
1pip install requests beautifulsoup4
步驟教學:從 script 標籤擷取 TikTok 影片資料
步驟 1:使用像瀏覽器一樣的標頭送出 GET 請求。
這一步是大多數新手會失敗的地方。如果你直接裸用 requests.get() 而不加標頭,TikTok 不是回 403,就是回 CAPTCHA 頁面。至少要有目前瀏覽器的 User-Agent 與 Referer。
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_tag 是 None,通常代表 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:透過內部 API 抓取 TikTok 影片
TikTok 前端不會一次載入所有影片——你在往下捲動時,它會向內部 API 端點發送 XHR。處理使用者影片的主要端點是 /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 相同的影片結構——desc、stats、video.playAddr、video.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 會經常變更這些端點和所需參數——這是維護成本最高的方法。最近幾個月,有些請求開始要求
msToken、X-Bogus或其他簽章參數,這些都是由 TikTok 的 產生的(劇透一下:只用純 Python 重現這套機制並不容易)。 - 某些資料類型可能還需要 session cookie 或其他 token
- 依然會受到 IP 速率限制影響——建議搭配代理輪換
- 如果你開始拿到空的
itemList陣列,很可能是msToken已經過期(它在瀏覽器中大約每 10 秒輪換一次) - 適合:需要大量資料、想抓完整個人頁所有影片,而方法 1 只能拿到第一頁時使用
方法 3:使用 Playwright 抓取 TikTok 影片(瀏覽器自動化)
當前兩種方法都遇到障礙——例如登入要求、CAPTCHA,或你無法重現簽章參數——Playwright 就是備案。它會啟動真正的(無頭)瀏覽器,像真人一樣瀏覽 TikTok,並且能處理 JavaScript 渲染、無限捲動,甚至登入後的內容。
為 TikTok 爬取設定 Playwright
安裝 Playwright 與瀏覽器二進位檔:
1pip install playwright
2playwright install firefox
我建議用 Firefox 而不是 Chromium 來爬 TikTok。社群測試普遍顯示,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() > 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"Total videos: {len(all_videos)}")
21 await browser.close()
22 return all_videos
23# 執行
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
這樣你就應該能拿到來自初始頁面載入以及捲動後額外載入頁面的影片物件清單。
Playwright 方法的限制
- 速度最慢(完整頁面渲染、網路往返、捲動延遲)
- 資源消耗較高——每個瀏覽器實例都會用掉不少記憶體與 CPU
- 在大量使用時仍可能被 IP 封鎖——建議搭配代理輪換
- 適合:複雜互動、需要登入牆內容、處理 CAPTCHA,或方法 1 和 2 都被擋住時使用
如何用 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 chunks
5 if chunk:
6 f.write(chunk)
7print(f"Downloaded: {filename}")
這樣你就會在本機得到一個可播放的 .mp4 檔案。
浮水印 vs 無浮水印下載
TikTok 會同時儲存每支影片的含浮水印與不含浮水印版本。playAddr 通常提供較乾淨的版本(播放器實際使用的版本),而 downloadAddr 則會帶有 TikTok 浮水印與創作者帳號資訊。
這裡要補充一點倫理層面的提醒:浮水印存在的目的,是為了標示創作者來源。如果你是為了研究、分析或內部審查而下載影片,使用 playAddr 通常沒問題;但如果你要重新散布或轉載,移除創作者歸屬就會牽涉到倫理與版權問題。法律部分下方會再說明。
如果你想建立更穩定的下載流程,可以考慮 ——它的 TikTok extractor 會自動處理簽章計算與網址解析,省去你自己處理標頭與 token 過期的麻煩。
並排比較:你該用哪一種 Python 方法?
這張比較表,是我當初開始做 TikTok 爬取專案時最希望有人做給我的:
| 比較項目 | 方法 1:隱藏 JSON | 方法 2:內部 API | 方法 3:Playwright |
|---|---|---|---|
| 難度 | 新手 | 中階 | 中階 |
| 速度 | 快(每頁 1 次請求) | 快(JSON API) | 慢(完整頁面渲染) |
| 反機器人韌性 | 中等 | 低(端點常變) | 高(像真實瀏覽器) |
| 能下載影片 .mp4 嗎? | 可以(擷取 playAddr) | 可以(回應中有網址) | 可以(攔截網路請求) |
| 能處理無限捲動嗎? | 不行(只有第一頁) | 可以(游標分頁) | 可以(模擬捲動) |
| 大量使用時需要代理嗎? | 需要 | 需要 | 需要 |
| 維護成本 | 中等(JSON 結構會變) | 高(端點/簽章常變) | 低到中等(瀏覽器自適應) |
| 最適合 | 快速一次性抓個人頁 | 大量擷取、完整影片清單 | 登入牆或複雜內容 |
我的建議是:
- 只想快速看某個帳號的概況? 先用方法 1。設定大約 30 秒就能完成,而且每頁不到一秒就能回傳資料。
- 需要某個帳號的全部影片,還要支援分頁? 方法 2 是正解,但要準備好在 TikTok 改 API 參數時花時間維護。
- 遇到登入牆、CAPTCHA,或需要最高穩定性? 用方法 3 的 Playwright。它比較慢、比較重,但也是 TikTok 最難封鎖的方法。
實務上,我通常先從方法 1 開始,只有在碰到限制時才升級到方法 2 或 3。這樣架構最簡單,成本也最低。
不想寫 Python?用免程式工具抓 TikTok 影片
很多搜尋「用 Python 抓取 TikTok 影片」的人,其實不是真的需要 Python,而是需要資料本身。如果你是行銷分析師,只想從幾個競品帳號抓影片資料,或你是品牌經理,想追蹤品牌提及,那麼為了這點需求就去架 Python 環境、處理代理輪換與簽章,明顯太重了。

下面是幾種做法的誠實比較:
| 做法 | 技能需求 | 成本 | 維護成本 | 最適合 | |---|---|---|---|---| | Python(自行開發) | 中階以上 | 免費(另加代理費) | 高(程式容易壞) | 完整控制、自訂流程 | | (Chrome 擴充功能) | 新手 | 有免費方案 | 幾乎沒有(AI 每次都重新理解網站) | 快速擷取影片資料、匯出到 Sheets/Excel | | Apify TikTok Scraper | 新手 | 付費(依執行次數計費) | 低(由 Apify 維護) | 定時批量自動執行 | | TikAPI | 開發者 | 訂閱制 | 中等 | 在 TikTok 資料上開發應用 |
Thunderbit 如何處理 TikTok 爬取
是我們在 Thunderbit 打造的 AI 網頁爬蟲,運作方式和傳統工具不太一樣。它不依賴預先寫好的 CSS 選擇器或 XPath 規則(這些規則只要 TikTok 版面一改就會失效),而是每次都由 AI 重新理解頁面結構,並自動建議欄位——例如文案、按讚數、標籤、影片網址、作者等。
實際流程真的只要兩步:
- 在 Chrome 開啟 TikTok 個人頁,點開 Thunderbit 擴充功能,按下「AI 建議欄位」。Thunderbit 會掃描頁面並建議表格結構。
- 檢查建議欄位,需要的話稍作調整,然後按下「開始爬取」。
資料可以直接匯出到 Google Sheets、Excel、Airtable 或 Notion。沒有 CSS 選擇器要維護,也不用除錯程式碼,更不用設定代理。對於只需要少數幾個帳號影片資料的行銷分析師來說,這比自己架 Python 環境快得多,而且 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),requests 或 httpx 都可。若是瀏覽器自動化(方法 3),目前標準是 playwright——在新的爬取專案中,它的採用率已超越 Selenium,PyPI 每月下載量約 ,而 Selenium 約為 5,300 萬次。如果你想要更高階的介面,TikTok-Api 包裝器(GitHub 約 6,300 顆星)也值得考慮,但穩定性可能較脆弱。
可以用 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 。