使用 Python 擷取 YouTube:4 種真正有效的方法

最後更新於 April 15, 2026

如果你曾經試過用 requests.get("https://www.youtube.com/...") 抓頁面,再用 BeautifulSoup 去找影片標題,你大概已經知道結果有多讓人崩潰:回傳一整片空空的 <div>,真正有用的資料幾乎是零。

這是我最常看到開發者第一次嘗試擷取 YouTube 時遇到的共同痛點。YouTube 本質上是一個單頁應用程式(SPA)——幾乎所有內容都透過 JavaScript 在前端動態渲染。你的 Python 腳本拿到的 HTML,只是一個外殼。真正的影片標題、觀看次數和其他中繼資料呢?它們其實藏在一大包叫做 ytInitialData 的 JSON 裡,等頁面載入後才由 JS 注入。

所以你原本很合理地寫下 soup.find("div", class_="ytd-video-renderer"),結果卻拿到 None,因為那個元素在原始 HTTP 回應裡根本不存在。一旦我搞懂這件事,整個問題就豁然開朗了——下面這 4 種方法,正是我經過大量測試、踩坑、修 bug,以及翻閱無數 GitHub issue 後整理出來的。我會帶你逐一了解每種做法,告訴你什麼情境該用哪一種,最後再補上一個免寫程式的捷徑,給那些只想快點拿到資料、不想處理環境設定的人。

為什麼要用 Python 擷取 YouTube?

YouTube 不只是影片平台,更是一個擁有 的資料來源。平台上累積了超過 ,而且每分鐘還有 。對企業、研究人員和創作者來說,這些公開可見的資訊都很值得進一步分析。

問題在於,YouTube 內建的分析工具,只會顯示你自己頻道的數據。如果你想了解競爭對手的發片節奏、追蹤你所在領域的熱門話題,或分析別人影片留言中的觀眾情緒,就得靠擷取資料來做。

以下是我最常見到的實際應用場景:

應用場景需要的人會用到的資料
競品分析行銷團隊、內容策略人員觀看次數、上片頻率、互動率
開發潛在客戶業務團隊、B2B 開發頻道聯絡資訊、簡介中的商務 Email
市場研究產品經理、分析師熱門主題、留言中的觀眾情緒
內容策略YouTuber、代理商高表現內容形式、最佳標題/標籤模式
SEO/關鍵字研究SEO 專家影片標題、標籤、描述、排名訊號
品牌監測公關團隊、品牌經理影片標題、留言、描述中的品牌提及
學術研究研究人員、資料科學家用於 情緒分析 的留言資料集(有一篇 2025 年研究,針對 4.5 萬則 YouTube 留言微調 BERT,準確率達 93.1%)

舉例來說,DJI、GoPro 和 Insta360 的競品分析發現,——這類洞察在 YouTube Studio 裡面根本看不到。

為什麼只靠 requests + BeautifulSoup 無法擷取 YouTube

在介紹真正可行的方法之前,你得先理解為什麼最直覺的做法會失敗。這不是純理論,搞懂它可以幫你少掉好幾個小時的除錯時間。

那個「看起來很合理」的做法大概會像這樣:

1import requests
2from bs4 import BeautifulSoup
3response = requests.get("https://www.youtube.com/@somechannel/videos")
4soup = BeautifulSoup(response.text, "html.parser")
5videos = soup.find_all("a", id="video-title-link")
6print(len(videos))  # 永遠都是 0

結果永遠都是零。正如 所說:「頁面是動態載入的,而 requests 套件不支援這種情況。」 說得更直接:「只用 requests 和 BeautifulSoup,你無法執行 JavaScript。」

解釋了背後機制:YouTube 是以 Single Page Application(SPA)打造的。當你只用基本 HTTP 請求時,拿到的只是初始 HTML 外殼,真正內容還沒渲染。影片資料其實藏在瀏覽器原本會執行並注入 DOM 的 JavaScript 物件裡。

好消息是:YouTube 確實把你需要的所有資料都塞在原始 HTML 中。只是它不是放在 DOM 元素,而是放在兩個 <script> 標籤裡的 JSON:

  • ytInitialData:頁面結構、影片列表、互動指標、留言續接 token
  • ytInitialPlayerResponse:核心影片中繼資料(標題、描述、長度、格式、字幕)

