youtube-transcript-api blockerat? Så fixar du IP-bannlysningar på AWS/GCP

Skriptet gick felfritt på din laptop i veckor. Sedan driftsatte du det — Lambda, en EC2-maskin, Cloud Run, en Heroku-dyno, spelar ingen roll — och varenda anrop till youtube-transcript-api dör nu med något i stil med:
youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video ...
YouTube is blocking requests from your IP.
Eller webbläsarvarianten av samma vägg: "Sign in to confirm you're not a bot." Inget i din kod har ändrats. Biblioteket är inte trasigt. Din IP-adress är problemet.
Varför det bara går sönder i produktion
youtube-transcript-api fungerar genom att hämta undertextdata på samma sätt som YouTube-spelaren gör — ingen API-nyckel, bara HTTP-requests till YouTube. YouTube tolererar det från hemuppkopplingar, vilket är varför lokal utveckling känns problemfri. Men IP-intervallen för AWS, GCP, Azure och Heroku är allmänt kända, och YouTube utmanar generellt all trafik från de ASN:en. Det spelar ingen roll att du gör tre requests om dagen; blockeringen gäller nätverkskvarteret, inte ditt beteende. Starta om instansen, skaffa en ny elastisk IP, driftsätt om funktionen — du hamnar på en annan adress från samma blockerade pool.
Det här är värt att ta till sig, för den första instinkten (lägg till retries, lägg till fördröjningar, rotera user agents) hjälper inte. Signalen YouTube nycklar på är varifrån paketen kommer.
Fix 1: kör egna residential proxies
Biblioteket stöder detta direkt — det levereras med WebshareProxyConfig och en GenericProxyConfig för valfri leverantör. Dirigera requests genom residential-IP:n så upphör blockeringarna för det mesta. Det fungerar på riktigt; det är så alla som scrapar YouTube i skala överlever.
Den ärliga kostnadskalkylen, dock:
- Pengar: residential-bandbredd kostar ungefär 3–8 USD/GB beroende på leverantör, och seriösa leverantörer vill ha månadsåtaganden — realistiskt 30–100 USD/månad innan du hämtat någonting. Varje transkriptionshämtning är liten (några hundra KB), så bandbredden är inte smärtan; minimibeloppen och kontoadministrationen är det.
- Utvecklingsarbete: du äger rotation, retry-vid-ban-logik och övervakning. Residential-IP:n blir också utmanade, bara mer sällan, så du behöver fortfarande upptäcka fel och dirigera om.
- Löpande tillsyn: YouTube ändrar saker. Proxyupplägg som fungerade i mars behöver omsorg i juni.
Om du redan kör proxyinfrastruktur för annan scraping är det rimligt att haka på det här. Om transkriptioner är det enda du behöver skriver du upp dig på att driva en proxyflotta för att stödja ett enda funktionsanrop.
Fix 2: anropa en endpoint som redan utkämpar den här striden
youtube2text.org sköter rotationen av residential proxies på serversidan, så din molnfunktion gör en tråkig HTTPS-request till ett vanligt API. Migreringen är nästan en sök-och-ersätt.
Före:
from youtube_transcript_api import YouTubeTranscriptApi
transcript = YouTubeTranscriptApi().fetch(video_id)
text = " ".join(snippet.text for snippet in transcript)
Efter:
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"]
För att prova innan du skapar konto, hämta den delade demonyckeln — curl -s https://youtube2text.org/api/demo-key — som tillåter 5 videor/månad per IP. Fel returneras som strukturerad JSON med koder värda att hantera: TRANSCRIPT_UNAVAILABLE (404) betyder att videon verkligen saknar undertexter — ingen blockering, och ingen proxy löser det; RATE_LIMIT_EXCEEDED (429) innehåller en retry-ledtråd. En mer komplett Python-genomgång finns i Python-integrationsguiden.
Vilken fix är rätt för dig
- Stanna på youtube-transcript-api + egna proxies om du hämtar tusentals transkriptioner dagligen, redan har proxykonton och har någon som äger upplägget. Vid den volymen kan per-GB-prissättning slå per-video-prissättning.
- Byt till en hostad endpoint om transkriptioner är en funktion, inte din produkt. Ett HTTP-anrop, JSON ut, och blockeringsproblemet är någon annans jour.
- Ingetdera löser saknade undertexter. För videor som returnerar
TRANSCRIPT_UNAVAILABLEär fallbacken tal-till-text — se Whisper eller YouTubes undertexter för när det är värt kostnaden. Och om du var på väg att prova yt-dlp i stället, var medveten om att det drabbas av samma IP-blockering från datacenteradresser.
En egen nyckel (skild från den delade demokvoten) kräver en Google-inloggning på youtube2text.org/app/keys — gratisnivån är 5 videor/månad, betalplaner från 5,99 USD/månad för 50 videor upp till 19,99 USD obegränsat. Inget telefonnummer, inget kort för gratisnivån.