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

最後更新於 April 15, 2026
使用 Python 擷取 YouTube:4 種真正有效的方法

如果你曾經試過用 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 不只是影片平台,更是一個擁有 25.8 億每月活躍使用者 的資料來源。平台上累積了超過 51 億支影片,而且每分鐘還有 500 小時以上的內容上傳。對企業、研究人員和創作者來說,這些公開可見的資訊都很值得進一步分析。

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

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

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

舉例來說,DJI、GoPro 和 Insta360 的競品分析發現,DJI 的 YouTube 觸及量(3.9 億觀看次數)比另外兩家加起來還高——這類洞察在 YouTube Studio 裡面根本看不到。

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

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

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

import requests
from bs4 import BeautifulSoup

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

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

Scrapfly 2026 年的 YouTube 拆解文章 解釋了背後機制: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 幾乎會立刻被擋掉——ScrapeOps 的 header 指南 也證實這是新手最常踩的大坑。

import requests

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/114.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Cookie": "CONSENT=YES+cb",  # 繞過歐盟同意提示
}

url = "https://www.youtube.com/@mkbhd/videos"
response = requests.get(url, headers=HEADERS)
print(response.status_code)  # 應該是 200

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

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

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

import re
import json

# 擷取 ytInitialData JSON
match = re.search(
    r"var ytInitialData\s*=\s*({.*?});</script>",
    response.text,
    re.DOTALL
)
if match:
    data = json.loads(match.group(1))
    print("ytInitialData 擷取成功")
else:
    print("找不到 ytInitialData,請檢查 headers / cookies")

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

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

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

def search_dict(partial, search_key):
    stack = [partial]
    while stack:
        cur = stack.pop()
        if isinstance(cur, dict):
            for k, v in cur.items():
                if k == search_key:
                    yield v
                else:
                    stack.append(v)
        elif isinstance(cur, list):
            stack.extend(cur)

# 從頻道頁面擷取影片資訊
videos = []
for vr in search_dict(data, "videoRenderer"):
    videos.append({
        "video_id": vr.get("videoId"),
        "title": vr["title"]["runs"][0]["text"],
        "views": vr.get("viewCountText", {}).get("simpleText", "N/A"),
        "published": vr.get("publishedTimeText", {}).get("simpleText", "N/A"),
    })

print(f"找到 {len(videos)} 支影片")
for v in videos[:5]:
    print(f"  {v['title']} — {v['views']}")

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

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

import csv