只要你懂得如何擷取與解析,這兩包資料都能透過一次 requests.get() 取到,不需要瀏覽器。這就是下面的第 1 種方法。

用 Python 擷取 YouTube 的 4 種方式:逐項比較

在深入每種方法之前,先看一下決策表。我把這 4 種方式都實測過,並針對實際專案選工具時最重要的幾個條件做了比較。

比較項目requests + BS4(ytInitialData)Selenium / Playwrightyt-dlpYouTube Data API免寫程式(Thunderbit)
設定複雜度中(需要 API 金鑰)不需要
是否支援 JS 渲染部分支援(解析 JSON)不適用(結構化 API)
速度快(雲端)
反機器人風險已處理
配額/速率限制無(但可能被 IP 擋)無(但可能被偵測)每天 10,000 units依點數計算
留言擷取困難可行但複雜內建內建視頁面而定
逐字稿複雜
最適合快速抓中繼資料搜尋結果、動態頁面大量中繼資料+留言大規模結構化資料不會寫程式的人、快速匯出

快速總結: youtube-scraping-methods.webp

你到底能從 YouTube 抓到哪些資料?又該用哪種方法?

這是我當初開始時最希望存在的一張參考表。沒有任何一種方法可以覆蓋所有欄位——這也正是這篇文章要介紹四種方法的原因。

資料欄位BS4(ytInitialData)Selenium/Playwrightyt-dlpYouTube APIThunderbit
影片標題
觀看次數
喜歡數⚠️ 不穩定
留言(文字)⚠️ 複雜⚠️
逐字稿/字幕⚠️
標籤⚠️
縮圖網址
頻道訂閱數⚠️
上傳日期
影片長度
Shorts 專屬資料⚠️⚠️⚠️

請根據你最在意的欄位來選方法。如果你需要留言和逐字稿,yt-dlp 很明顯是首選。如果你要的是結構化統計、且規模中等,API 會是好選擇。如果你只想兩分鐘內拿到資料,就往下看 Thunderbit 那一段。

extracted-data-categories.webp

方法 1:用 requests + BeautifulSoup 擷取 YouTube(解析 ytInitialData)

這個方法利用了 YouTube 會把所有頁面資料以 JSON 形式塞進原始 HTML 的特性。你不需要瀏覽器,只要知道去哪裡找就行。

  • 難度: 初學者
  • 所需時間: 約 15 分鐘
  • 需要: Python 3.10+、requestsbeautifulsoup4

步驟 1:向 YouTube 頁面發送 GET 請求

請記得加上像真的瀏覽器一樣的 User-Agent。預設的 python-requests/2.x 幾乎會立刻被擋掉—— 也證實這是新手最常踩的大坑。

1import requests
2HEADERS = {
3    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
4                  "AppleWebKit/537.36 (KHTML, like Gecko) "
5                  "Chrome/114.0.0.0 Safari/537.36",
6    "Accept-Language": "en-US,en;q=0.9",
7    "Cookie": "CONSENT=YES+cb",  # 繞過歐盟同意提示
8}
9url = "https://www.youtube.com/@mkbhd/videos"
10response = requests.get(url, headers=HEADERS)
11print(response.status_code)  # 應該是 200

CONSENT cookie 非常關鍵——沒有它的話,來自歐盟地區的請求通常會被重新導向到 consent.youtube.com,而那個頁面裡根本沒有 ytInitialData

步驟 2:解析 HTML 並定位 ytInitialData 腳本

可以用 BeautifulSoup 或正則表達式,找出包含 var ytInitialData =<script> 標籤:

1import re
2import json
3# 擷取 ytInitialData JSON
4match = re.search(
5    r"var ytInitialData\s*=\s*({.*?});</script>",
6    response.text,
7    re.DOTALL
8)
9if match:
10    data = json.loads(match.group(1))
11    print("ytInitialData 擷取成功")
12else:
13    print("找不到 ytInitialData,請檢查 headers / cookies")

