Zurück zum Blog
Anleitungen
Raluca PenciucLast updated on May 8, 202617 min read

Wie man YouTube mit Python im Jahr 2026 scrapen kann

Wie man YouTube mit Python im Jahr 2026 scrapen kann
Kurz gesagt: Dies ist eine Anleitung aus dem Jahr 2026, wie man YouTube mit Python scrapt. Du wählst die richtige Methode (Data API v3, yt-dlp, versteckte /youtubei/v1/ Endpunkte oder einen verwalteten Scraper) mithilfe einer Entscheidungsmatrix aus und führen dann Code für Videometadaten, Kommentare, Kanäle, Suche, Shorts und Transkripte aus, mit einem Abschnitt zur Produktion über Proxys, Header und 429-Backoff, damit du nicht blockiert wirst.

Einleitung

Wenn du schon einmal mitten in einem Recherchelauf an die Quotengrenze der YouTube Data API v3 gestoßen bist, weißt du bereits, warum Entwickler lernen, YouTube direkt zu scrapen. Die offizielle API ist übersichtlich und gut dokumentiert, aber ihr Tagesbudget von 10.000 Einheiten ist schnell aufgebraucht, sobald du search.list oder tiefe Kommentar-Threads abrufen. Das Web-Scraping von YouTube schließt diese Lücke, und die Daten sind viel umfangreicher als das, was die API bereitstellt: vollständige Kommentar-Bäume, Transkripte, Tags, Like-Zahlen, Shorts und Kanal-Videokataloge.

Dieser Leitfaden richtet sich an Python-Entwickler, Dateningenieure, Wachstums- und SEO-Analysten sowie KI-/ML-Praktiker, die große Mengen an YouTube-Daten für Analysen, RAG-Pipelines oder Wettbewerbsanalysen benötigen. Wir beginnen mit einem Schnellstart ohne API-Schlüssel und gehen über zu produktionsreifen Abrufen mit yt-dlp, versteckten /youtubei/v1/ Endpunkten und einer verwalteten Scraping-API. Jeder Abschnitt enthält lauffähigen Python-Code, und die Beispiele setzen Python 3.11 oder neuer voraus.

Am Ende verfügen Sie über eine übersichtliche Matrix zur Methodenauswahl, funktionierenden Code für die sieben gängigsten YouTube-Scraping-Aufgaben, eine Anti-Block-Schicht, die realem Datenverkehr standhält, und eine rechtliche Checkliste, die verhindert, dass Ihr Projekt eingestellt wird. Lassen Sie uns loslegen.

Warum sich das Scraping von YouTube im Jahr 2026 lohnt

YouTube ist die zweitgrößte Suchmaschine der Welt und das größte Archiv für Langform-Videokommentare in jeder Sprache. Das macht es zu einer Goldgrube für drei Aufgaben, für deren Bearbeitung in großem Maßstab die offizielle Data-API nie konzipiert wurde.

Analysen zu Content-Erstellern und Wettbewerbern. Das Abrufen der gesamten Upload-Historie eines Wettbewerbers mit Aufrufzahlen, Dauer, Tags und Veröffentlichungsrhythmus zeigt, welche Formate tatsächlich funktionieren – und nicht nur, welche der YouTube-Algorithmus heute anzeigt.

Stimmungsanalyse des Publikums und Produktforschung. Kommentarthreads unter Produktbewertungen, Tutorials und Unboxing-Videos gehören zu den ehrlichsten nutzergenerierten Texten im offenen Web. Auf YouTube-Kommentaren trainierte Stimmungsmodelle lassen sich gut verallgemeinern, da die Texte umgangssprachlich und meinungsstark sind.

SEO-, Trend- und RAG-Eingaben. Transkripte plus Titel plus Top-Kommentare liefern Ihnen sauberen Text, den eine Retrieval-Augmented-Generation-Pipeline in Chunks aufteilen und einbetten kann, ohne die Videodatei selbst zu scrapen. Das ist der Anwendungsfall, der die meisten Teams dazu veranlasst hat, sich überhaupt erst mit dem programmatischen Scraping von YouTube zu befassen, anstatt die Data API zu nutzen.

Unabhängig vom Ziel sollten Sie diesen Artikel als methodenweises Handbuch betrachten und nicht als Tutorial für ein einzelnes Tool. Unterschiedliche Aufgaben erfordern unterschiedliche Werkzeuge.

So scrapen Sie YouTube: Wählen Sie die richtige Methode, bevor Sie Code schreiben

Es gibt heute vier realistische Möglichkeiten, um zu lernen, wie man YouTube in Python scrapt, und die falsche Wahl verschwendet Ihr Kontingent, führt zu einer Sperrung oder liefert einfach nicht das gewünschte Ergebnis. Erst die Methode auswählen, dann programmieren.

Methode

Kontingent-/Kostenmodell

Datenreichhaltigkeit

Anti-Bot-Risiko

Am besten geeignet

YouTube Data API v3

Feste tägliche Quote (Standard 10.000 Einheiten, siehe Google Docs)

Strukturiert, aber eingeschränkt: keine Kommentarthreads, begrenzte Statistiken

Keine (offiziell)

Einmalig, strukturiert, geringes Volumen

yt-dlp

Keine Quote, selbstdrosselnd

Sehr umfangreich: über 100 Felder, Kommentare, Abonnements, Formate