with open("youtube_videos.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["video_id", "title", "views", "published"])
    writer.writeheader()
    writer.writerows(videos)

print("資料已匯出到 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。TestDino 2026 的基準測試 顯示,Playwright 每次操作大約 快 1.85 倍、記憶體少約 2.1 倍、並行能力約高 4 倍。Playwright 是透過 Chrome DevTools Protocol 維持持久 WebSocket;Selenium 則是走 WebDriver over HTTP,每個指令都要多一層轉譯。

步驟 1:設定 Playwright

pip install playwright
playwright install chromium
from playwright.sync_api import sync_playwright

pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)  # 顯示瀏覽器較不容易被偵測
context = browser.new_context()

# 預先加入同意 cookie,繞過歐盟提示
context.add_cookies([{
    "name": "SOCS",
    "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
    "domain": ".youtube.com",
    "path": "/",
}])

page = context.new_page()

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

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

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

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

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

prev_height = -1
max_scrolls = 20  # 要設上限,1 萬支影片的頻道會一直捲下去
scroll_count = 0

while scroll_count < max_scrolls:
    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    page.wait_for_timeout(1500)  # 等待新內容載入
    new_height = page.evaluate("document.body.scrollHeight")
    if new_height == prev_height:
        break  # 沒有新內容載入
    prev_height = new_height
    scroll_count += 1

print(f"已捲動 {scroll_count} 次")

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

video_elements = page.query_selector_all("a#video-title-link")
videos = []

for el in video_elements:
    title = el.inner_text()
    href = el.get_attribute("href")
    video_id = href.split("v=")[-1] if href else None
    videos.append({"title": title, "video_id": video_id, "url": f"https://www.youtube.com{href}"})

print(f"已擷取 {len(videos)} 支影片")

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

步驟 5:匯出成 CSV 或 Google Sheets

import csv

with open("youtube_playwright.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "video_id", "url"])
    writer.writeheader()
    writer.writerows(videos)

browser.close()
pw.stop()

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

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

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

方法 3:用 yt-dlp 擷取 YouTube

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

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

步驟 1:安裝 yt-dlp

pip install yt-dlp

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

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

import yt_dlp

opts = {
    "quiet": True,
    "skip_download": True,      # 不抓影片本體,只要中繼資料
    "no_warnings": True,
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

print(f"標題:{info['title']}")
print(f"觀看次數:{info['view_count']:,}")
print(f"喜歡數:{info.get('like_count', 'N/A')}")
print(f"長度:{info['duration']} 秒")
print(f"上傳日期:{info['upload_date']}")
print(f"頻道:{info['channel']}({info.get('channel_follower_count', 'N/A')} 訂閱)")
print(f"標籤:{info.get('tags', [])[:5]}")

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

步驟 3:擷取 YouTube 留言

opts = {
    "quiet": True,
    "skip_download": True,
    "getcomments": True,
    "extractor_args": {
        "youtube": {
            "max_comments": ["200", "50", "50", "10"],  # 總數、父留言、每則回覆數、回覆總數
            "comment_sort": ["top"],
        }
    },
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

comments = info.get("comments", [])
print(f"已抓到 {len(comments)} 則留言")
for c in comments[:3]:
    print(f"  [{c.get('like_count', 0)} 個讚] {c['author']}: {c['text'][:80]}...")

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

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

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

opts = {
    "quiet": True,
    "skip_download": True,
    "writesubtitles": True,
    "writeautomaticsub": True,
    "subtitleslangs": ["en", "en-orig"],
    "subtitlesformat": "json3",   # 適合機器解析:含 start/dur(毫秒)和文字
    "outtmpl": "%(id)s.%(ext)s",
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

# 直接從 info 字典讀取字幕資料
auto_captions = info.get("automatic_captions", {})
manual_subs = info.get("subtitles", {})
print(f"自動字幕語言:{list(auto_captions.keys())[:10]}")
print(f"人工字幕語言:{list(manual_subs.keys())}")

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

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

opts = {
    "quiet": True,
    "skip_download": True,
    "extract_flat": "in_playlist",  # 很快——只抓 video ID 和標題
    "sleep_interval": 2,
    "max_sleep_interval": 6,
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/@mkbhd/videos",
        download=False
    )

entries = info.get("entries", [])
print(f"頻道中找到 {len(entries)} 支影片")
for e in entries[:5]:
    print(f"  {e.get('title', 'N/A')} — {e.get('id')}")

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

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

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

限制: 不太適合抓搜尋結果頁(這種情況 Selenium/Playwright 更合適)。2024–2026 的反機器人大戰也讓 yt-dlp 在大規模環境下變得更複雜——YouTube 現在在某些用戶端上強制 BotGuard attestation 與 PO Tokens。如果是正式環境,建議安裝 bgutil-ytdlp-pot-provider 外掛,並搭配 --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. 前往 Google Cloud Console
  2. 建立新專案(或選擇既有專案)
  3. 進入 APIs & Services → Library,搜尋 "YouTube Data API v3",然後按 Enable
  4. 進入 APIs & Services → CredentialsCreate Credentials → API Key
  5. 複製金鑰,等等程式碼會用到

步驟 2:第一次 API 呼叫

from googleapiclient.discovery import build

API_KEY = "YOUR_API_KEY_HERE"
youtube = build("youtube", "v3", developerKey=API_KEY)

# 取得特定影片的資訊
response = youtube.videos().list(
    part="snippet,statistics,contentDetails",
    id="dQw4w9WgXcQ"
).execute()

video = response["items"][0]
print(f"標題:{video['snippet']['title']}")
print(f"觀看次數:{video['statistics']['viewCount']}")
print(f"喜歡數:{video['statistics'].get('likeCount', '隱藏')}")
print(f"留言數:{video['statistics'].get('commentCount', '已停用')}")
print(f"長度:{video['contentDetails']['duration']}")
print(f"標籤:{video['snippet'].get('tags', [])[:5]}")

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

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

# 搜尋影片
search_response = youtube.search().list(
    part="snippet",
    q="python web scraping tutorial",
    type="video",
    maxResults=10,
    order="viewCount"
).execute()

for item in search_response["items"]:
    print(f"  {item['snippet']['title']} — {item['id']['videoId']}")

# 抓留言
comments_response = youtube.commentThreads().list(
    part="snippet",
    videoId="dQw4w9WgXcQ",
    maxResults=20,
    order="relevance"
).execute()

for item in comments_response["items"]:
    comment = item["snippet"]["topLevelComment"]["snippet"]
    print(f"  [{comment['likeCount']} 個讚] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")

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

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

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 資料——也許你是想抓競品數據的行銷人員,或只是想快速取資料、懶得搭環境的開發者——其實有更快的路。

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

3 步驟用 Thunderbit 擷取 YouTube

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

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

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

試用 Thunderbit 擷取 YouTube

適合哪些人?

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

如果你想更深入了解 Thunderbit 如何專門處理 YouTube,可以看看 Thunderbit YouTube 頻道爬蟲範本Thunderbit YouTube 頻道

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

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

所有方法都適用的原則:

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

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

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

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

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

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

用 Python 擷取 YouTube 合法嗎?

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

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

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

幾個實務上的原則:

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

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

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

決策指南如下:

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

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

試用 Thunderbit 擷取 YouTube Get Started Free

常見問題

不用 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 觀看次數計算方式在 2025 年 4 月 30 日 有變更——現在只要開始播放或重播都會計入)。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
Thunderbit 技術長|資深資料科學家與機器學習專家 Ke Shen 在機器學習與資料科學領域擁有近十年經驗,畢業於哥倫比亞大學,曾任 Walmart Labs 資深資料科學家。他精通 Python、R、Java 與統計學,且具備深受同儕認可的深厚專業,分享如何將複雜的 AI 演算法從理論落實到可投入生產的架構的實戰見解。
目錄

只要提問,就能抓取網頁

用白話告訴它你要什麼,或者更好,什麼都不用說。

立即體驗 Thunderbit free
使用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week