一個常見錯誤是:用非貪婪的 .*?,然後只用 }; 當結尾。JSON 裡面常常有巢狀物件結束符號,這樣會太早截斷。像 那樣,應該用 };</script> 當作結尾,因為那才是該腳本區塊的最後一次賦值。

步驟 3:走訪 JSON 結構,擷取影片資料

YouTube 的 JSON 結構非常深。與其硬寫固定路徑、每次 YouTube 一改版就壞掉,不如用遞迴方式搜尋 key(這種情況其實很常發生—— 就記錄了自 2023 年以來多次格式變動):

1def search_dict(partial, search_key):
2    stack = [partial]
3    while stack:
4        cur = stack.pop()
5        if isinstance(cur, dict):
6            for k, v in cur.items():
7                if k == search_key:
8                    yield v
9                else:
10                    stack.append(v)
11        elif isinstance(cur, list):
12            stack.extend(cur)
13# 從頻道頁面擷取影片資訊
14videos = []
15for vr in search_dict(data, "videoRenderer"):
16    videos.append({
17        "video_id": vr.get("videoId"),
18        "title": vr["title"]["runs"][0]["text"],
19        "views": vr.get("viewCountText", {}).get("simpleText", "N/A"),
20        "published": vr.get("publishedTimeText", {}).get("simpleText", "N/A"),
21    })
22print(f"找到 {len(videos)} 支影片")
23for v in videos[:5]:
24    print(f"  {v['title']}{v['views']}")

這種遞迴搜尋的做法,正是 、yt-dlp 和 Scrapfly 最後都走向的方向——它能撐住 YouTube 頻繁的 JSON 結構變動。

步驟 4:把擷取到的資料匯出成 CSV 或 Excel

1import csv
2with open("youtube_videos.csv", "w", newline="", encoding="utf-8") as f:
3    writer = csv.DictWriter(f, fieldnames=["video_id", "title", "views", "published"])
4    writer.writeheader()
5    writer.writerows(videos)
6print("資料已匯出到 youtube_videos.csv")

什麼時候適合用這個方法?什麼時候不適合?

適合: 從少數幾個頻道頁面或影片頁面快速抓中繼資料。輕量級 SEO 工具。只需要標題、觀看次數和上傳日期的一次性分析。

限制: JSON 結構會變,常見破壞包含:喜歡按鈕重構(2023:toggleButtonRenderersegmentedLikeDislikeButtonViewModel)、描述欄重構(2023:description.runs[]attributedDescription.content)、頻道 Videos 分頁改版(2022–2023:gridRendererrichGridRenderer)。資料中心 IP 通常在 50–200 次請求後就會被軟封鎖。沒有留言,也沒有逐字稿。

方法 2:用 Selenium 或 Playwright 擷取 YouTube

當你需要操作頁面本身——例如在搜尋結果中滾動、點擊分頁、展開描述——瀏覽器自動化就是最適合的做法。

  • 難度: 中階
  • 所需時間: 約 30 分鐘
  • 需要: Python 3.10+、Playwright(pip install playwright && playwright install)或 Selenium + ChromeDriver

我會建議新專案優先選 Playwright,而不是 Selenium。 顯示,Playwright 每次操作大約 。Playwright 是透過 Chrome DevTools Protocol 維持持久 WebSocket;Selenium 則是走 WebDriver over HTTP,每個指令都要多一層轉譯。

步驟 1:設定 Playwright

1pip install playwright
2playwright install chromium
1from playwright.sync_api import sync_playwright
2pw = sync_playwright().start()
3browser = pw.chromium.launch(headless=False)  # 顯示瀏覽器較不容易被偵測
4context = browser.new_context()
5# 預先加入同意 cookie,繞過歐盟提示
6context.add_cookies([{
7    "name": "SOCS",
8    "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
9    "domain": ".youtube.com",
10    "path": "/",
11}])
12page = context.new_page()

步驟 2:進入 YouTube 頁面並等待內容載入

1page.goto("https://www.youtube.com/@mkbhd/videos")
2page.wait_for_selector("a#video-title-link", timeout=15000)
3print("頁面已載入,影片元素可見")

如果你要抓的是搜尋結果,請改成 https://www.youtube.com/results?search_query=你的+關鍵字

步驟 3:處理無限捲動,載入更多影片

