YouTube Transcript API Pythonissa: 10 riviä requestsilla

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video.
YouTube is blocking requests from your IP.
Jos tämä jäljitys toi sinut tänne, tervetuloa. Se on suositun pip-paketin tavallinen viaantumistila siinä hetkessä, kun koodisi poistuu kannettavaltasi ja laskeutuu AWS:lle, GCP:lle tai mihinkään muuhun datakeskukseen. Tämä viesti näyttää muun reitin: isännöidyn YouTube-transkription API:n, jonka kutsut Pythonista mitään muuta kuin requests kanssa. Loppuun mennessä sinulla on kymmenen rivin skripti, joka muuttaa minkä tahansa YouTube URL:n transkription tekstiksi, sekä oikeat haarat nopeusrajoituksille ja videoille ilman kuvatekstejä.
Miksi pip-kirjasto kuolee tuotannossa
youtube-transcript-api kaavitsee YouTubea suoraan mistä tahansa koneesta, joka ajaa sitä. Paikallisesti se on kunnossa. Ota se käyttöön ja YouTuben botti-havaitseminen merkitsee pilvityöntekijän IP-alueen päivissä, joskus minuuteissa. Kirjoitin yksityiskohtaiset tiedot kohdassa miksi YouTube-transkription API päätetään — lyhyt versio: päädyt vuokraamaan asuntojen välityspalvelimia lukemaan julkisia kuvatekstejä, mikä on absurdia.
youtube2text.org tekee YouTube-suuntaisen osan palvelinpuolella. Koodisi tekee yhden HTTPS-kutsun ja saa JSON:n takaisin.
Kymmenen riviä
Tiliä ei tarvita kokeilla sitä — on demonäppäin päätepiste:
import requests
API = "https://youtube2text.org/api/transcribe"
KEY = requests.get("https://youtube2text.org/api/demo-key").json()["apiKey"]
resp = requests.get(API, params={"url": "https://youtu.be/dQw4w9WgXcQ"},
headers={"x-api-key": KEY}, timeout=60)
resp.raise_for_status()
result = resp.json()["result"]
print(result["title"])
print(result["content"][:300])
url-parametri hyväksyy minkä tahansa YouTube URL -muodon — watch?v=, youtu.be, shorts, embeds — tai paljaita 11-merkkisiä video-tunnisteita. Vastaus antaa sinulle videoId, title, pubDate, content, contentSize ja truncated -lipun.
Yksi varoitus demonäppäimestä: se on jaettu kaikkien kesken ja rajoitettu 5 videoon kuukaudessa per IP. Kunnossa renkaiden potkimista varten, hyödytöntä kenen tahansa oikean asian kannalta.
Käsitteleminen 429 ja 404 kuten aikuinen
raise_for_status() on kunnossa demossa, mutta virheet tulevat takaisin strukturoiduksi JSON:ksi code-arvolla, jonka kanssa voit haaroutua:
import time
resp = requests.get(API, params={"url": video_url},
headers={"x-api-key": KEY}, timeout=60)
body = resp.json()
if resp.status_code == 200:
transcript = body["result"]["content"]
elif resp.status_code == 429:
time.sleep(body["error"]["retryAfterSeconds"]) # then retry
elif resp.status_code == 404:
if body["error"]["code"] == "TRANSCRIPT_UNAVAILABLE":
transcript = None # video exists, but has no captions — skip it
else:
raise ValueError(f"No such video: {video_url}") # VIDEO_NOT_FOUND
else:
raise RuntimeError(body["error"]["message"])
TRANSCRIPT_UNAVAILABLE ansaitsee hetken rehellisyyttä: transkriptiot tulevat YouTuben kuvateksti-raiteista (manuaalisesti tai automaattisesti luodut), ja jotkut videot yksinkertaisesti eivät ole sellaisia. Mikään API ei voi konjuroida tekstiä, joka ei ole olemassa — niille tarvitsisit varsinaista puheesta tekstiin -muunnosta, jonka vertasin kohdassa Whisper vs YouTube-kuvatekstit. Uudelleen yrittäminen ei auta, joten älä.
maxChars ja LLM-tunnisteen budjetit
Jos transkriptio on menossa kehötteeseen, välität koosta. Kolmetuntinen podcast-transkriptio syö mielellään 100k tunnistetta. maxChars-parametri kattaa tuotoksen — oletusarvo ja maksimi ovat molemmat 150000:
resp = requests.get(API,
params={"url": video_url, "maxChars": 20000},
headers={"x-api-key": KEY}, timeout=60)
Karkealla 4-merkki-tunniste-säännöllä maxChars=20000 laskeutuu noin 5k tunnistetta. Tarkista result["truncated"] tietääksesi, oletko saanut kokonaisen asian. Jos olet johtamassa tätä hakuputkeen yhden kehotteen sijaan, LangChain-integrointiviesti kattaa chunkkien oikein.
Pois demonäppäimestä
Kun 5 jaettua videota kuukaudessa lakkaa olemasta riittävä, kirjaudu Googlella osoitteessa youtube2text.org/app/keys ja luo oma avain — ei puhelinnumeroa, ei luottokorttia. Ilmainen taso on 5 videota kuukaudessa per avain; maksulliset tasot alkavat 5,99 dollarista 50 videolle. Edellä mainitut kymmenen riviä eivät muutu, vain otsikon merkkijono muuttuu.