本地跑得好好的,一部署到服务器就全挂。用 youtube-transcript-api 抓字幕的人,大概率都撞过这堵墙。
症状很统一:同一段代码,笔记本上每条视频都能拿到字幕,换到 AWS、Google Cloud、Azure、Vercel、Render、Railway 或者 GitHub Actions 的 runner 上,每个视频都失败。同一个视频,本地通、服务器不通,这就是最明显的信号。
报错长什么样,取决于库的版本。新版本抛 RequestBlocked 或 IpBlocked;老版本会在明明有字幕的视频上抛 TranscriptsDisabled;还有 429 Too Many Requests,或者类似 no element found 的 XML 解析错误。
问题不在代码,在 IP
YouTube 屏蔽了大部分属于云服务商的 IP 地址。库自己的 README 在「Working around IP bans」一节里就写明了这一点,issue #303(标题大意是「本地能用,云机器上失败」)攒了将近 200 条评论。
你的代码没写错,错的是它运行时所处的那个 IP。顺带一提,家庭或办公 IP 如果在短时间内发出大量请求,也会被临时封一段时间。
三条路,各有代价
第一条,在库里直接挂轮换住宅代理。库原生支持代理,README 推荐用轮换住宅代理,因为 YouTube 过一阵子也会封静态代理。用 WebshareProxyConfig 填上用户名密码即可,其他服务商则通过 GenericProxyConfig(http_url=..., https_url=...) 接入。
适合请求量稳定、想把所有逻辑留在自己代码里的场景。代价是要为代理带宽付费,重试和 IP 轮换都得自己扛。机房代理便宜,但被封的方式和云 IP 一模一样。
第二条,把抓取动作挪到 YouTube 不封的机器上。用家里的宽带(一台旧笔记本、一个树莓派)跑抓取,再把结果送回服务器。
适合低请求量的个人项目。它不具备扩展性,多了一台要维护的机器,而且家庭 IP 同样可能被限流。
第三条,用托管字幕 API。让服务方用自己的代理发请求,你通过 HTTP 拿结果。披露:本文作者开发了其中一项服务,即 Apify 上的 YouTube Transcript Scraper(actor 标识 andracore/youtube-transcript-scraper),接受视频、播放列表或频道链接,返回纯文本、带时间戳的分段、SRT 或 VTT。
价格是免费计划每条字幕 0.004 美元,付费计划更便宜,代理费用已包含在内。没有字幕的视频不收费,免费计划每月 5 美元额度大约覆盖 1250 条字幕。如果用 AI agent,youtube-transcript skill 封装的是同一个调用。
适合 serverless 函数、CI 任务和 agent,或者你根本不想管代理。代价是依赖第三方,并且按条付费。
选哪个,先做一件事
不管选哪条路,先把已经抓到的字幕缓存起来。字幕很少变动,少发一次请求,就少一次被封的机会。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.