YouTube 在頻道頁面和搜尋結果頁都採用無限捲動。下面是經典的 scrollHeight 迴圈,改寫自

1prev_height = -1
2max_scrolls = 20  # 要設上限,1 萬支影片的頻道會一直捲下去
3scroll_count = 0
4while scroll_count &lt; max_scrolls:
5    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
6    page.wait_for_timeout(1500)  # 等待新內容載入
7    new_height = page.evaluate("document.body.scrollHeight")
8    if new_height == prev_height:
9        break  # 沒有新內容載入
10    prev_height = new_height
11    scroll_count += 1
12print(f"已捲動 {scroll_count} 次")

步驟 4:從已渲染頁面擷取影片資料

1video_elements = page.query_selector_all("a#video-title-link")
2videos = []
3for el in video_elements:
4    title = el.inner_text()
5    href = el.get_attribute("href")
6    video_id = href.split("v=")[-1] if href else None
7    videos.append({"title": title, "video_id": video_id, "url": f"https://www.youtube.com{href}"})
8print(f"已擷取 {len(videos)} 支影片")

至於觀看次數和上傳日期,還得抓相鄰元素。 也提醒,id="video-title-link" 並不是萬用寫法——YouTube 會推出多種頁面變體。比較穩的 fallback 是 a[href*="watch"]

步驟 5:匯出成 CSV 或 Google Sheets

1import csv
2with open("youtube_playwright.csv", "w", newline="", encoding="utf-8") as f:
3    writer = csv.DictWriter(f, fieldnames=["title", "video_id", "url"])
4    writer.writeheader()
5    writer.writerows(videos)
6browser.close()
7pw.stop()

什麼時候適合用這個方法?什麼時候不適合?

適合: 擷取搜尋結果、與動態頁面互動(點分頁、展開描述)、任何需要完整 DOM 的情境。

限制: 很慢(在捲動+擷取流程中,每支影片約 1.5–3 秒)。反機器人偵測風險高——原生 Selenium 會讓 navigator.webdriver === true,而且 。資源消耗大(每個瀏覽器實例大約吃 200–500 MB RAM)。如果是 100 支影片,可能要 3–8 分鐘;用 yt-dlp 的話通常只要幾秒。

方法 3:用 yt-dlp 擷取 YouTube

yt-dlp 可以說是 YouTube 擷取界的瑞士刀。它是 youtube-dl 的社群分支,擁有 ,每天都有活躍更新,並且內建支援中繼資料、留言、逐字稿和批次擷取——全都不需要瀏覽器或 API 金鑰。

  • 難度: 初學到中階
  • 所需時間: 約 10 分鐘
  • 需要: Python 3.10+、pip install yt-dlp

步驟 1:安裝 yt-dlp

1pip install yt-dlp

不需要瀏覽器驅動、不需要 API 金鑰,也不需要設定檔。

步驟 2:不下載影片,直接提取中繼資料

1import yt_dlp
2opts = {
3    "quiet": True,
4    "skip_download": True,      # 不抓影片本體,只要中繼資料
5    "no_warnings": True,
6}
7with yt_dlp.YoutubeDL(opts) as ydl:
8    info = ydl.extract_info(
9        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
10        download=False
11    )
12print(f"標題:{info['title']}")
13print(f"觀看次數:{info['view_count']:,}")
14print(f"喜歡數:{info.get('like_count', 'N/A')}")
15print(f"長度:{info['duration']} 秒")
16print(f"上傳日期:{info['upload_date']}")
17print(f"頻道:{info['channel']}{info.get('channel_follower_count', 'N/A')} 訂閱)")
18print(f"標籤:{info.get('tags', [])[:5]}")

一般來說,extract_info 會回傳 80–120 個欄位,視影片狀態而定:idtitlechannelchannel_idchannel_follower_countview_countlike_countcomment_countupload_datedurationtagscategoriesdescriptionthumbnailsis_liveavailabilityautomatic_captionssubtitleschaptersheatmap 等等。

