Python의 YouTube 스크립트 API: requests를 사용한 10줄

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video.
YouTube is blocking requests from your IP.
그 추적이 당신을 여기로 데려왔다면 환영합니다. AWS, GCP 또는 다른 데이터센터 IP에 코드가 랩톱에서 떠나 도착하는 순간 인기 있는 pip 패키지의 표준 실패 모드입니다. 이 게시물은 다른 경로를 보여줍니다: requests로만 Python에서 호출하는 호스팅된 YouTube 스크립트 API. 끝까지 모든 YouTube URL을 스크립트 텍스트로 변환하는 10줄 스크립트와 속도 제한 및 자막이 없는 비디오에 대한 적절한 분기가 있습니다.
pip 라이브러리가 프로덕션에서 사망하는 이유
youtube-transcript-api는 이를 실행하는 모든 기계에서 YouTube를 직접 스크래핑합니다. 로컬에서는 문제없습니다. 배포하면 YouTube의 봇 감지는 며칠 이내에 클라우드 제공자의 IP 범위에 플래그를 지정하거나 때로는 분 내에 지정합니다. YouTube 스크립트 API가 차단되는 이유에서 불쾌한 세부 정보를 작성했습니다. 짧은 버전: 공개 캡션을 읽기 위해 주거용 프록시를 임차하면 터무니없습니다.
youtube2text.org는 YouTube를 향한 부분을 서버 측에서 수행합니다. 코드는 하나의 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, shorts, embeds 또는 11자 비디오 ID. 응답은 videoId, title, pubDate, content, contentSize 및 truncated 플래그를 제공합니다.
그 데모 키에 한 가지 주의: 모든 사람이 공유하고 IP당 월 5개 비디오로 제한됩니다. 타이어를 차는 데 는 좋지만 실제로는 쓸모가 없습니다.
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자 = 토큰 규칙에서 maxChars=20000은 약 5k 토큰을 도달합니다. result["truncated"]를 확인하여 전체를 받았는지 알아보세요. 이를 단일 프롬프트 대신 검색 파이프라인에 연결하는 경우 LangChain 통합 게시물은 청킹을 적절히 다룹니다.
데모 키에서 벗어나기
공유 비디오 월 5개가 충분하지 않을 때 youtube2text.org/app/keys에서 Google으로 로그인하고 자신의 키를 만듭니다. 전화 번호나 신용 카드가 없습니다. 무료 계층은 키당 월 5개 비디오입니다. 유료 계층은 50개당 $5.99부터 시작합니다. 위의 10줄은 변경되지 않으며 헤더의 문자열만 변경됩니다.