당신은 youtube-transcript-api를 사용하여 몇 줄의 코드를 작성하고, 자신의 노트북에서 테스트했으며 모든 스크립트가 성공적으로 반환되었습니다. 그런 다음 AWS, Google Cloud, Azure, Vercel, Render, Railway 또는 GitHub Actions 러너에 배포했고, 동일한 코드가 모든 비디오에서 실패하기 시작했습니다.
증상
라이브러리 버전에 따라 다음과 같은 오류 중 하나가 발생합니다:
- 최신 버전에서는
RequestBlocked 또는 IpBlocked 오류가 발생합니다.
- 이전 버전에서는 자막이 분명히 존재하는 비디오에서
TranscriptsDisabled 오류가 발생합니다.
429 Too Many Requests, 또는 no element found와 같은 XML 파싱 오류가 발생합니다.
핵심은 동일한 비디오는 당신의 기기에서는 작동하지만 서버에서는 실패한다는 점입니다.
원인
youtube은 클라우드 제공업체에 속하는 대부분의 IP 주소를 차단합니다. 라이브러리 자체 README에도 IP 차단 우회 방법에서 언급되어 있으며, issue #303(
fetching 부분은 홈 연결(오래된 노트북이나 Raspberry Pi 등)에서 실행하고 그 결과를 서버로 전송하세요.
장점: 트래픽 볼륨이 적은 개인 프로젝트에 좋음.
주의할 점: 확장성이 떨어지고, 계속 실행해야 하는 추가 장비가 필요하며, 홈 IP 주소도 속도 제한(rate limited)을 받을 수 있음.
해결책 3: 호스팅된 트랜스크립트 API (hosted transcript API)
서비스가 자체 프록시를 통해 요청을 처리하고 HTTP를 통해 결과를 제공하도록 하세요.
공개 정보: 저는 Apify에서 YouTube Transcript Scraper 중 하나를 구축했습니다. 이 도구는 비디오, 재생 목록 또는 채널 링크를 받아 텍스트, 타임스탬프가 찍힌 세그먼트, SRT 또는 VTT 형식으로 반환합니다:
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
...
무료 플랜에서는 트랜스크립트당 US$ 0.004가 소요되며(유료 플랜에서 더 저렴함), 프록시가 포함되어 있습니다. 자막이 없는 비디오는 요금이 부과되지 않으며, 무료 플랜의 월 $5 크레딧으로 약 1,250개의 트랜스크립트를 처리할 수 있습니다. AI 에이전트를 사용한다면, youtube-transcript skill이 동일한 호출을 래핑합니다.
장점: 서버리스 함수(serverless functions), CI 작업(CI jobs) 및 에이전트용으로 적합하며, 프록시 관리가 필요 없을 때 좋음.
주의할 점: 제3자에게 의존하고 트랜스크립트당 비용을 지불해야 함.
어떤 것을 선택할까
| 상황 | 옵션 |
|---|
| 개인 스크립트, 비디오가 적음 | 해결책 2를 사용하거나 로컬에서 실행만 하세요 |
| ... | |
| 어떤 것을 선택하든, 이미 가지고 있는 트랜스크립트는 캐싱하세요. 자막은 거의 변하지 않으며, 요청을 하지 않는 모든 것은 차단될 가능성을 줄여줍니다. | |