步驟 3:擷取 YouTube 留言

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "getcomments": True,
5    "extractor_args": {
6        "youtube": {
7            "max_comments": ["200", "50", "50", "10"],  # 總數、父留言、每則回覆數、回覆總數
8            "comment_sort": ["top"],
9        }
10    },
11}
12with yt_dlp.YoutubeDL(opts) as ydl:
13    info = ydl.extract_info(
14        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
15        download=False
16    )
17comments = info.get("comments", [])
18print(f"已抓到 {len(comments)} 則留言")
19for c in comments[:3]:
20    print(f"  [{c.get('like_count', 0)} 個讚] {c['author']}: {c['text'][:80]}...")

留言擷取速度不快。 指出留言抓取速度大約只有 30 KB/s——一支有 10 萬則留言的影片,可能要跑上好幾個小時。 也記錄了有些影片在留言分頁還沒抓完前,格式 URL 就先過期了(約 6 小時)。對於大影片,max_comments 一定要設得更積極一些。

步驟 4:擷取逐字稿和字幕

YouTube Data API 和 BS4 解析都沒辦法直接給你完整逐字稿,這正是 yt-dlp 的獨特優勢。

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "writesubtitles": True,
5    "writeautomaticsub": True,
6    "subtitleslangs": ["en", "en-orig"],
7    "subtitlesformat": "json3",   # 適合機器解析:含 start/dur(毫秒)和文字
8    "outtmpl": "%(id)s.%(ext)s",
9}
10with yt_dlp.YoutubeDL(opts) as ydl:
11    info = ydl.extract_info(
12        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
13        download=False
14    )
15# 直接從 info 字典讀取字幕資料
16auto_captions = info.get("automatic_captions", {})
17manual_subs = info.get("subtitles", {})
18print(f"自動字幕語言:{list(auto_captions.keys())[:10]}")
19print(f"人工字幕語言:{list(manual_subs.keys())}")

json3 格式最適合機器解析——每個片段都有毫秒級的 startdur 和文字片段。語言代碼採用 BCP-47(例如 enen-USzh-Hansjaes)。

步驟 5:批次擷取多支影片或整個頻道

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "extract_flat": "in_playlist",  # 很快——只抓 video ID 和標題
5    "sleep_interval": 2,
6    "max_sleep_interval": 6,
7}
8with yt_dlp.YoutubeDL(opts) as ydl:
9    info = ydl.extract_info(
10        "https://www.youtube.com/@mkbhd/videos",
11        download=False
12    )
13entries = info.get("entries", [])
14print(f"頻道中找到 {len(entries)} 支影片")
15for e in entries[:5]:
16    print(f"  {e.get('title', 'N/A')}{e.get('id')}")

你也可以直接丟入頻道網址、播放清單網址,甚至搜尋字串(例如 ytsearch10:python scraping),yt-dlp 會在內部幫你處理分頁。

什麼時候適合用這個方法?什麼時候不適合?

適合: 大量中繼資料擷取、留言、逐字稿、下載影片、需要完整欄位集的頻道級抓取。

限制: 不太適合抓搜尋結果頁(這種情況 Selenium/Playwright 更合適)。2024–2026 的反機器人大戰也讓 yt-dlp 在大規模環境下變得更複雜——YouTube 現在在某些用戶端上強制 。如果是正式環境,建議安裝 外掛,並搭配 --cookies-from-browser chrome(請用一個丟棄帳號;yt-dlp 團隊提醒,若直接使用真實 Google 帳號的 cookies,帳號有可能被封)。

方法 4:用 YouTube Data API 擷取 YouTube

官方的 YouTube Data API v3 是取得 YouTube 資料最穩定、最結構化的方式。回應是乾淨的 JSON,欄位有完整文件說明,也不用跟反機器人玩貓捉老鼠。但很多教學都會略過一個關鍵:配額制度。

  • 難度: 中階
  • 所需時間: 約 20 分鐘(含 API 金鑰設定)
  • 需要: Python 3.10+、Google Cloud 專案、pip install google-api-python-client

步驟 1:取得 YouTube Data API 金鑰

  1. 前往
  2. 建立新專案(或選擇既有專案)
  3. 進入 APIs & Services → Library,搜尋 "YouTube Data API v3",然後按 Enable
  4. 進入 APIs & Services → CredentialsCreate Credentials → API Key
  5. 複製金鑰,等等程式碼會用到

步驟 2:第一次 API 呼叫

