youtube-transcript-api 被 YouTube 封鎖?4 種有效解法
同一段抓逐字稿的程式,在自己的筆電上跑得好好的,一部署到 AWS、GCP、Heroku 或無伺服器函式就掛掉。這不是您寫錯了 — YouTube 會系統性地封鎖來自資料中心 IP 位址的請求。以下說明它為什麼會發生,以及從自建代理到託管 API 的四種解法。
錯誤現象:本機正常,正式環境被封鎖
Python 函式庫 youtube-transcript-api 是以程式化方式抓取 YouTube 逐字稿最常見的做法。在本機上,它通常運作得毫無問題。但只要程式跑在雲端伺服器上,請求就開始拋出 IpBlocked、RequestBlocked 或 TooManyRequests 之類的例外 — 訊息通常暗示 YouTube 封鎖了您的 IP。
所有以爬蟲為基礎的做法都會遇到同一件事:Node.js 的逐字稿套件、用 yt-dlp 擷取字幕、自己手刻的爬蟲,全都撞上同一道牆。觸發封鎖的不是您的程式碼,而是請求的來源。
只要您的工作負載跑在 AWS Lambda、Google Cloud Run、Vercel、Railway、Fly.io 或任何 VPS 上,YouTube 看到的就是一個資料中心 IP 位址。這些 IP 區段是公開資訊,長期被機器人濫用,因此會被整段封鎖。住宅網路連線(例如您家裡的 Wi-Fi)則很少被封鎖 — 這就是為什麼「在我電腦上明明可以」在這件事上是字面意義上的事實。
YouTube 為什麼要封鎖這些請求
YouTube 的逐字稿是由一個內部、不需驗證的端點提供的,而這個端點從來就不是設計給第三方使用的。官方並沒有公開的 API 可以抓取任意影片的逐字稿:官方 Data API 的 captions 端點需要影片擁有者的 OAuth 授權,因此只適用於您自己的影片。
正因為這個內部端點免費又不需驗證,它被 AI 公司、SEO 工具和各種爬蟲狂打。YouTube 只能用它唯一能用的方式回應 — 嚴格的速率限制、整段封鎖資料中心 IP 區段,偶爾還會變更端點,讓爬蟲函式庫在一夜之間失效。
這代表任何自行架設的方案,都會陷入沒完沒了的貓捉老鼠遊戲。以下四種解法,依照從最需要自己動手到最省事的順序排列。
解法 1:透過住宅代理伺服器發送請求
最標準的自建做法,是把請求透過輪替的住宅代理伺服器送出,讓 YouTube 看到的是一般家用 IP,而不是您的伺服器。較新版本的 youtube-transcript-api 直接支援這個做法:建立 client 時傳入代理設定即可(函式庫內建 WebshareProxyConfig 輔助類別,也可以用 GenericProxyConfig 搭配任何 HTTP/SOCKS 代理)。
這確實可行,但代價不小。住宅代理的流量費用很貴(通常每 GB 要好幾美元),各家供應商的品質落差很大,而且您等於多背了一個新的故障點:當代理 IP 在請求進行到一半時被封鎖,您就得自己處理重試邏輯、健康檢查和供應商容錯切換。在流量不大的情況下,這也可能是最慢的選項,因為每個請求都要多繞一趟代理網路。
如果您需要完全的掌控權、有工程時間可以維護,而且流量大到足以攤平建置成本,就選這個做法。
解法 2:把抓取程式跑在住宅網路上
有個更簡單的變形:把管線中負責抓逐字稿的那一段,放到有住宅 IP 的地方執行 — 家裡的 Raspberry Pi、辦公室的機器,或一台便宜的迷你電腦 — 再透過佇列或 webhook 把結果推送到您的雲端基礎設施。
這完全省下代理費用,而且對小型、個人的工作負載(例如把影片轉成自己的筆記,或做一份小型電子報)效果出奇地好。缺點也很明顯:它是實體的單一故障點、無法擴展,對正式產品來說也是個彆扭的架構。
解法 3:積極快取,並在錯誤時退避重試
不論您用哪一種抓取方式,有兩個做法能大幅降低被封鎖的機率。第一,把抓到的每一份逐字稿都快取起來 — 逐字稿幾乎不會變動,所以沒有理由對同一支影片抓第二次。用一張以影片 ID 為索引鍵的資料表,就能消除大部分的重複流量。
第二,把封鎖當成一個訊號,而不是一個該立刻重試的錯誤。加上抖動的指數退避(等 1 秒、再 2 秒、4 秒、8 秒⋯)能讓您不那麼顯眼。被封鎖後還猛打端點,是讓整段 IP 區段被封的最快方式。
請注意這是緩解措施,不是根本解法 — 在資料中心 IP 上,就算是第一個請求也可能被封鎖。請搭配另外三種解法之一使用。
解法 4:使用託管的逐字稿 API(無需維護基礎設施)
最省事的選項:把 IP 問題交給已經解決它的服務。ParseJet 只提供一個端點 — POST /v1/parse/youtube 帶上影片網址 — 就會以 JSON 回傳完整逐字稿,以及影片標題、頻道和長度。封鎖、代理管理和端點變更全都在伺服器端處理掉,您的程式碼只有三行,而且會一直保持三行。
從 youtube-transcript-api 遷移過來只要幾分鐘:把函式庫呼叫換成一次 HTTP POST(Python、Node.js 或任何會講 HTTP 的環境都可以 — 包括最容易被封鎖的無伺服器函式)。用 language 參數即可指定要哪一種語言的字幕。
免費方案每月包含 300 點數(一份 YouTube 逐字稿消耗 5 點數,也就是 60 支影片),付費方案每月 19 美元起。對多數產品而言,這比住宅代理的流量費,加上照顧它所需的工程時間還要便宜。
該選哪一種解法?
個人專案、流量不大、有一定技術能力:解法 2(跑在住宅網路的機器)免費,而且夠可靠。
流量大,且有專門的基礎設施工程人力:解法 1(輪替住宅代理)給您最大的掌控權 — 請把代理費用和持續維護成本算進預算。
正式產品、agent 或 RAG 管線,而逐字稿只是其中一項功能、不是您的核心業務:選解法 4(託管 API)— 一次 HTTP 呼叫,不必再玩貓捉老鼠。無論選哪一種,都請額外加上解法 3(快取 + 退避重試)。
常見問題
為什麼 youtube-transcript-api 在本機可以,在我的伺服器上卻不行?
您的筆電用的是住宅 IP,YouTube 很少封鎖。雲端伺服器(AWS、GCP、Vercel、Heroku)用的是資料中心 IP,YouTube 會整段封鎖。函式庫本身沒問題 — 問題出在 IP 區段。
IpBlocked 和 RequestBlocked 錯誤是什麼意思?
這是 youtube-transcript-api 的例外,代表 YouTube 依請求來源拒絕了這次請求。通常表示您的 IP(或您雲端供應商的整段 IP 區段)在 YouTube 的封鎖清單上。從同一個 IP 立刻重試很少會有幫助。
用代理伺服器能解決 youtube-transcript-api 被封鎖的問題嗎?
輪替的住宅代理通常有效 — 資料中心代理通常無效,因為那些區段同樣被封鎖。函式庫原生支援代理設定。請預期會有可觀的流量費用,也會偶爾遇到被封鎖的代理 IP,需要重試邏輯來處理。
YouTube 有官方的逐字稿 API 嗎?
只有您自己的影片才有:YouTube Data API 的 captions 端點需要影片擁有者的 OAuth 同意。並沒有官方 API 可以抓取任意公開影片的逐字稿,這也是為什麼所有通用解法都得依賴那個內部端點。
有提供免費方案的託管 YouTube 逐字稿 API 嗎?
有。ParseJet 透過 POST /v1/parse/youtube 回傳逐字稿 — 每月 300 點免費點數(每支影片 5 點,共 60 支),付費方案每月 19 美元起。它跑在託管的基礎設施上,所以資料中心 IP 被封鎖不再是您的問題。
相關工具
YouTube Transcript Extractor
Get the transcript of any YouTube video free. Paste a link for the full transcript, or fetch transcripts at scale via API — no IP blocks, no proxies.
URL to Markdown Converter
Convert any URL to clean Markdown online for free. Paste a link and get the page's main content as Markdown — no ads, no navigation. API available.
PDF to Markdown Converter
Convert PDF to Markdown online for free. Preserves headings, lists, tables, and code blocks. No signup required — try it instantly or automate via API.