Python での YouTube Transcript API: requests による10行

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video.
YouTube is blocking requests from your IP.
そのトレースバックがあなたをここに導いた場合、ようこそ。これは人気のあるpipパッケージの標準的な失敗モードで、コードがラップトップを離れてAWS、GCP、または他のデータセンターIPに到着する瞬間です。これは別のルート―Pythonからrequestsだけで呼び出すホストされたYouTube文字起こしAPIです。最後には、任意のYouTube URLをトランスクリプトテキストに変える10行のスクリプト、さらにレート制限と字幕のないビデオの適切な分岐があります。
pipライブラリが本番環境で失敗する理由
youtube-transcript-apiはそれを実行するマシンから直接YouTubeをスクレイピングします。ローカルではそれで大丈夫です。デプロイして、YouTubeのボット検出があなたのクラウドプロバイダーのIPレンジをフラグを立てます。数日以内、時には数分で。YouTube文字起こしAPIがなぜブロックされるかに詳細を書きました―短いバージョン: 公開字幕を読むために住宅用プロキシを借りることになり、それは不合理です。
youtube2text.orgはYouTubeに向かう部分をサーバー側で行います。コードは1つのHTTPSコールを行い、JSONで戻ります。
10行
アカウントなしで試すことはできません―デモキーのエンドポイントがあります:
import requests
API = "https://youtube2text.org/api/transcribe"
KEY = requests.get("https://youtube2text.org/api/demo-key").json()["apiKey"]
resp = requests.get(API, params={"url": "https://youtu.be/dQw4w9WgXcQ"},
headers={"x-api-key": KEY}, timeout=60)
resp.raise_for_status()
result = resp.json()["result"]
print(result["title"])
print(result["content"][:300])
urlパラメータは任意のYouTube URLの形―watch?v=、youtu.be、ショーツ、埋め込み―または裸の11文字のビデオIDを受け入れます。応答はvideoId、title、pubDate、content、contentSize、およびtruncatedフラグを提供します。
そのデモキーに関する1つの注意: それは全員で共有され、月5ビデオあたりIPで制限されています。タイヤをキックするのは良いが、実際のものでは役に立たないです。
429と404を大人として処理する
raise_for_status()はデモには適していますが、エラーは分岐できるcodeを含む構造化JSONで戻ります:
import time
resp = requests.get(API, params={"url": video_url},
headers={"x-api-key": KEY}, timeout=60)
body = resp.json()
if resp.status_code == 200:
transcript = body["result"]["content"]
elif resp.status_code == 429:
time.sleep(body["error"]["retryAfterSeconds"]) # then retry
elif resp.status_code == 404:
if body["error"]["code"] == "TRANSCRIPT_UNAVAILABLE":
transcript = None # video exists, but has no captions — skip it
else:
raise ValueError(f"No such video: {video_url}") # VIDEO_NOT_FOUND
else:
raise RuntimeError(body["error"]["message"])
TRANSCRIPT_UNAVAILABLEは正直の瞬間を値します: 文字起こしはYouTubeの字幕トラック(手動または自動生成)から来ます。いくつかのビデオは単に持たないです。APIはそこにないテキストを作成することはできません―それらのために、実際の音声テキスト化が必要です。Whisper vs YouTube字幕で比較しました。再試行は役に立たないので、しないでください。
maxCharsとLLMトークン予算
トランスクリプトがプロンプトに向かっている場合、サイズは重要です。3時間のポッドキャストトランスクリプトは喜んで100kトークンを食べます。maxCharsパラメータは出力を制限します―デフォルトと最大値は両方とも150000:
resp = requests.get(API,
params={"url": video_url, "maxChars": 20000},
headers={"x-api-key": KEY}, timeout=60)
粗い4文字あたり1トークンの規則では、maxChars=20000は約5kトークンに到着します。全体を得たかどうかを知るためにresult["truncated"]をチェックしてください。単一のプロンプトの代わりに検索パイプラインにこれを配線している場合、LangChain統合投稿はチャンキングを適切にカバーしています。
デモキーから降りる
月5つの共有ビデオで十分ではなくなったとき、youtube2text.org/app/keysでGoogleサインインして、独自のキーをミントしてください―電話番号もクレジットカードもありません。無料ティアは月5ビデオあたりキー。有料ティアは50で$5.99から始まります。上の10行は変わらず、ヘッダーの文字列だけが変わります。