1from googleapiclient.discovery import build
2API_KEY = "YOUR_API_KEY_HERE"
3youtube = build("youtube", "v3", developerKey=API_KEY)
4# 取得特定影片的資訊
5response = youtube.videos().list(
6    part="snippet,statistics,contentDetails",
7    id="dQw4w9WgXcQ"
8).execute()
9video = response["items"][0]
10print(f"標題:{video['snippet']['title']}")
11print(f"觀看次數:{video['statistics']['viewCount']}")
12print(f"喜歡數:{video['statistics'].get('likeCount', '隱藏')}")
13print(f"留言數:{video['statistics'].get('commentCount', '已停用')}")
14print(f"長度:{video['contentDetails']['duration']}")
15print(f"標籤:{video['snippet'].get('tags', [])[:5]}")

這種回應乾淨、型別清楚、文件完整,不需要做 JSON 考古。

步驟 3:擷取影片細節、頻道資訊和留言

1# 搜尋影片
2search_response = youtube.search().list(
3    part="snippet",
4    q="python web scraping tutorial",
5    type="video",
6    maxResults=10,
7    order="viewCount"
8).execute()
9for item in search_response["items"]:
10    print(f"  {item['snippet']['title']}{item['id']['videoId']}")
11# 抓留言
12comments_response = youtube.commentThreads().list(
13    part="snippet",
14    videoId="dQw4w9WgXcQ",
15    maxResults=20,
16    order="relevance"
17).execute()
18for item in comments_response["items"]:
19    comment = item["snippet"]["topLevelComment"]["snippet"]
20    print(f"  [{comment['likeCount']} 個讚] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")

YouTube API 的現實配額(很多人不會告訴你)

這一段才是真正把「有用指南」和「只會複製貼上」的教學區分開來的地方。預設配額是 ,美西時間午夜重置。以下是每次呼叫的成本:

API 端點每次呼叫配額成本每次最多結果數
search.list100 units50 筆結果
videos.list1 unit50 個影片 ID(可批次)
channels.list1 unit50 個頻道 ID
commentThreads.list1 unit100 則留言
captions.list50 units不適用

接著來算數學。假設你想抓 1,000 筆搜尋結果:

  • 搜尋呼叫: 1,000 筆 ÷ 每頁 50 筆 = 20 次呼叫 × 100 units = 2,000 units(等於你每天預算的 20%,直接沒了)
  • 這 1,000 支影片的詳細資料: 1,000 個 ID ÷ 每批 50 個 = 20 次呼叫 × 1 unit = 20 units(很便宜——批次 videos.list 是救星)
  • 這 1,000 支影片的留言(假設每支只抓 1 頁):1,000 次呼叫 × 1 unit = 1,000 units

總計大約 3,020 units,對中小型擷取來說已經不少。但如果那些影片留言很多(每支 50+ 頁),剩下的 7,000 units 很快就會燒光。一支有 50,000 則留言的影片大概就是 500 頁 = 500 units;如果你抓 20 支這種影片,今天的配額就結束了。

需要完整的合規審查:隱私權政策網址、服務條款網址、應用程式操作影片、以及配額計算的合理性說明。社群回報顯示,Google 通常要 3–5 個工作天才會回覆,正式核准可能得等好幾週到幾個月,而且很多申請都會被拒,尤其是那種「我只是想拿更多資料做分析」的用途。

什麼情況適合用 API: 小到中等規模、需要結構化且可靠的資料、留言和頻道統計很重要、且能接受配額上限。

什麼情況下用抓取更合理: 大規模專案(每天超過 1 萬支影片)、API 沒提供的欄位(完整逐字稿——captions.download 需要 OAuth + 影片擁有者權限)、或每個查詢需要超過 500 筆搜尋結果時(即使 totalResults 顯示更多,API 仍有硬限制)。

免寫程式捷徑:用 Thunderbit 擷取 YouTube(不需要 Python)

如果你是做資料管線,真的需要 Python,那就用上面的方法 1–4。但如果你只想在 2 分鐘內拿到 YouTube 資料——也許你是想抓競品數據的行銷人員,或只是想快速取資料、懶得搭環境的開發者——其實有更快的路。