Mittel (durch YouTube-Cookies signiert)

Tiefgreifende Datenextraktion und Transkripte pro Video

Versteckte /youtubei/v1/ Endpunkte

Keine Kontingentierung

Gleiche JSON-Datei, die das YouTube-Frontend verwendet

Hoch bei großem Umfang (erfordert Proxys + Header)

Suche, Kanal-Paginierung, tiefliegende Kommentare

Verwaltete Scraping-API

Pro erfolgreicher Anfrage

Was auch immer die Seite zurückgibt, vollständig gerendert

Vom Anbieter abgewickelt

Produktionsmaßstab, Anti-Bot-Handhabung

Zwei Muster ziehen sich durch die letzten drei Zeilen: das Extrahieren von in Script-Tags eingebettetem JSON (ytInitialPlayerResponse, ytInitialData) und das Nachbilden der internen XHR-Aufrufe, die die YouTube-SPA auslöst. Beide liefern strukturierte Daten, ohne einen Headless-Browser zu starten, wodurch die Anfragen schnell und kostengünstig bleiben. Greifen Sie nur dann auf einen echten Browser zurück, wenn Sie sich anmelden oder ein UI-gesteuertes Ereignis auslösen müssen.

Wenn Sie sich vor dem Schreiben des Codes immer noch fragen, welches Sie wählen sollen, geben die nächsten beiden Unterabschnitte den Ausschlag.

Wann die YouTube Data API v3 ausreicht

Die Data API v3 ist die sicherste Wahl für saubere, strukturierte Daten bei geringem Volumen. Sie liefert kanonische IDs, offizielle Statistiken und stabile Schemata, und du hältst dich von vornherein an die Nutzungsbedingungen von YouTube.

Der Haken liegt in der Einheitenrechnung. Laut der Dokumentation zur YouTube Data API beginnt jedes Projekt mit einem standardmäßigen Tageskontingent (derzeit etwa 10.000 Einheiten, aber überprüfen Sie dies in der Google Cloud Console, da Google diesen Wert anpasst). Ein videos.list Aufruf kostet etwa 1 Einheit, während ein search.list Aufruf etwa 100 Einheiten kostet, sodass eine einzige Deep-Search-Sitzung das Budget eines ganzen Tages innerhalb von Minuten aufbrauchen kann. Überprüfen Sie die genauen Einheitskosten anhand der offiziellen Dokumentation, bevor Sie sich für eine reine API-Nutzung entscheiden.

Verwenden Sie die API, wenn Sie täglich einige Tausend Videodatensätze mit stabilen Feldern und ohne Anti-Bot-Risiko benötigen. Alles, was darüber hinausgeht, sollten Sie per Web-Scraping erfassen.

Wann Sie auf Web-Scraping umsteigen sollten

Wechseln Sie zu Web-Scraping, sobald einer der folgenden Punkte zutrifft:

  • Sie benötigen Metadaten in großem Umfang für Tausende von Videos pro Tag.
  • Sie benötigen vollständige Kommentar-Threads mit Antworten, Sortierreihenfolge oder dem Kanalnamen des Kommentarautors.
  • Sie benötigen Transkripte oder automatisch generierte Untertitel auf programmierte Weise.
  • Sie benötigen YouTube Shorts, die sauber aus den Suchergebnissen herausgefiltert wurden.
  • Sie benötigen Kanal-Videokataloge, die tiefer gehen, als es die paginierte Antwort der API zulässt.
  • Sie benötigen jedes Feld, das von der API einfach nicht bereitgestellt wird (zum Beispiel Tags bei den meisten Videos).

Die Entscheidungsmatrix auf dieser Seite ist bewusst die erste Anlaufstelle für alle, die 2026 lernen möchten, wie man YouTube scrapt, denn die Wahl des falschen Tools ist der teuerste Fehler, den man auf dieser Plattform machen kann.

Voraussetzungen und Projekteinrichtung

Bevor Sie den unten stehenden Code zum Web-Scraping von YouTube ausführen, richten Sie ein sauberes Python 3.11+-Projekt ein, damit es nicht zu Konflikten mit Ihren anderen Tools kommt.

mkdir youtube-scraper && cd youtube-scraper
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install --upgrade yt-dlp requests beautifulsoup4 parsel \
            jsonpath-ng youtube-transcript-api

Diese einzelne Installation deckt alles in diesem Leitfaden ab:

  • yt-dlp für Videometadaten, Kommentare und Untertitel.
  • requests + BeautifulSoup4 für HTML-Seiten und den <script> Tag-Trick.
  • parsel für CSS/XPath, wenn BeautifulSoup zu ausführlich erscheint.
  • jsonpath-ng zum Durchlaufen tief verschachtelter /youtubei/v1/ Antworten.
  • youtube-transcript-api als Abkürzung für Transkripte mit einem einzigen Aufruf.

Zwei Begriffe, die dir immer wieder begegnen werden. Hidden Data Scraping extrahiert einen JSON-Blob aus einem <script> Tag im HTML-Code der Seite; auf YouTube ist das klassische Beispiel ytInitialPlayerResponse. Hidden API Scraping repliziert die internen XHR-/Fetch-Aufrufe, die die YouTube-Single-Page-App tätigt, und greift /youtubei/v1/ Endpunkte direkt an, um strukturiertes JSON zu erhalten. Beide vermeiden das gerenderte DOM, was Scraper schneller und weniger anfällig macht als das Parsen des visuellen Layouts. Mit diesen Konzepten im Hinterkopf ist der Schnellstart ohne API-Schlüssel nur noch wenige Zeilen entfernt.

