youtube-transcript-api 차단됨? AWS/GCP에서 IP 차단 해결하기

스크립트는 몇 주 동안 랩톱에서 완벽하게 실행되었습니다. 그다음 배포했습니다. Lambda, EC2 박스, Cloud Run, Heroku dyno, 상관없습니다. 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의 트래픽에 일괄 이의를 제기합니다. 하루에 3개의 요청을 만들고 있다는 사실은 중요하지 않습니다. 차단은 네트워크 동네에 있지 동작이 아닙니다. 인스턴스를 재부팅하고 새 탄력적 IP를 얻고 함수를 재배포하면 같은 차단된 풀의 다른 주소에 착륙합니다.
이것을 내재화할 가치가 있습니다. 첫 번째 본능 (재시도 추가, 지연 추가, 사용자 에이전트 회전)이 도움이 되지 않기 때문입니다. YouTube가 키를 누르고 있는 신호는 패킷이 어디서 오는지입니다.
해결책 1: 자신의 주거용 프록시 실행
라이브러리는 이것을 직접 지원합니다. WebshareProxyConfig와 모든 제공자를 위한 GenericProxyConfig가 함께 제공됩니다. 주거용 IP를 통해 요청을 라우팅하면 차단이 대부분 멈춥니다. 진정한 작동입니다. YouTube를 규모로 스크래핑하는 모든 사람이 생존하는 방법입니다.
정직한 비용 회계:
- 돈: 주거용 대역폭은 제공자에 따라 대략 $3–8/GB이며, 괜찮은 제공자는 월간 약정을 원합니다. 현실적으로 아무것도 가져오기 전에 $30–100/월입니다. 각 스크립트 fetch는 작습니다 (수백 KB). 대역폭이 문제가 아니므로 최소값과 계정 오버헤드가 문제입니다.
- 엔지니어링: 회전, 차단 시 재시도 로직, 모니터링을 소유합니다. 주거용 IP도 도전을 받지만 덜 자주 받으므로 실패를 감지하고 다시 라우팅해야 합니다.
- 지속적인 주의: YouTube가 변경합니다. 3월에 작동한 프록시 설정은 6월에 관리가 필요합니다.
다른 스크래핑을 위해 프록시 인프라를 이미 실행 중이면 이를 추가하는 것이 합리적입니다. 스크립트가 필요한 유일한 것이면 한 함수 호출을 지원하기 위해 프록시 플릿을 운영하기로 가입하고 있습니다.
해결책 2: 이미 이 전투를 벌이는 엔드포인트 호출
youtube2text.org는 주거용 프록시 회전을 서버 측에서 수행하므로 클라우드 함수는 정상 API에 대한 하나의 지루한 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. 이는 IP당 월 5개 비디오를 허용합니다. 오류는 처리할 가치가 있는 코드가 있는 구조화된 JSON으로 돌아옵니다: TRANSCRIPT_UNAVAILABLE (404)는 비디오가 정말로 자막이 없다는 의미입니다. 차단이 아니므로 프록시도 이를 수정하지 못합니다. RATE_LIMIT_EXCEEDED (429)는 재시도 힌트를 포함합니다. Python 통합 가이드에 더 완전한 Python 연습이 있습니다.
어떤 해결책이 적합한가
- youtube-transcript-api + 자신의 프록시를 유지하면 매일 수천 개의 스크립트를 가져오고, 이미 프록시 계정이 있으며, 설정을 소유할 사람이 있습니다. 그 볼륨에서 GB당 가격이 비디오당 가격을 이길 수 있습니다.
- 호스팅된 엔드포인트로 전환하면 스크립트가 제품이 아닌 기능입니다. 하나의 HTTP 호출, JSON 출력, 차단 문제는 누군가 다른 사람의 호출 번호입니다.
- 둘 다 누락된 자막을 수정하지 않습니다.
TRANSCRIPT_UNAVAILABLE을 반환하는 비디오의 경우 폴백은 음성 대 텍스트입니다. Whisper vs YouTube 자막을 참조하여 비용을 들 가치가 있는지 알아보세요. yt-dlp를 대신 시도하려고 했다면 데이터센터 주소에서 동일한 IP 차단을 hit한다는 것을 알아두세요.
자신의 키 (공유 데모 할당량과 별도)는 youtube2text.org/app/keys에서 Google 로그인을 합니다. 무료 계층은 월 5개 비디오입니다. 월 50개 비디오는 $5.99부터 무제한 $19.99까지입니다. 무료 계층에는 전화 번호나 카드가 없습니다.