是一個 AI 網頁爬蟲 Chrome 擴充功能,我們就是專門為這種「寫程式太大材小用」的情境打造的。它可以直接在瀏覽器裡對 YouTube 頁面操作。

3 步驟用 Thunderbit 擷取 YouTube

步驟 1: 安裝 ,然後打開一個 YouTube 頻道頁、搜尋結果頁或影片頁。

步驟 2: 在 Thunderbit 側邊欄點選 「AI 建議欄位」。AI 會讀取頁面,並自動建議像是影片標題、觀看次數、上傳日期、長度、頻道名稱和縮圖網址等欄位。你也可以依需求新增、刪除或重新命名欄位。

步驟 3: 點選 「擷取」,然後匯出到 Google Sheets、Excel、CSV、Airtable 或 Notion。資料會以整齊表格的形式送出,馬上就能用。

適合哪些人?

  • 行銷人員:需要競品頻道資料,但不會寫程式
  • 開發者:想快速拿資料,不想先建立虛擬環境和安裝依賴套件
  • 任何卡在反機器人機制前的人:Thunderbit 是在你自己已登入的瀏覽器 session 裡擷取,會沿用你的 cookies 和 PO token,能避開很多伺服器端爬蟲會遇到的封鎖問題
  • Thunderbit 也能使用 逐一拜訪每支影片頁面,為表格補充更多資訊(例如喜歡數、描述、標籤)

如果你想更深入了解 Thunderbit 如何專門處理 YouTube,可以看看

用 Python 擷取 YouTube 時,如何避免被封鎖

以下技巧適用於這 4 種 Python 方法。YouTube 的反機器人機制在 ,主要訊號有三個:IP 行為分析、需要執行 JS、以及 HTML 結構經常變動。

所有方法都適用的原則:

  • 不只輪換 User-Agent,整組 header 也要一起換——AcceptAccept-LanguageSec-CH-UA 這些 client hints 也要和 UA 相符。 有最新清單。
  • 每次請求之間加上 2–8 秒的隨機延遲。固定間隔本身就是偵測訊號。
  • 只要不是少量頁面,就該用住宅代理。資料中心 IP(AWS、GCP、Hetzner)在
  • session 和 IP 要一起輪換——YouTube 會把 session 跟 IP 綁在一起,同一個 cookie 出現在不同 IP 上會很可疑。

針對 requests + BS4: 記得設定 CONSENT=YES+cb cookie。沒有它的話,歐盟地區的請求會被導向一個沒有資料的同意頁。

針對 Selenium/Playwright: 在 Linux 伺服器上,建議用 xvfb 跑顯示模式,而不是 --headless=new——無頭 Chrome 依然會漏出足夠的指紋訊號,讓高階偵測工具抓到。也可以考慮 ,它會套用大約 17 種躲避策略。

針對 yt-dlp: 使用 sleep_intervalmax_sleep_interval 參數。安裝 外掛來產生 PO Token。搭配 --cookies-from-browser chrome,但請用測試帳號。

針對 API: 監控配額,並盡量批次化請求。一次 videos.list 帶 50 個用逗號分隔的 ID,只要 1 unit——務必善用。

針對 Thunderbit: 因為擷取是在你自己的瀏覽器 session 裡進行,反機器人機制會自動被處理。你其實只是把原本手動會做的事自動化而已。

用 Python 擷取 YouTube 合法嗎?

這要看你抓的是什麼、怎麼抓,以及你怎麼使用這些資料。

2024 年的法律環境出現變化,Meta Platforms v. Bright Data(加州北區法院,2024 年 1 月)中,。這讓公開資料的擷取風險明顯下降。另一方面,hiQ v. LinkedIn 最後則以 告終,原因包括違反 ToS、CFAA 違規(假帳號)以及侵入動產,還附帶永久禁制令。

YouTube 自己的 寫得很清楚:「未經事先書面許可,或未獲適用法律允許,不得以任何自動化方式(例如機器人、botnet 或爬蟲)存取本服務。」官方認可的資料取得方式就是 YouTube Data API。

