youtube-transcript-api Diblokir? Mengatasi Ban IP di AWS/GCP

Skrip itu berjalan sempurna di laptop Anda selama berminggu-minggu. Lalu Anda men-deploy-nya — Lambda, kotak EC2, Cloud Run, dyno Heroku, apa pun — dan kini setiap panggilan ke youtube-transcript-api mati dengan pesan seperti:
youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video ...
YouTube is blocking requests from your IP.
Atau versi tembok yang sama dengan rasa browser: "Sign in to confirm you're not a bot." Tidak ada yang berubah di kode Anda. Library-nya tidak rusak. Alamat IP Anda-lah masalahnya.
Mengapa hanya rusak di produksi
youtube-transcript-api bekerja dengan mengambil data caption dengan cara yang sama seperti player YouTube — tanpa API key, hanya request HTTP ke YouTube. YouTube menoleransi ini dari koneksi residensial, itulah sebabnya development lokal terasa baik-baik saja. Tetapi rentang IP AWS, GCP, Azure, dan Heroku adalah pengetahuan publik, dan YouTube menantang secara menyeluruh lalu lintas dari ASN-ASN tersebut. Tidak peduli bahwa Anda hanya membuat tiga request sehari; blokirnya berlaku pada lingkungan jaringan, bukan perilaku Anda. Reboot instance-nya, ambil elastic IP baru, deploy ulang function-nya — Anda mendarat di alamat lain dari pool yang sama-sama diblokir.
Ini layak diresapi karena insting pertama (tambah retry, tambah delay, rotasi user agent) tidak membantu. Sinyal yang dijadikan acuan YouTube adalah dari mana paket-paket itu berasal.
Solusi 1: jalankan residential proxy Anda sendiri
Library-nya mendukung ini secara langsung — ia menyertakan WebshareProxyConfig dan GenericProxyConfig untuk provider mana pun. Rutekan request melalui IP residensial dan blokirnya sebagian besar berhenti. Ini benar-benar berhasil; begitulah cara semua orang yang melakukan scraping YouTube dalam skala besar bertahan.
Namun, perhitungan biaya yang jujur:
- Uang: bandwidth residensial berkisar $3–8/GB tergantung provider, dan provider yang layak menginginkan komitmen bulanan — realistisnya $30–100/bulan sebelum Anda mengambil apa pun. Setiap pengambilan transkrip berukuran kecil (beberapa ratus KB), jadi bandwidth bukan masalahnya; minimum pembelian dan overhead akunlah yang menyakitkan.
- Rekayasa: Anda memiliki tanggung jawab atas rotasi, logika retry-saat-ban, dan monitoring. IP residensial juga kena tantangan, hanya lebih jarang, jadi Anda tetap perlu mendeteksi kegagalan dan mengalihkan rute.
- Perhatian berkelanjutan: YouTube mengubah banyak hal. Setup proxy yang bekerja di bulan Maret butuh perawatan di bulan Juni.
Jika Anda sudah menjalankan infrastruktur proxy untuk scraping lain, menambahkan ini masuk akal. Jika transkrip adalah satu-satunya hal yang Anda butuhkan, Anda mendaftar untuk mengoperasikan armada proxy demi mendukung satu panggilan fungsi.
Solusi 2: panggil endpoint yang sudah memerangi pertempuran ini
youtube2text.org melakukan rotasi residential proxy di sisi server, sehingga cloud function Anda cukup membuat satu request HTTPS membosankan ke API biasa. Migrasinya nyaris hanya find-and-replace.
Sebelum:
from youtube_transcript_api import YouTubeTranscriptApi
transcript = YouTubeTranscriptApi().fetch(video_id)
text = " ".join(snippet.text for snippet in transcript)
Sesudah:
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"]
Untuk mencobanya sebelum membuat akun, ambil demo key bersama — curl -s https://youtube2text.org/api/demo-key — yang mengizinkan 5 video/bulan per IP. Error dikembalikan sebagai JSON terstruktur dengan kode yang layak ditangani: TRANSCRIPT_UNAVAILABLE (404) berarti video benar-benar tidak punya caption — bukan blokir, dan tidak ada proxy yang bisa memperbaikinya; RATE_LIMIT_EXCEEDED (429) menyertakan petunjuk retry. Ada panduan Python yang lebih lengkap di panduan integrasi Python.
Solusi mana yang tepat untuk Anda
- Tetap di youtube-transcript-api + proxy sendiri jika Anda mengambil ribuan transkrip setiap hari, sudah punya akun proxy, dan punya orang yang bertanggung jawab atas setup-nya. Pada volume itu, harga per GB bisa mengalahkan harga per video.
- Beralih ke endpoint yang di-hosting jika transkrip adalah sebuah fitur, bukan produk Anda. Satu panggilan HTTP, JSON keluar, dan masalah pemblokiran menjadi tanggung jawab orang lain.
- Keduanya tidak memperbaiki caption yang hilang. Untuk video yang mengembalikan
TRANSCRIPT_UNAVAILABLE, fallback-nya adalah speech-to-text — lihat Whisper vs caption YouTube untuk kapan itu sepadan biayanya. Dan jika Anda hendak mencoba yt-dlp sebagai gantinya, ketahuilah bahwa ia menabrak pemblokiran IP yang sama dari alamat datacenter.
Key milik Anda sendiri (terpisah dari kuota demo bersama) hanya butuh login Google di youtube2text.org/app/keys — paket gratis 5 video/bulan, paket berbayar dari $5,99/bulan untuk 50 video hingga $19,99 tanpa batas. Tanpa nomor telepon, tanpa kartu untuk paket gratis.