Why your YouTube transcript scraper started returning empty strings (and how to fix it in 2026)
개요
YouTube 캡션 엔드포인트에서 빈 문자열을 반환하는 문제의 원인은 YouTube의 BotGuard 시스템에서 요구하는 Proof-of-Origin Token (PoToken) 누락과 데이터센터 IP 차단이며, 이를 해결하기 위한 최신 접근 방식은 웹 페이지 파싱, PoToken 발급, 그리고 특정 매개변수를 포함한 캡션 트랙 요청을 포함한다.
주요 내용
* 문제 증상: YouTube 캡션 스크립트가 오류 없이 HTTP 200 응답을 반환하지만, 응답 본문이 비어있는 현상이 발생하여 파이프라인이 빈 전사본을 기록하게 된다.
* 변경 사항:
* PoToken 요구: YouTube는 이제 캡션 요청 시 BotGuard 시스템에서 생성된 Proof-of-Origin Token (PoToken)을 요구한다. 유효한 토큰 없이는 timedtext 엔드포인트가 빈 응답을 반환한다.
* 데이터센터 IP 차단: AWS, GCP, Azure와 같은 데이터센터 IP 주소는 차단되거나 심하게 스로틀링되어 서버 측 스크래퍼의 실패 원인이 된다.
* 해결 방법 (현대적인 접근 방식):
1. 시청 페이지 가져오기 및 파싱: ytInitialPlayerResponse에서 캡션 트랙과 visitorData를 추출하기 위해 시청 페이지를 가져온다.
2. PoToken 발급: bgutils-js 라이브러리와 jsdom을 사용하여 BotGuard 챌린지를 해결하고 비디오 ID에 바인딩된 PoToken을 생성한다.
3. 캡션 트랙 요청: &pot=<token>&c=WEB&fmt=json3 매개변수를 포함하여 캡션 트랙을 요청하면 JSON 형식의 실제 데이터 응답을 받을 수 있다.
* PoToken 발급 과정 상세:
* bgutils-js의 BG, buildURL, GOOG_API_KEY를 사용한다.
* jsdom을 사용하여 BotGuard가 실행될 DOM 환경을 제공한다.
* BG.Challenge.create를 통해 챌린지를 생성하고, BG.BotGuardClient.create를 통해 클라이언트를 초기화한다.
* BG.WebPoMinter.create를 사용하여 무결성 토큰을 얻고, 이를 바탕으로 비디오 ID에 바인딩된 pot 토큰을 민트한다.
* 주의 사항:
* mintAsWebsafeString(videoId)를 사용하여 비디오 ID에 토큰을 바인딩해야 하며, 일반 식별자에 바인딩하면 빈 응답이 발생할 수 있다.
* &c=WEB 매개변수는 &pot=와 함께 필수적이다.
* 무결성 토큰에는 TTL이 있으며, 배치 처리 시에는 한 번 부트스트랩한 후 재사용할 수 있다.
* CLI 도구: npx get-youtube-transcript <url>은 단일 비디오의 전사본을 쉽게 가져올 수 있는 제로 구성 MIT 패키지로 제공된다.
* 확장성 문제: 수백 또는 수천 개의 비디오를 처리할 때는 데이터센터 IP 차단으로 인해 일반 서버에서의 처리가 어렵다. 이 경우 회전하는 주거용 프록시, 재시도 메커니즘, 업타임 모니터링이 필요하며, 이는 Apify와 같은 호스팅 서비스를 통해 제공될 수 있다.
시사점
YouTube 캡션 스크래핑은 PoToken 메커니즘과 IP 제한으로 인해 복잡해졌으며, 저용량 작업에는 CLI 도구를, 대규모 작업에는 고급 프록시 및 인프라 솔루션이 필요하다.
댓글
GitHub Discussions