幾個實務上的原則:

  • 抓取公開可見的資料,用於個人研究或非商業分析,通常風險較低
  • API 是最安全的路徑,因為它是明確授權的
  • 不要抓私密或登入後才能看到的內容、不要下載受版權保護的影片拿去重新散布、也不要因為留言中的個資而違反 GDPR
  • YouTube 留言在 GDPR 第 4(1) 條下屬於個人資料——處理歐盟資料主體資訊時要特別小心
  • 商業抓取專案請先諮詢法律顧問

以上都不是法律意見。這個領域變化非常快——2025–2026 年,一波創作者針對 AI 公司提起的 (涉及抓取 YouTube 作訓練資料)也正在重新塑造整個環境。

用 Python 擷取 YouTube,該選哪一種方法?

決策指南如下:

  • 只需要幾個頁面的快速中繼資料? → 方法 1(requests + BS4)。快、輕量,除了 requestsbeautifulsoup4 幾乎沒其他依賴。
  • 需要抓搜尋結果或操作動態頁面? → 方法 2(Selenium/Playwright)。能完整渲染瀏覽器、支援無限捲動,但速度慢、也比較容易被偵測。
  • 需要大量中繼資料、留言或逐字稿? → 方法 3(yt-dlp)。功能最完整的單一工具—— 不是沒有原因。
  • 需要中等規模、結構化又可靠的資料? → 方法 4(YouTube Data API)。官方、乾淨,但受限於 的配額。
  • 兩分鐘內拿到資料,不想寫程式?。瀏覽器內、AI 驅動、幾下點擊就能匯出到 Google Sheets。

沒有任何一種方法能解決所有情境。建議你把上面的比較表和可擷取欄位參考存起來——下次做專案時一定會省很多時間。如果你想探索更多 ,Thunderbit 部落格也有很多實用指南,從 都有。

試用 Thunderbit 擷取 YouTube

常見問題

不用 API 金鑰,也能擷取 YouTube 嗎?

可以。方法 1(requests + BS4)、方法 2(Selenium/Playwright)和方法 3(yt-dlp)都不需要 API 金鑰。只有方法 4(YouTube Data API)需要。Thunderbit 也不需要任何 API 金鑰——它是直接在你的瀏覽器中擷取。

用 Python 擷取 YouTube 的最快方法是什麼?

就 Python 而言,yt-dlp 和 requests + BS4 是最快的——兩者都不需要瀏覽器開銷,通常每支影片幾秒內就能拿到中繼資料。yt-dlp 尤其適合批次操作,因為它會在內部處理分頁。若你根本不想寫 Python,Thunderbit 則是整體最快,因為幾乎沒有設定成本。

要怎麼用 Python 擷取 YouTube 留言?

yt-dlp 的 getcomments 選項內建留言擷取,是最簡單的路徑。YouTube Data API 也支援留言,透過 commentThreads.list 就行(每次 1 unit,每頁最多 100 則留言)。Selenium/Playwright 技術上也能做到,但得透過捲動並抓取渲染後的留言元素,速度慢又脆弱。

可以用 Python 擷取 YouTube Shorts 嗎?

可以。yt-dlp 對 Shorts 的中繼資料支援很好,它會把 Shorts 當作一般影片處理,只是多一些 Shorts 專屬欄位。YouTube Data API 也有部分支援(Shorts 觀看次數計算方式在 有變更——現在只要開始播放或重播都會計入)。BS4 和 Selenium/Playwright 對 Shorts 的支援有限,因為 Shorts 區塊使用不同的 DOM 結構。

一天可以擷取多少支 YouTube 影片?

如果使用 YouTube Data API,你會被限制在每天約 10,000 quota units。若使用批次 videos.list(每次 50 個 ID 只要 1 unit),理論上每天可查詢多達 50 萬筆影片統計資料;但 search.list 每次要 100 units,很快就會吃光配額。至於 BS4、Selenium、yt-dlp 這類擷取方法,限制比較不是寫死的,而是實務上會受 IP 封鎖影響:視代理設定和請求模式而定,通常每個 IP 一天幾百到幾千次請求後就可能開始出現問題。Thunderbit 則採用點數制,綁定你的

延伸閱讀

Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
目錄

試試 Thunderbit

只要 2 次點擊,就能抓取潛在客戶與其他資料。AI 驅動。

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