HomeBlogTranscribePlansAPI Keys

YouTube Transcript API Pythonissa: 10 riviä requestsilla

Python-skripti, joka hakee YouTube-transkription JSON:na requests-kirjastolla

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.