HomeBlogTranscribePlansAPI Keys

youtube-transcript-api 被阻止?修复 AWS/GCP 上的 IP 限制

Python 回溯信息,显示 youtube-transcript-api 在云服务器上运行时的 IpBlocked 错误

该脚本在你的笔记本电脑上完美运行了数周。然后你部署它——Lambda、EC2 实例、Cloud Run、Heroku dyno,不管什么——现在对 youtube-transcript-api 的每次调用都会因为类似这样的错误而失败:

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video ...
YouTube is blocking requests from your IP.

或浏览器版本的同样问题:"登录以确认你不是机器人"。你的代码没有改变。这个库没有问题。问题在于你的 IP 地址。

为什么只在生产环境中出现

youtube-transcript-api 的工作原理是以 YouTube 播放器相同的方式获取字幕数据——无需 API 密钥,只是向 YouTube 发送 HTTP 请求。YouTube 可以容忍来自住宅网络的此类请求,这就是为什么本地开发感觉良好。但 AWS、GCP、Azure 和 Heroku 的 IP 范围是公开的,YouTube 对来自这些 ASN 的流量进行全面挑战。无论你一天只发送三个请求,限制都是在网络邻域级别,而不是基于行为。重启实例、获得新的弹性 IP、重新部署函数——你会落在同一被限制池中的另一个地址上。

这值得深入理解,因为第一反应(添加重试、添加延迟、轮换用户代理)是无效的。YouTube 关键响应的信号是数据包来自何处。

修复 1:运行自己的住宅代理

该库直接支持这一点——它附带了 WebshareProxyConfig 和任何提供商的 GenericProxyConfig。通过住宅 IP 路由请求,限制基本会停止。这确实有效;这是任何大规模爬取 YouTube 的人存活的方式。

但诚实的成本核算是:

如果你已经为其他爬取运行代理基础设施,将其集成是合理的。如果转录文本是你唯一需要的,你就要操作一个代理集群来支持一个函数调用了。

修复 2:调用一个已经处理此问题的端点

youtube2text.org 在服务器端进行住宅代理轮换,因此你的云函数发送一个普通的 HTTPS 请求到常规 API。迁移几乎是查找和替换。

之前:

from youtube_transcript_api import YouTubeTranscriptApi

transcript = YouTubeTranscriptApi().fetch(video_id)
text = " ".join(snippet.text for snippet in transcript)

之后:

import requests

r = requests.get(
    "https://youtube2text.org/api/transcribe",
    params={"url": video_id},          # full URLs work too
    headers={"x-api-key": "yt_YOUR_KEY"},
)
text = r.json()["result"]["content"]

要在创建账户前尝试,获取共享演示密钥——curl -s https://youtube2text.org/api/demo-key——允许每个 IP 每月 5 个视频。错误作为结构化 JSON 返回,代码值得处理:TRANSCRIPT_UNAVAILABLE(404)意味着视频真的没有字幕——不是限制,任何代理都无法修复;RATE_LIMIT_EXCEEDED(429)包含重试提示。Python 集成指南中有更全面的 Python 演练。

哪个修复适合你

你自己的密钥(与共享演示配额分开)在 youtube2text.org/app/keys 需要 Google 登录——免费层是 5 个视频/月,付费计划从 50 个视频 5.99 美元/月起,无限制 19.99 美元。免费层无需电话号码、无需信用卡。