Schnellstart: Titel, Aufrufe und Kanal ohne API-Schlüssel abrufen

Der schnellste Weg zum Erfolg beim YouTube-Webscraping ohne API-Schlüssel besteht darin, eine Wiedergabeseite abzurufen, das eingebettete ytInitialPlayerResponse JSON zu extrahieren und daraus alles zu lesen, was man benötigt. Kein API-Projekt, kein OAuth, kein Headless-Browser.

import json, re, requests

VIDEO_URL = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/124.0 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
}

html = requests.get(VIDEO_URL, headers=HEADERS, timeout=15).text
match = re.search(r'ytInitialPlayerResponse\s*=\s*(\{.+?\})\s*;', html)
data = json.loads(match.group(1))

details = data['videoDetails']
print(details['title'])
print(details['author'])
print(details['viewCount'])
print(details['lengthSeconds'])

Dieser Codeausschnitt macht etwa 90 % dessen aus, weswegen die meisten Leser hierhergekommen sind: eine funktionierende Antwort darauf, wie man YouTube-Videometadaten ohne API-Schlüssel scrapt. Der Regex zielt auf die Zuweisungszeile ab, die YouTube seit Jahren verwendet, aber betrachten Sie sie als bewegliches Ziel. Wenn eine Anfrage leer zurückkehrt oder der Regex fehlschlägt, hat YouTube Sie wahrscheinlich mit einer Consent-Cookie-Weiterleitung belegt (mehr dazu später) oder das umgebende Markup des Script-Tags angepasst. Wir verbessern dies im Abschnitt zur Blockierungsabwehr.

Vollständige Videometadaten mit yt-dlp scrapen

ytInitialPlayerResponse eignet sich hervorragend für einige Felder. Für den Long Tail (Formate, Likes, Upload-Datum, alle Tags, automatische Untertitel, Kapitelverzeichnis) greifen Sie auf yt-dlp zurück. Es handelt sich um einen von der Community gepflegten Fork von youtube-dl mit einem breiteren Funktionsumfang und aktiven Updates; konsultiere das yt-dlp-GitHub-Repository für die aktuellen Optionsflags und die Feldoberfläche, bevor du dich auf einen bestimmten Feldnamen verlässt.

yt-dlp's extract_info(download=False) gibt ein flaches Python-Dictionary mit einer großen Anzahl von Feldern zurück, die Titel, Aufruf- und Likes-Zahlen, Upload-Datum, Tags, Thumbnails und alle verfügbaren Medienformate abdecken. Die genaue Anzahl der Felder variiert von Release zu Release, also lege deine Erwartungen nicht fest.

import json
import yt_dlp

VIDEO_URL = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'

