youtube-transcript-api ブロック? AWS/GCPでのIPバン修正

スクリプトは数週間ラップトップで完璧に実行されました。その後、デプロイしました―Lambda、EC2ボックス、Cloud Run、Herokuダイノ、関係なく―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からのトラフィックに一括で異議を唱えます。1日に3つのリクエストを行っているという事実は関係ありません。ブロックはネットワーク近所にあり、あなたの行動ではありません。インスタンスを再起動し、新しい弾性IPを取得し、関数を再デプロイします―別のアドレスから同じブロックされたプールに到着します。
これは内部化する価値があります。最初の本能(再試行を追加、遅延を追加、ユーザーエージェントを回転)は役に立たないからです。YouTubeがキーになっているシグナルはパケットがどこから来るかです。
修正1: 独自の住宅用プロキシを実行する
ライブラリはこれを直接サポートしています―WebshareProxyConfigとどのプロバイダー用でもGenericProxyConfigを出荷しています。住宅用IPを通じてリクエストをルーティングし、ブロックはほぼ停止します。それは本当に機能しています。それはYouTubeを大規模でスクレイピングする人が生き残る方法です。
正直なコスト計算は次のとおりです:
- お金: 住宅用帯域幅はプロバイダーに応じて大まかに$3~8/GBで実行され、まともなプロバイダーは月間コミットメントを望んでいます―現実的には、何かを取得する前に$30~100/月。各文字起こし取得は小さい(数百KB)なので、帯域幅は問題ではありません。最小値とアカウントオーバーヘッドが問題です。
- エンジニアリング: あなたはローテーション、バンロジックの再試行、および監視を所有しています。住宅用IPも異議を唱えられます。ただし、頻度は低いため、失敗を検出して再ルーティングする必要があります。
- 継続的な注意: YouTubeが変わります。3月に機能したプロキシセットアップは6月にはケアが必要です。
他のスクレイピング用にプロキシインフラストラクチャを既に実行している場合、これを付け加えるのは合理的です。文字起こしが唯一必要なものの場合、1つの関数呼び出しをサポートするためにプロキシフリートを操作するサインアップです。
修正2: この戦いに既に取り組んでいるエンドポイントを呼び出す
youtube2text.orgはサーバー側で住宅用プロキシローテーションを行うため、クラウド関数は通常のAPIに対して1つの退屈なHTTPSリクエストを行います。移行はほぼ検索と置換です。
前:
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―月5ビデオあたりIPを許可します。エラーはコード付きの構造化JSONで返されます: TRANSCRIPT_UNAVAILABLE(404)はビデオが本当に字幕を持たないことを意味します―ブロックではなく、プロキシは修正しません。RATE_LIMIT_EXCEEDED(429)には再試行ヒントが含まれています。Python統合ガイドにはより完全なPythonチュートリアルがあります。
どの修正があなたに適しているか
- youtube-transcript-api +独自のプロキシに留まる は、毎日数千の文字起こしを取得し、既にプロキシアカウントを持っており、セットアップを所有する誰かがいる場合。その量では、ビデオあたりの価格設定は1GB単価を打つことができます。
- ホストされたエンドポイントに切り替える は、文字起こしが製品ではなく機能である場合。1つのHTTPコール、JSON出力、ブロック問題は他人のポケベルです。
- どちらも欠落している字幕を修正しません。
TRANSCRIPT_UNAVAILABLEを返すビデオの場合、フォールバックは音声テキスト化です―Whisper vs YouTube字幕を見てください。yt-dlpに代わりに試すことを考えていた場合、それがデータセンターアドレスから同じIPブロックにヒットすることに注意してください。
あなた自身のキー(共有デモクォータとは別)はyoutube2text.org/app/keysでGoogleサインインを取ります―無料ティアは月5ビデオ、有料プランは月$5.99から50ビデオから$19.99無制限まで。無料ティアの電話番号またはカードなし。