ydl_opts = {
    'quiet': True,
    'skip_download': True,
    # 'cookiesfrombrowser': ('chrome',),  # for age-gated content
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(VIDEO_URL, download=False)

keys_we_care_about = (
    'id', 'title', 'channel', 'channel_id', 'upload_date',
    'duration', 'view_count', 'like_count', 'tags',
    'categories', 'description',
)
flat = {k: info.get(k) for k in keys_we_care_about}
print(json.dumps(flat, indent=2, ensure_ascii=False))

Zwei Flags, auf die Sie häufig zurückgreifen werden:

  • 'cookiesfrombrowser': ('chrome',) Lässt yt-dlp Ihre Browsersitzung für altersbeschränkte, regional gesperrte oder nur für Mitglieder zugängliche Videos wiederverwenden.
  • 'extract_flat': 'in_playlist' überspringt Metadatenabfragen pro Video, wenn du nur die Video-IDs der Wiedergabeliste benötigst.

Um das Ergebnis zu speichern, exportiere das Wörterbuch in JSON Lines (ein Datensatz pro Zeile), damit du neue Videos anhängen kannst, ohne die Datei neu schreiben zu müssen:

with open('videos.jsonl', 'a', encoding='utf-8') as f:
    f.write(json.dumps(flat, ensure_ascii=False) + '\n')

yt-dlp drosselt sich selbst und bewältigt viele Sonderfälle (Live-Streams, Premieren, nur für Mitglieder) ohne zusätzlichen Code. Deshalb ist es das Standardwerkzeug, wenn Teams fragen, wie man YouTube-Videodaten programmgesteuert scrapt, ohne einen vollständigen Anti-Bot-Stack aufzubauen.

YouTube-Kommentare in großem Umfang extrahieren

Kommentare sind der häufigste Grund, warum Teams an die Grenzen der Data API stoßen. Der commentThreads Endpunkt ist quotenintensiv und liefert nur wenige Antworten, während yt-dlp eine konfigurierbare Tiefe in einem einzigen Aufruf abruft. Hier scrape YouTube comments Python es erst richtig losgeht.

import yt_dlp

VIDEO_URL = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'

ydl_opts = {
    'quiet': True,
    'skip_download': True,
    'getcomments': True,
    'extractor_args': {
        'youtube': {
            'comment_sort': ['top'],   # or 'new'
            'max_comments': ['200', '50', '10', '0'],  # total, per-thread, replies-per-thread, child-replies
        }
    },
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(VIDEO_URL, download=False)

for c in info.get('comments', [])[:5]:
    print(c['author'], '|', c['text'][:120])

Drei Dinge, die man über diese Antwort wissen sollte:

  • Die Liste ist flach. Antworten erscheinen mit einem parent Feld, das auf die ID des Stammkommentars verweist; rekonstruiere Threads daher in der Nachbearbeitung.
  • Die Sortierreihenfolge erfolgt nach bestem Bemühen. comment_sort fordert dies nur an; YouTube liefert das, was es zwischengespeichert hat.
  • Für eine tiefe Paginierung, die über das hinausgeht, was max_comments zuverlässig zurückgibt, wechseln Sie zum /youtubei/v1/next Endpunkt mit dem commentContinuationToken aus der Wiedergabeseite extrahiert wurde. Du sendest das Token, erhältst eine neue Fortsetzung und wiederholst dies, bis die Antwort keine mehr zurückgibt.

Dieser Ansatz mit versteckter API ist aufwändiger zu warten, da YouTube die Form der Antwort regelmäßig ändert, aber es ist der einzige Weg, um die Gesamtzahl der Kommentare bei viralen Videos zu ermitteln. Planen Sie ein, dies in eine 429-fähige Wiederholungsschicht (wird später behandelt) einzubinden, bevor Sie den Vorgang unbeaufsichtigt laufen lassen.

YouTube-Kanalseiten und hochgeladene Videos scrapen

Unter „Channel-Scraping“ fallen zwei Aufgaben: das Abrufen der Profilfelder des Kanals (Name, Beschreibung, Links, Land, Abonnentenzahl, sofern öffentlich) und das Durchlaufen des Video-Tabs von Anfang bis Ende.

Methode 1: Analysieren Sie den „Über“-Bereich des Kanals. Da es sich um HTML handelt, reicht ein requests + BeautifulSoup-Durchlauf /@channelhandle/about liefert dir die Grundlagen. Die wenigen Felder, die YouTube hinter einem JS-gesteuerten Dialog versteckt (Links, geschäftliche E-Mail-Adresse), sind weiterhin in demselben ytInitialData Skript-Blob, den Sie für den Schnellstart verwendet haben.

import json, re, requests
from bs4 import BeautifulSoup

URL = 'https://www.youtube.com/@GoogleDevelopers/about'
html = requests.get(URL, headers={'Accept-Language': 'en-US,en;q=0.9'}).text

soup = BeautifulSoup(html, 'html.parser')
title_tag = soup.find('meta', attrs={'name': 'title'})
channel_title = title_tag['content'] if title_tag else None

init = re.search(r'var ytInitialData\s*=\s*(\{.+?\});', html).group(1)
data = json.loads(init)
# data now contains description, links, subscriberCountText, etc., nested under 'header' / 'metadata'

Methode 2: Durchsuchen Sie den Reiter „Videos“ /youtubei/v1/browse. Der erste Stapel an Videos kommt in ytInitialData, aber alles, was danach kommt, wird über Fortsetzungstoken übermittelt. Holen Sie sich das erste Token aus dem ursprünglichen Blob und senden Sie es dann an die versteckte API zurück, um die nächste Seite zu erhalten.

import requests

YT_API = 'https://www.youtube.com/youtubei/v1/browse'
CLIENT = {'clientName': 'WEB', 'clientVersion': '2.20240101.00.00'}

def fetch_videos_page(continuation_token: str) -> dict:
    payload = {
        'context': {'client': CLIENT},
        'continuation': continuation_token,
    }
    r = requests.post(YT_API, params={'prettyPrint': 'false'}, json=payload, timeout=20)
    r.raise_for_status()
    return r.json()

def walk(continuation_token: str, max_pages: int = 5):
    for _ in range(max_pages):
        data = fetch_videos_page(continuation_token)
        # videos under: onResponseReceivedActions[*].appendContinuationItemsAction.continuationItems[*]
        yield data
        next_tokens = [
            item['continuationItemRenderer']['continuationEndpoint']['continuationCommand']['token']
            for action in data.get('onResponseReceivedActions', [])
            for item in action.get('appendContinuationItemsAction', {}).get('continuationItems', [])
            if 'continuationItemRenderer' in item
        ]
        if not next_tokens:
            return
        continuation_token = next_tokens[0]

Dieses Fortsetzungsmuster wird auch bei Suchergebnissen und Kommentaren verwendet, es lohnt sich also, sich einmal damit vertraut zu machen. Verwenden Sie jsonpath-ng oder jmespath , um die Pfadausdrücke lesbar zu halten, anstatt .get() . Führen Sie bei tiefgehenden historischen Abrufen die Schleife hinter einem Proxy-Pool aus, da /youtubei/v1/browse schnell von einer IP-Adresse aus ist der schnellste Weg, den Ratenbegrenzer von YouTube auszulösen.

YouTube-Suchergebnisse scrapen

Die YouTube-Suche ist der schwierigste Bereich, um langfristig funktionsfähig zu bleiben, da sich das SERP-Layout ändert und die API einen neuen clientVersion Header. Repliziere den privaten XHR, den du in DevTools sehen kannst (Registerkarte „Netzwerk“, filtere nach youtubei) und Sie haben einen stabilen Scraper.

import requests
from jsonpath_ng.ext import parse

YT_SEARCH = 'https://www.youtube.com/youtubei/v1/search'
CONTEXT = {'client': {'clientName': 'WEB', 'clientVersion': '2.20240101.00.00'}}

def search_youtube(query: str) -> list[dict]:
    payload = {'context': CONTEXT, 'query': query}
    r = requests.post(YT_SEARCH, json=payload, timeout=20)
    r.raise_for_status()
    data = r.json()

    expr = parse('$..videoRenderer')
    results = []
    for m in expr.find(data):
        v = m.value
        results.append({
            'id': v.get('videoId'),
            'title': v['title']['runs'][0]['text'],
            'channel': v.get('ownerText', {}).get('runs', [{}])[0].get('text'),
            'views_text': v.get('viewCountText', {}).get('simpleText'),
        })
    return results

for hit in search_youtube('python web scraping')[:5]:
    print(hit)

Ein paar Hinweise zur Produktion, die dir Debugging-Zeit sparen:

  • Die clientVersion Wert driftet. Rufe gelegentlich einen neuen von https://www.youtube.com/sw.js_data ab oder indem du eine beliebige Watch-Seite inspizierst; das Festhalten an einer veralteten Version führt schließlich zu leeren Payloads.
  • Die Paginierung verwendet dasselbe Fortsetzungstoken-Muster wie Kanalvideos, nur dass es aus der Suchantwort selbst stammt.
  • videoRenderer ist der häufigste Ergebnistyp, aber die Suche gibt auch channelRenderer, playlistRenderersowie reelItemRenderer (Shorts), filtern Sie also explizit nach der gewünschten Oberfläche.

Wenn du ein langfristig betriebenes Tool unterhältst, das lernt, wie man YouTube-Suchergebnisse in der Produktion scrapt, solltest du damit rechnen, die JSON-Parsing-Logik alle paar Monate zu aktualisieren. Die Endpunkt-Struktur ist stabil genug, um sich darauf zu verlassen, aber Feldnamen innerhalb der Renderer ändern sich.

YouTube Shorts scrapen

YouTube Shorts verwenden eine andere Player-Oberfläche als reguläre Videos, aber die Metadaten-Pipeline ist identisch. Jedes Short hat weiterhin eine Wiedergabe-URL der Form https://www.youtube.com/shorts/<videoId> , die serverseitig zu einer regulären Wiedergabeseite auflöst, und die Seite bettet weiterhin ytInitialPlayerResponse. Das bedeutet, dass alles aus dem Schnellstart-Abschnitt ohne Codeänderungen bei Shorts funktioniert.

import json, re, requests
URL = 'https://www.youtube.com/shorts/<videoId>'
html = requests.get(URL, headers={'Accept-Language': 'en-US'}).text
data = json.loads(re.search(r'ytInitialPlayerResponse\s*=\s*(\{.+?\})\s*;', html).group(1))
print(data['videoDetails']['title'], data['videoDetails']['viewCount'])

Um Shorts in den Suchergebnissen herauszufiltern, filtern Sie nach dem reelItemRenderer (oder shortsLockupViewModel bei neueren Antworten) anstelle von videoRenderer beim Durchlaufen des JSON. Um die Shorts eines Creators aufzulisten, klicke auf den /shorts Registerkarte des Kanals durch dieselbe /youtubei/v1/browse Wiederholungsschleife, die du für die Registerkarte mit den regulären Videos verwendet hast, nur mit der browseId der Shorts des Kanals. Das deckt den Großteil dessen ab, was Leute meinen, wenn sie fragen, wie man YouTube-Shorts in großem Maßstab ohne einen benutzerdefinierten Emulator für mobile Apps scrapt.

YouTube-Transkripte und Untertitel abrufen

Transkripte sind die wertvollsten Textdaten auf der Plattform und am schwierigsten zu scrapen. Es gibt zwei praktische Vorgehensweisen.

Möglichkeit A: yt-dlp mit writesubtitles und writeautomaticsub. Dies ist der zuverlässigste Weg, da yt-dlp die signierte json3 URL für Sie generiert. YouTube stellt Transkripte nicht mehr zuverlässig über eine einfache api/timedtext?lang=en&v=ID URL ohne signierte Parameter bereit, daher ist die Generierung der URL über einen Extractor der empfohlene Ansatz. Überprüfen Sie anhand der aktuellen yt-dlp-Quelle, ob sich das Verhalten ändert.

import yt_dlp, requests

VIDEO_URL = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
ydl_opts = {
    'quiet': True,
    'skip_download': True,
    'writesubtitles': True,
    'writeautomaticsub': True,
    'subtitleslangs': ['en', 'en-US'],
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(VIDEO_URL, download=False)

subs = info.get('subtitles') or info.get('automatic_captions') or {}
for lang, tracks in subs.items():
    json3 = next((t['url'] for t in tracks if t.get('ext') == 'json3'), None)
    if json3:
        captions = requests.get(json3, timeout=20).json()
        text = ' '.join(seg['utf8'] for ev in captions['events']
                        for seg in ev.get('segs', []) if 'utf8' in seg)
        print(lang, text[:200])
        break

Weg B: youtube-transcript-api-Shortcut. Wenn Sie nur den Text und die Zeitstempel benötigen, ist diese Bibliothek die Einzeiler-Lösung:

from youtube_transcript_api import YouTubeTranscriptApi

api = YouTubeTranscriptApi()
fetched = api.fetch('dQw4w9WgXcQ', languages=['en', 'en-US', 'en-GB'])
for snippet in fetched:
    print(f"{snippet.start:7.2f}  {snippet.text}")

Sie gibt eine FetchedTranscriptiterierbares Objekt im -Stil mit zeitgestempelten Schnipseln, dem Sprachcode und einem is_generated Flag, das angibt, ob Untertitel automatisch generiert wurden. Übergeben Sie eine geordnete Liste von Sprachcodes als Fallback. Wenn Sie Transkripte in nennenswertem Umfang abrufen, leiten Sie den zugrunde liegenden HTTP-Verkehr über einen Proxy-Pool, da der Timedtext-Host den Datenverkehr von Cloud-IPs stark drosselt.

Blockierungen vermeiden: Proxys, Header, Ratenbegrenzungen und Wiederholungsversuche

Jede der oben genannten Methoden skaliert, bis YouTube dies bemerkt. Ab einigen hundert Anfragen pro Minute von einer IP-Adresse erhalten Sie leere /youtubei/v1/ Payloads, Weiterleitungen zu consent.youtube.comoder HTTP-429-Fehler. Fünf Vorgehensweisen halten eine YouTube-Web-Scraping-Pipeline in der Produktion am Laufen.

1. Wechsle bei längeren Läufen die privaten IP-Adressen. Rechenzentrums-Proxys funktionieren zwar noch bei requests , werden aber schnell /youtubei/v1/. Ein Pool von über 150 Millionen privaten IPs in 195 Ländern lässt den Datenverkehr wie gewöhnliche Privathaushalte aussehen – das ist der Unterschied zwischen einem Scraper, der eine Woche lang läuft, und einem, der innerhalb einer Stunde blockiert wird. Durch Geo-Targeting können Sie zudem regional gesperrte Metadaten ohne VPN scrapen. (Siehe unseren internen Leitfaden zur Verwendung von Proxys mit dem Python-Modul requests für die technischen Details.)

2. Randomisieren Sie Header. Ein einziger User-Agent über Tausende von Anfragen hinweg ist ein Fingerabdruck. Wechseln Sie User-Agent und Accept-Languageund legen Sie einen sinnvollen Referer (https://www.youtube.com/), damit der Aufruf wie seitenbasiert aussieht.

3. Drosseln und bei 429 zurückfahren. Erkennen Sie Ratenbegrenzungen und pausieren Sie exponentiell:

import time, random, requests

def fetch(url, attempts=5, **kwargs):
    for i in range(attempts):
        r = requests.get(url, timeout=20, **kwargs)
        if r.status_code == 429 or r.status_code >= 500:
            sleep_for = (2 ** i) + random.random()
            time.sleep(sleep_for)
            continue
        r.raise_for_status()
        return r
    raise RuntimeError(f'Gave up after {attempts} attempts')

4. Behandeln Sie die Consent-Cookie-Weiterleitung. Anfragen aus der EU-Region werden oft an consent.youtube.com. Die einfache Lösung besteht darin, bei jedem Aufruf ein CONSENT=YES+cb Cookie bei jedem Aufruf zu senden, das YouTube mitteilt, dass das Einwilligungsbanner bereits geschlossen wurde.

requests.get(url, cookies={'CONSENT': 'YES+cb'}, headers=HEADERS)

5. Verwenden Sie eine verwaltete Scraping-API für die Produktion. Die eigene Proxy- und Wiederholungsschicht ist für ein Nebenprojekt in Ordnung. Für alles, was kundenorientiert ist, übernimmt unsere Scraper-API die Proxy-Rotation, die Randomisierung von Headern, das Rendern von JavaScript und das Lösen von CAPTCHAs hinter einem einzigen Endpunkt, sodass sich Ihr Code auf das Parsen der YouTube-Antwort konzentrieren kann. Sie zahlen nur für erfolgreiche Anfragen, was die Kostenprognose überschaubar macht. Kombinieren Sie die oben genannten Techniken mit einem bewährten Anti-Block-Leitfaden, und die Fehlerquote sinkt von „täglichem Feuerwehreinsatz“ auf „einmal wöchentliches Überprüfen des Dashboards“.

Verwandeln Sie gescrapte YouTube-Daten in LLM-fähige Eingaben

Der Grund, warum die meisten Teams Metadaten, Kommentare und Transkripte zusammenführen, ist die Versorgung eines Sprachmodells. Die oben genannten flachen Wörterbücher lassen sich leicht in eine einzige Markdown-Nutzlast umwandeln, die eine Embedding-Pipeline oder ein Gemini-ähnlicher Summarizer direkt verarbeiten kann.

def to_markdown(meta: dict, transcript: str, top_comments: list[dict]) -> str:
    parts = [
        f"# {meta['title']}",
        f"**Channel:** {meta['channel']}  ",
        f"**Published:** {meta.get('upload_date')}  ",
        f"**Views:** {meta.get('view_count')}  ",
        '',
        '## Description',
        meta.get('description', '').strip(),
        '',
        '## Transcript',
        transcript.strip(),
        '',
        '## Top comments',
    ]
    for c in top_comments[:25]:
        parts.append(f"- **{c['author']}**: {c['text']}")
    return '\n'.join(parts)

Sobald Sie eine Markdown-Datei pro Video haben, machen zwei kleine Anpassungen sie produktionsreif für RAG:

  • Teilen Sie den Text in Kontextfenster auf. Selbst bei Modellen mit langem Kontext sollten Sie Blöcke von 2.000 bis 4.000 Token mit einer Überlappung von 200 Token senden, damit die Abfrage den richtigen Ausschnitt extrahieren kann, ohne den umgebenden Kontext zu verlieren.
  • Betten Sie strukturierte Metadaten neben dem Text ein. Speichern Sie videoId, channelId, publishedAtund Sprache als separate Spalten in Ihrem Vektorspeicher. Das Filtern nach diesen Kriterien zum Zeitpunkt der Abfrage ist kostengünstiger und genauer, als sich allein auf semantische Ähnlichkeit zu verlassen.

Dieses Muster ist der Grund, warum Teams, die bereits wissen, wie man YouTube scrapt, dies tendenziell in dieselbe Pipeline wie ihre Podcast- und Webinar-Erfassung integrieren: Das Ausgabeschema stimmt überein, und derselbe Chunker/Embedder lässt sich sauber über alle Quellen hinweg wiederverwenden.

Rechtliche und ethische Grenzen beim YouTube-Scraping

Nichts in diesem Leitfaden stellt eine Rechtsberatung dar; betrachten Sie ihn als Checkliste für Entwickler und konsultieren Sie einen Rechtsbeistand vor jeder kommerziellen Nutzung. Vor diesem Hintergrund sind vier Grenzen zu beachten, wenn Sie YouTube scrapen.

Nutzungsbedingungen. Die Nutzungsbedingungen von YouTube schränken den automatisierten Zugriff auf eine Weise ein, die sich regelmäßig ändert; lesen Sie die aktuellen YouTube-Nutzungsbedingungen direkt durch, anstatt sich auf Zusammenfassungen von Dritten zu verlassen. Ein Verstoß gegen diese Bedingungen kann zur IP-Sperrung, zur Sperrung des Kontos oder zu rechtlichen Schritten gegen den Betreiber führen.

Urheberrecht. Videodateien, Miniaturansichten und Metadaten der ursprünglichen Urheber sind in den meisten Rechtsordnungen urheberrechtlich geschützt. Das Speichern oder Weiterverbreiten dieser Inhalte über Fair-Use-, Forschungs- oder transformative Anwendungsfälle hinaus ohne Genehmigung kann eine Rechtsverletzung darstellen. Das Verlinken und die analytische Nutzung öffentlicher Metadaten sind wesentlich sicherer.

Datenschutzrecht. Kommentare und Kanalnamen gelten oft als personenbezogene Daten. Der Text der EU-DSGVO legt Anforderungen hinsichtlich der Rechtsgrundlage, der Datenminimierung und der Aufbewahrungsfristen fest; der kalifornische CCPA erlegt einer anderen Gruppe von Akteuren parallele Pflichten auf. Wenn Sie Kommentare von Nutzern aus der EU oder Kalifornien sammeln, dokumentieren Sie eine Rechtsgrundlage, minimieren Sie die gespeicherten Daten und bieten Sie eine Möglichkeit zur Löschung an.

Verhaltensregeln. Respektieren Sie robots.txt auch dort, wo sie nicht streng bindend ist, drosseln Sie aggressiv, wenn Sie 429-Fehler feststellen, identifizieren Sie Ihren Scraper in einem eindeutig zuordenbaren User-Agent für First-Party-Anfragen und hören Sie sofort auf, sobald Sie einen schriftlichen Einwand eines Urhebers oder von YouTube selbst erhalten.

Wichtige Erkenntnisse

  • Wählen Sie zuerst die Methode. Die Data API v3 eignet sich gut für strukturierte Abfragen mit geringem Volumen; alles andere (Kommentare, Transkripte, Shorts, Deep Search) gehört in eine Scraping-Pipeline.
  • Der ytInitialPlayerResponse Regex-Trick ist der schnellste Weg ohne API-Schlüssel zu Titel, Aufrufzahl, Kanal und Länge und funktioniert sowohl bei regulären Videos als auch bei Shorts.
  • yt-dlp ist das Standardwerkzeug für Videometadaten, Kommentare und Transkripte, da es sich selbst drosselt und über eine Verarbeitung signierter URLs für Untertitel verfügt.
  • Versteckte /youtubei/v1/ Endpunkte erschließen Suchergebnisse, die Paginierung von Kanalvideos über Fortsetzungstoken und tiefe Kommentar-Threads, benötigen jedoch einen Proxy-Pool und eine 429-fähige Wiederholungsschicht, um stabil zu bleiben.
  • Behandeln Sie Anti-Bot-Abwehr, die Einhaltung der Nutzungsbedingungen sowie die Einhaltung von DSGVO/CCPA als Produktionsanforderungen und nicht als nachträgliche Überlegungen.

FAQ

Öffentliche YouTube-Metadaten können in der Regel für Analyse- und Forschungszwecke gesammelt werden, doch dies kann dennoch gegen die Nutzungsbedingungen von YouTube verstoßen, die den automatisierten Zugriff auf eine Weise einschränken, die sich regelmäßig ändert. An Videos und Miniaturansichten sind weiterhin Urheberrechte gebunden, und personenbezogene Daten in Kommentaren lösen Verpflichtungen gemäß DSGVO oder CCPA aus. Prüfen Sie die aktuellen Nutzungsbedingungen, dokumentieren Sie eine Rechtsgrundlage und konsultieren Sie einen Rechtsbeistand vor jeder kommerziellen Nutzung.

Wie kann ich YouTube-Kommentare scrapen, ohne das Kontingent der YouTube Data API zu überschreiten?

Verzichten Sie ganz auf die Data API. Die getcomments=True Option ruft Thread-Text, Autoren, Like-Zahlen und übergeordnete IDs in einem einzigen Aufruf ohne Kontingent und ohne API-Schlüssel ab. Für tiefere Threads zu viralen Videos replizieren Sie den /youtubei/v1/next XHR mit der commentContinuationToken von der Wiedergabeseite und paginieren Sie, bis die Antwort keine neue Fortsetzung mehr zurückgibt.

Was ist der einfachste Weg, das Transkript eines YouTube-Videos in Python herunterzuladen?

Installieren youtube-transcript-api und rufen Sie YouTubeTranscriptApi().fetch(video_id, languages=['en','en-US','en-GB']). Es gibt Ausschnitte mit Zeitstempel, den Sprachcode und ein is_generated Flag, das automatische Untertitel anzeigt. Übergeben Sie eine geordnete Sprachenliste für einen eleganten Fallback. Für Randfälle mit signierten URLs (Live-Untertitel, Inhalte nur für Mitglieder) wechseln Sie zu yt-dlp mit writesubtitles=True und lesen Sie die json3 dort generierte URL.

Warum gibt mein YouTube-Scraper plötzlich leere Seiten oder 429-Fehler zurück?

Drei übliche Ursachen. Du greifst zu oft von derselben IP-Adresse zu, wechsle daher zu privaten Proxys und füge bei 429-Fehlern einen exponentiellen Backoff hinzu. Du wirst zu consent.youtube.com, also setze ein CONSENT=YES+cb Cookie. Oder dein clientVersion Header ist bei /youtubei/v1/ Aufrufen veraltet, also aktualisiere ihn von einer aktuellen Wiedergabeseite oder sw.js_data einmal pro Durchlauf.

Wie oft ändert YouTube sein internes /youtubei/v1-Schema, und wie stelle ich sicher, dass mein Scraper weiterhin funktioniert?

Endpunktpfade und Wrapper der obersten Ebene bleiben monatelang stabil, aber die Feldnamen des Renderers darin (videoRenderer, reelItemRenderer, Pfade für Kommentarfortsetzungen) ändern sich alle paar Wochen. Schützen Sie sich vor solchen Änderungen, indem Sie jsonpath-ng oder jmespath Ausdrücken, die leicht zu aktualisieren sind, die Form der Antworten mithilfe von Schema-Snapshots überwachen und Integrationstests schreiben, die deutlich anzeigen, wenn ein kritisches Feld verschwindet.

Zusammenfassung und nächste Schritte

Wenn Sie sich nur eine Sache aus diesem Leitfaden merken, dann sollte es die Entscheidungsmatrix sein: Zu wissen, wie man YouTube scrapt, beginnt mit der Wahl des richtigen Tools, nicht mit dem Schreiben von Code. Die Data API für strukturierte Aufrufe mit geringem Volumen, yt-dlp für die Tiefe pro Video, versteckte /youtubei/v1/ Endpunkte für Suche und Paginierung sowie eine verwaltete API, wenn es um die Produktion geht.

Bevor Sie einen YouTube-Scraper ausrollen, führen Sie drei Produktionsprüfungen durch. Erstens: Stellen Sie sicher, dass Ihr Proxy-Pool häufig genug wechselt, um die Anfrageraten pro IP im konservativen Bereich zu halten. Zweitens: Vergewissern Sie sich, dass Ihre Wiederholungsrichtlinie 429er- und 5xx-Fehler sowie Consent-Weiterleitungen als unterschiedliche Fehlermodi mit unterschiedlichen Backoff-Kurven behandelt. Drittens: Richten Sie eine Überwachung ein, die bei Änderungen der Antwortform alarmiert, nicht nur bei HTTP-Fehlern, damit eine unbemerkte Schema-Abweichung /youtubei/v1/ nicht eine Woche an Daten beschädigt.

Kombinieren Sie das Scraping von Kanälen mit der Sentimentanalyse von Kommentaren, der Aufteilung von Transkripten in Abschnitte oder Dashboards zur Konkurrentenanalyse, und Sie verfügen über eine echte Intelligence-Pipeline. Wenn Sie den Proxy und die Wiederholungsmechanismen lieber ganz überspringen möchten, bietet unser Team bei WebScrapingAPI eine Scraper-API an, die sauberes HTML oder JSON von jeder YouTube-Oberfläche mit integrierter Anti-Bot-Handhabung zurückgibt, sodass Sie den Parsing-Code beibehalten und die Abrufebene mit einem einzigen HTTP-Aufruf austauschen können.

Über den Autor
Raluca Penciuc, Full-Stack-Entwickler @ WebScrapingAPI
Raluca PenciucFull-Stack-Entwickler

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, verbessert Umgehungsstrategien und findet zuverlässige Wege, um die Erkennung auf Zielwebsites zu verringern.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.