Scrape YouTube w Pythonie: 4 metody, które naprawdę działają

Ostatnia aktualizacja: April 15, 2026
Scrape YouTube w Pythonie: 4 metody, które naprawdę działają

Jeśli kiedykolwiek próbowałeś czegoś w stylu requests.get("https://www.youtube.com/...") i potem analizowałeś wynik w BeautifulSoup, szukając tytułów filmów, to znasz już finał: dostajesz ścianę pustych tagów <div> i dokładnie zero sensownych danych.

To najczęstsza frustracja, jaką widzę u programistów, którzy po raz pierwszy próbują pobierać dane z YouTube. YouTube to aplikacja typu single-page application — prawie wszystko renderuje po stronie klienta za pomocą JavaScriptu. HTML, który dostaje Twój skrypt Python, to tylko skorupa. Prawdziwe tytuły filmów, liczby wyświetleń i metadane? Są schowane w ogromnym obiekcie JSON o nazwie ytInitialData, który JavaScript wstrzykuje po załadowaniu strony.

Dlatego Twoje całkiem logiczne soup.find("div", class_="ytd-video-renderer") zwraca None, bo taki element dosłownie nie istnieje w surowej odpowiedzi HTTP. Gdy to zrozumiałem, wszystko nagle zaczęło mieć sens — a cztery metody poniżej są efektem wielu testów, połamanych prób i przekopywania się przez zbyt wiele wątków na GitHubie. Przeprowadzę Cię przez każde podejście, pokażę dokładnie, kiedy którego użyć, a na końcu dorzucę też rozwiązanie bez kodowania dla osób, które po prostu chcą dane bez całej konfiguracji projektu.

Dlaczego w ogóle scrapować YouTube w Pythonie?

YouTube to nie tylko platforma wideo — to kopalnia danych dla 2,58 miliarda aktywnych użytkowników miesięcznie. Przy ponad 5,1 miliarda hostowanych filmów i ponad 500 godzin treści dodawanych każdej minuty mamy do czynienia z ogromną ilością publicznie widocznych informacji, które firmy, badacze i twórcy chcą analizować automatycznie.

Problem w tym, że wbudowana analityka YouTube pokazuje dane tylko dla Twojego kanału. Jeśli chcesz sprawdzić częstotliwość publikacji konkurencji, śledzić gorące tematy w swojej niszy albo analizować sentyment odbiorców na podstawie komentarzy pod cudzymi filmami, musisz scrapować dane.

Oto najczęstsze realne zastosowania, które widzę:

Przypadek użyciaKto tego potrzebujeJakie dane
Analiza konkurencjiZespoły marketingu, strategowie treściLiczba wyświetleń, częstotliwość publikacji, wskaźniki zaangażowania
Generowanie leadówZespoły sprzedaży, outreach B2BDane kontaktowe kanału, e-maile firmowe w opisach
Badania rynkuProduct managerowie, analitycyTrendujące tematy, sentyment odbiorców na podstawie komentarzy
Strategia contentowaYouTuberzy, agencjeNajlepiej działające formaty, optymalne wzorce tytułów i tagów
SEO / research słów kluczowychSpecjaliści SEOTytuły filmów, tagi, opisy, sygnały rankingowe
Monitoring markiZespoły PR, brand managerowieWzmianki w tytułach filmów, komentarzach, opisach
Badania naukoweBadacze, data scientistyZestawy komentarzy do analizy sentymentu (jedno badanie z 2025 roku osiągnęło 93,1% trafności po dostrojeniu BERT-a na 45 tys. komentarzy z YouTube)

Przykładowo, analiza konkurencyjna DJI vs. GoPro vs. Insta360 pokazała, że zasięg DJI na YouTube (390 milionów wyświetleń) przewyższał łącznie obu konkurentów — takich wniosków nie widać z poziomu YouTube Studio.

Dlaczego samo requests + BeautifulSoup nie wystarczy do scrapowania YouTube

Zanim przejdziemy do metod, które działają, musisz zrozumieć dlaczego oczywiste podejście zawodzi. To nie jest teoria akademicka — oszczędzi Ci godzin debugowania.

„Oczywista” metoda wygląda mniej więcej tak:

import requests
from bs4 import BeautifulSoup

response = requests.get("https://www.youtube.com/@somechannel/videos")
soup = BeautifulSoup(response.text, "html.parser")
videos = soup.find_all("a", id="video-title-link")
print(len(videos))  # 0 — za każdym razem

Wynik jest zawsze zerowy. Jak pisze ScrapeOps w swoim przewodniku debugowania: „Strona została wczytana dynamicznie, a requests tego nie obsługuje”. Poradnik dla początkujących od Teclado mówi wprost: „Samo requests i BeautifulSoup nie potrafią wykonać JavaScriptu”.

Analiza YouTube od Scrapfly z 2026 roku wyjaśnia mechanizm: YouTube działa jako Single Page Application (SPA). Przy zwykłych żądaniach HTTP dostajesz tylko początkową powłokę HTML — właściwa treść nie została jeszcze wyrenderowana. Dane wideo są ukryte w obiektach JavaScript, które przeglądarka normalnie wykonuje i wstrzykuje do DOM.

Dobra wiadomość: YouTube naprawdę umieszcza wszystkie potrzebne dane w surowym HTML. Po prostu nie są one w elementach DOM, tylko w dwóch blokach JSON wewnątrz tagów <script>:

  • ytInitialData — struktura strony, listy filmów, metryki zaangażowania, tokeny do kontynuacji komentarzy
  • ytInitialPlayerResponse — podstawowe metadane filmu (tytuł, opis, czas trwania, formaty, napisy)

Oba są dostępne przez jedno requests.get() — bez przeglądarki — jeśli wiesz, jak je wyciągnąć i sparsować. To właśnie będzie Metoda 1.

4 sposoby na scrapowanie YouTube w Pythonie: porównanie obok siebie

Zanim przejdziemy do każdej metody, oto tabela decyzyjna. Przetestowałem wszystkie cztery podejścia i porównałem je pod kątem kryteriów, które naprawdę mają znaczenie przy wyborze narzędzia do prawdziwego projektu.

Kryteriumrequests + BS4 (ytInitialData)Selenium / Playwrightyt-dlpYouTube Data APIBez kodu (Thunderbit)
Złożoność konfiguracjiNiskaŚredniaNiskaŚrednia (klucz API)Brak
Obsługa renderowania JSCzęściowa (parsowanie JSON)TakTakNie dotyczy (ustrukturyzowane API)Tak
SzybkośćSzybkaWolnaSzybkaSzybkaSzybka (cloud)
Ryzyko anty-botŚrednieWysokieNiskieBrakObsługiwane
Limity / quotaBrak (ale możliwe blokady IP)Brak (ale wykrywanie)Brak10 000 jednostek/dzieńOparte na kredytach
Pobieranie komentarzyTrudneMożliwe, ale złożoneWbudowaneWbudowaneZależy od strony
TranskrypcjeNieZłożoneTakNieNie
Najlepsze doSzybkich metadanychWyników wyszukiwania, dynamicznych stronMasowych metadanych + komentarzyUstrukturyzowanych danych na dużą skalęOsób nietechnicznych, szybkich eksportów

Szybkie podsumowanie: youtube-scraping-methods.webp

Jakie dane z YouTube możesz faktycznie wyciągnąć — i którą metodą?

To jest tabela referencyjna, którą chciałem mieć, kiedy zaczynałem. Żadna pojedyncza metoda nie pokrywa wszystkich pól — właśnie dlatego ten artykuł opisuje cztery.

Pole danychBS4 (ytInitialData)Selenium/Playwrightyt-dlpYouTube APIThunderbit
Tytuł filmu
Liczba wyświetleń
Liczba polubień⚠️ Niespójne
Komentarze (tekst)⚠️ Złożone⚠️
Transkrypcja / napisy⚠️
Tagi⚠️
Adresy URL miniaturek
Liczba subskrybentów kanału⚠️
Data publikacji
Czas trwania filmu
Dane specyficzne dla Shorts⚠️⚠️⚠️

Wybierz metodę w zależności od tego, które wiersze są dla Ciebie najważniejsze. Jeśli potrzebujesz komentarzy i transkrypcji, yt-dlp jest wyraźnym zwycięzcą. Jeśli potrzebujesz ustrukturyzowanych statystyk na średnią skalę, API będzie najlepszym wyborem. Jeśli potrzebujesz danych w dwie minuty, czytaj dalej sekcję o Thunderbit.

extracted-data-categories.webp

Metoda 1: Scrapowanie YouTube w Pythonie przez requests + BeautifulSoup (parsowanie ytInitialData)

Ta metoda wykorzystuje fakt, że YouTube osadza wszystkie dane strony jako JSON wewnątrz surowego HTML. Nie potrzebujesz przeglądarki — potrzebujesz tylko wiedzieć, gdzie szukać.

  • Poziom trudności: początkujący
  • Czas potrzebny: około 15 minut
  • Czego potrzebujesz: Python 3.10+, requests, beautifulsoup4

Krok 1: Wyślij żądanie GET do strony YouTube

Wyślij żądanie z realistycznym nagłówkiem User-Agent. Domyślny nagłówek python-requests/2.x bywa od razu blokowany — przewodnik ScrapeOps po nagłówkach potwierdza, że to najczęstsza pułapka dla początkujących.

import requests

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/114.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Cookie": "CONSENT=YES+cb",  # omija ekran zgody w UE
}

url = "https://www.youtube.com/@mkbhd/videos"
response = requests.get(url, headers=HEADERS)
print(response.status_code)  # powinno być 200

Cookie CONSENT jest kluczowe — bez niego żądania z regionu UE są przekierowywane do consent.youtube.com, które zwraca HTML bez ytInitialData.

Krok 2: Sparsuj HTML i znajdź skrypt ytInitialData

Użyj BeautifulSoup albo regexa, aby znaleźć tag <script> zawierający var ytInitialData =:

import re
import json

# Wyciągnięcie JSON-a ytInitialData
match = re.search(
    r"var ytInitialData\s*=\s*({.*?});</script>",
    response.text,
    re.DOTALL
)
if match:
    data = json.loads(match.group(1))
    print("ytInitialData zostało poprawnie wyciągnięte")
else:
    print("Nie znaleziono ytInitialData — sprawdź nagłówki/cookies")

Częsty błąd: używanie niedoskonałego, niechciwego .*? z samym }; jako znacznikiem końca. W JSON-ie bardzo często pojawiają się zagnieżdżone zamknięcia obiektów, przez co dopasowanie urwie się za wcześnie. Użyj };</script>, tak jak robi to skrypt Scrapfly z 2026 roku — to ostatnie przypisanie w jego własnym bloku skryptu.

Krok 3: Przejdź przez strukturę JSON i wyciągnij dane wideo

JSON jest mocno zagnieżdżony. Zamiast sztywno wpisywać ścieżki, które psują się za każdym razem, gdy YouTube przestawia strukturę (co zdarza się regularnie — tracker problemów yt-dlp dokumentuje kilka zmian formatu od 2023 roku), użyj rekurencyjnego wyszukiwania po kluczu:

def search_dict(partial, search_key):
    stack = [partial]
    while stack:
        cur = stack.pop()
        if isinstance(cur, dict):
            for k, v in cur.items():
                if k == search_key:
                    yield v
                else:
                    stack.append(v)
        elif isinstance(cur, list):
            stack.extend(cur)

# Wyciąganie informacji o filmach z kanału
videos = []
for vr in search_dict(data, "videoRenderer"):
    videos.append({
        "video_id": vr.get("videoId"),
        "title": vr["title"]["runs"][0]["text"],
        "views": vr.get("viewCountText", {}).get("simpleText", "N/A"),
        "published": vr.get("publishedTimeText", {}).get("simpleText", "N/A"),
    })

print(f"Znaleziono {len(videos)} filmów")
for v in videos[:5]:
    print(f"  {v['title']} — {v['views']}")

To podejście rekurencyjne jest tym, do czego doszły scrapetube, yt-dlp i Scrapfly — dobrze znosi częste zmiany struktury JSON-a w YouTube.

Krok 4: Eksportuj dane do CSV lub Excela

import csv

with open("youtube_videos.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["video_id", "title", "views", "published"])
    writer.writeheader()
    writer.writerows(videos)

print("Dane wyeksportowano do youtube_videos.csv")

Kiedy użyć tej metody, a kiedy nie

Najlepsza do: szybkiego pobierania metadanych z kilku stron kanału lub pojedynczych filmów. Lekkich narzędzi SEO. Jednorazowych analiz, w których potrzebujesz tytułu, wyświetleń i daty publikacji.

Ograniczenia: Struktura JSON się zmienia — znane przypadki obejmują przebudowę przycisku polubień (2023: toggleButtonRenderersegmentedLikeDislikeButtonViewModel), refaktor opisu (2023: description.runs[]attributedDescription.content) oraz redesign zakładki Videos na kanale (2022–2023: gridRendererrichGridRenderer). IP z centrów danych zwykle są miękko blokowane po 50–200 żądaniach. Brak komentarzy, brak transkrypcji.

Metoda 2: Scrapowanie YouTube w Pythonie z Selenium lub Playwright

Gdy musisz wchodzić w interakcję ze stroną — przewijać wyniki wyszukiwania, klikać zakładki, rozwijać opisy — automatyzacja przeglądarki jest właściwym rozwiązaniem.

  • Poziom trudności: średnio zaawansowany
  • Czas potrzebny: około 30 minut
  • Czego potrzebujesz: Python 3.10+, Playwright (pip install playwright && playwright install) albo Selenium + ChromeDriver

Do nowych projektów polecam Playwright zamiast Selenium. Benchmarki TestDino z 2026 roku pokazują, że Playwright działa mniej więcej 1,85× szybciej na akcję, zużywa ~2,1× mniej pamięci i ma ~4× większą równoległość niż Selenium. Playwright używa trwałego WebSocketu przez Chrome DevTools Protocol, podczas gdy Selenium działa przez WebDriver po HTTP, dodając warstwę tłumaczenia dla każdej komendy.

Krok 1: Skonfiguruj Playwright

pip install playwright
playwright install chromium
from playwright.sync_api import sync_playwright

pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)  # tryb z interfejsem zmniejsza część detekcji
context = browser.new_context()

# Ustaw cookie zgody, aby ominąć ekran UE
context.add_cookies([{
    "name": "SOCS",
    "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
    "domain": ".youtube.com",
    "path": "/",
}])

page = context.new_page()

Krok 2: Wejdź na stronę YouTube i poczekaj na załadowanie treści

page.goto("https://www.youtube.com/@mkbhd/videos")
page.wait_for_selector("a#video-title-link", timeout=15000)
print("Strona załadowana — elementy wideo są widoczne")

Jeśli scrapujesz wyniki wyszukiwania, zamiast tego przejdź na https://www.youtube.com/results?search_query=twoje+zapytanie.

Krok 3: Obsłuż nieskończone przewijanie, aby załadować więcej filmów

YouTube używa nieskończonego przewijania na stronach kanałów i wyników wyszukiwania. Oto klasyczna pętla scrollHeight, zaadaptowana z przewodnika Scrapfly po scrollowaniu:

prev_height = -1
max_scrolls = 20  # ogranicz to — kanał z 10 tys. filmów będzie przewijał się bez końca
scroll_count = 0

while scroll_count < max_scrolls:
    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    page.wait_for_timeout(1500)  # poczekaj, aż załaduje się nowa treść
    new_height = page.evaluate("document.body.scrollHeight")
    if new_height == prev_height:
        break  # nie załadowano nowej treści
    prev_height = new_height
    scroll_count += 1

print(f"Przewinięto {scroll_count} razy")

Krok 4: Wyciągnij dane wideo z wyrenderowanej strony

video_elements = page.query_selector_all("a#video-title-link")
videos = []

for el in video_elements:
    title = el.inner_text()
    href = el.get_attribute("href")
    video_id = href.split("v=")[-1] if href else None
    videos.append({"title": title, "video_id": video_id, "url": f"https://www.youtube.com{href}"})

print(f"Wyodrębniono {len(videos)} filmów")

Aby pobrać liczbę wyświetleń i daty publikacji, trzeba sięgnąć po sąsiednie elementy. Przewodnik Crawlee z 2025 roku ostrzega, że id="video-title-link" nie jest uniwersalne — YouTube stosuje kilka wariantów strony. Bezpiecznym fallbackiem jest a[href*="watch"].

Krok 5: Eksport do CSV lub Google Sheets

import csv

with open("youtube_playwright.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "video_id", "url"])
    writer.writeheader()
    writer.writerows(videos)

browser.close()
pw.stop()

Kiedy użyć tej metody, a kiedy nie

Najlepsza do: scrapowania wyników wyszukiwania, pracy z dynamicznymi elementami strony (klikaniem zakładek, rozwijaniem opisów), wszystkiego, co wymaga w pełni wyrenderowanego DOM-u.

Ograniczenia: Wolne działanie (~1,5–3 sekundy na film w przepływie przewijanie + ekstrakcja). Wysokie ryzyko wykrycia anty-bot — zwykły Selenium ustawia navigator.webdriver === true, co każdy mechanizm detekcji po stronie JS widzi od razu. Duże zużycie zasobów (każda instancja przeglądarki zajmuje 200–500 MB RAM). Dla 100 filmów licz od 3 do 8 minut zamiast sekund, jak w yt-dlp.

Metoda 3: Scrapowanie YouTube w Pythonie z użyciem yt-dlp

yt-dlp to szwajcarski scyzoryk do scrapowania YouTube. To społecznościowy fork youtube-dl z ponad 157 tys. gwiazdek na GitHubie, aktywnymi nightly release’ami oraz wbudowaną obsługą metadanych, komentarzy, transkrypcji i masowego scrapowania — bez potrzeby używania przeglądarki czy klucza API.

  • Poziom trudności: początkujący do średnio zaawansowanego
  • Czas potrzebny: około 10 minut
  • Czego potrzebujesz: Python 3.10+, pip install yt-dlp

Krok 1: Zainstaluj yt-dlp

pip install yt-dlp

Bez sterowników przeglądarki, bez kluczy API, bez plików konfiguracyjnych.

Krok 2: Pobierz metadane filmu bez pobierania samego wideo

import yt_dlp

opts = {
    "quiet": True,
    "skip_download": True,      # brak bajtów wideo — tylko metadane
    "no_warnings": True,
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

print(f"Tytuł: {info['title']}")
print(f"Wyświetlenia: {info['view_count']:,}")
print(f"Polubienia: {info.get('like_count', 'N/A')}")
print(f"Czas trwania: {info['duration']}s")
print(f"Data publikacji: {info['upload_date']}")
print(f"Kanał: {info['channel']} ({info.get('channel_follower_count', 'N/A')} subskrypcji)")
print(f"Tagi: {info.get('tags', [])[:5]}")

Typowe wywołanie extract_info zwraca 80–120 pól, zależnie od stanu filmu: id, title, channel, channel_id, channel_follower_count, view_count, like_count, comment_count, upload_date, duration, tags, categories, description, thumbnails, is_live, availability, automatic_captions, subtitles, chapters, heatmap i wiele więcej.

Krok 3: Pobierz komentarze z filmu YouTube

opts = {
    "quiet": True,
    "skip_download": True,
    "getcomments": True,
    "extractor_args": {
        "youtube": {
            "max_comments": ["200", "50", "50", "10"],  # łącznie, rodzice, odpowiedzi na komentarz, odpowiedzi łącznie
            "comment_sort": ["top"],
        }
    },
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

comments = info.get("comments", [])
print(f"Pobrano {len(comments)} komentarzy")
for c in comments[:3]:
    print(f"  [{c.get('like_count', 0)} polubień] {c['author']}: {c['text'][:80]}...")

Ekstrakcja komentarzy jest wolna. Issue #3532 w yt-dlp raportuje pobieranie komentarzy z prędkością ok. 30 KB/s — film z 100 tys. komentarzy może pobierać się godzinami. Issue #11849 opisuje filmy, w których adresy URL formatów wygasają (~6 godzin) zanim zakończy się paginacja komentarzy. Przy dużych filmach ustaw max_comments bardzo agresywnie.

Krok 4: Pobierz transkrypcje i napisy

Ani YouTube Data API, ani parsowanie BS4 nie da Ci pełnych transkrypcji. To unikalna przewaga yt-dlp.

opts = {
    "quiet": True,
    "skip_download": True,
    "writesubtitles": True,
    "writeautomaticsub": True,
    "subtitleslangs": ["en", "en-orig"],
    "subtitlesformat": "json3",   # przyjazne dla maszyn: start/dur w ms + tekst
    "outtmpl": "%(id)s.%(ext)s",
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        download=False
    )

# Dostęp do danych napisów bezpośrednio z dict info
auto_captions = info.get("automatic_captions", {})
manuall_subs = info.get("subtitles", {})
print(f"Języki automatycznych napisów: {list(auto_captions.keys())[:10]}")
print(f"Języki ręcznych napisów: {list(manuall_subs.keys())}")

Format json3 jest preferowany do parsowania maszynowego — każdy segment ma start/dur w milisekundach oraz fragmenty tekstu. Kody języków to BCP-47 (en, en-US, zh-Hans, ja, es).

Krok 5: Masowe pobieranie wielu filmów lub całego kanału

opts = {
    "quiet": True,
    "skip_download": True,
    "extract_flat": "in_playlist",  # szybko — tylko ID filmów i tytuły
    "sleep_interval": 2,
    "max_sleep_interval": 6,
}

with yt_dlp.YoutubeDL(opts) as ydl:
    info = ydl.extract_info(
        "https://www.youtube.com/@mkbhd/videos",
        download=False
    )

entries = info.get("entries", [])
print(f"Na kanale znaleziono {len(entries)} filmów")
for e in entries[:5]:
    print(f"  {e.get('title', 'N/A')} — {e.get('id')}")

Przekaż URL kanału, URL playlisty albo nawet zapytanie wyszukiwania (ytsearch10:python scraping), a yt-dlp sam obsłuży paginację.

Kiedy użyć tej metody, a kiedy nie

Najlepsza do: masowego pobierania metadanych, komentarzy, transkrypcji, pobierania filmów, scrapowania całych kanałów, gdy potrzebujesz pełnego zestawu pól.

Ograniczenia: nie jest idealna do scrapowania stron wyników wyszukiwania (tu lepszy jest Selenium/Playwright). Wyścig anty-bot z lat 2024–2026 sprawił, że uruchamianie yt-dlp na dużą skalę stało się bardziej złożone — YouTube egzekwuje teraz na niektórych klientach BotGuard attestation i PO Tokens. W produkcji zainstaluj wtyczkę bgutil-ytdlp-pot-provider i używaj --cookies-from-browser chrome (na testowym koncie — zespół yt-dlp ostrzega, że cookies z prawdziwego konta Google mogą doprowadzić do jego bana).

Metoda 4: Scrapowanie YouTube w Pythonie przez YouTube Data API

Oficjalne YouTube Data API v3 to najbardziej niezawodny i najbardziej ustrukturyzowany sposób pobierania danych z YouTube. Odpowiedzi są czystym JSON-em, pola są udokumentowane i nie ma gry w kotka i myszkę z anty-botami. Jest jednak haczyk, który większość poradników pomija: system quota.

  • Poziom trudności: średnio zaawansowany
  • Czas potrzebny: około 20 minut (wraz z konfiguracją klucza API)
  • Czego potrzebujesz: Python 3.10+, projekt w Google Cloud, pip install google-api-python-client

Krok 1: Zdobądź klucz YouTube Data API

  1. Wejdź do Google Cloud Console
  2. Utwórz nowy projekt (lub wybierz istniejący)
  3. Przejdź do APIs & Services → Library → wyszukaj „YouTube Data API v3” → Enable
  4. Wejdź do APIs & Services → CredentialsCreate Credentials → API Key
  5. Skopiuj klucz — użyjesz go w kodzie poniżej

Krok 2: Wykonaj pierwsze wywołanie API

from googleapiclient.discovery import build

API_KEY = "YOUR_API_KEY_HERE"
youtube = build("youtube", "v3", developerKey=API_KEY)

# Pobranie szczegółów konkretnego filmu
response = youtube.videos().list(
    part="snippet,statistics,contentDetails",
    id="dQw4w9WgXcQ"
).execute()

video = response["items"][0]
print(f"Tytuł: {video['snippet']['title']}")
print(f"Wyświetlenia: {video['statistics']['viewCount']}")
print(f"Polubienia: {video['statistics'].get('likeCount', 'ukryte')}")
print(f"Komentarze: {video['statistics'].get('commentCount', 'wyłączone')}")
print(f"Czas trwania: {video['contentDetails']['duration']}")
print(f"Tagi: {video['snippet'].get('tags', [])[:5]}")

Odpowiedź jest czysta, typowana i udokumentowana. Bez archeologii JSON-owej.

Krok 3: Pobierz szczegóły filmu, informacje o kanale i komentarze

# Wyszukiwanie filmów
search_response = youtube.search().list(
    part="snippet",
    q="python web scraping tutorial",
    type="video",
    maxResults=10,
    order="viewCount"
).execute()

for item in search_response["items"]:
    print(f"  {item['snippet']['title']} — {item['id']['videoId']}")

# Pobieranie komentarzy
comments_response = youtube.commentThreads().list(
    part="snippet",
    videoId="dQw4w9WgXcQ",
    maxResults=20,
    order="relevance"
).execute()

for item in comments_response["items"]:
    comment = item["snippet"]["topLevelComment"]["snippet"]
    print(f"  [{comment['likeCount']} polubień] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")

Rzeczywistość quota YouTube API (tego nikt nie mówi)

To jest sekcja, która odróżnia użyteczny poradnik od tutoriala do kopiuj-wklej. Domyślny przydział to 10 000 jednostek quota dziennie, resetowanych o północy czasu pacyficznego. Oto koszt poszczególnych wywołań:

Endpoint APIKoszt quota za wywołanieMaks. wyników na wywołanie
search.list100 jednostek50 wyników
videos.list1 jednostka50 ID filmów (w paczce)
channels.list1 jednostka50 ID kanałów
commentThreads.list1 jednostka100 komentarzy
captions.list50 jednostekN/A

Teraz matematyka. Załóżmy, że chcesz scrapować 1000 wyników wyszukiwania:

  • Wywołania wyszukiwania: 1000 wyników ÷ 50 na stronę = 20 wywołań × 100 jednostek = 2000 jednostek (20% dziennego budżetu — i znika)
  • Szczegóły filmów dla tych 1000 wyników: 1000 ID ÷ 50 w paczce = 20 wywołań × 1 jednostka = 20 jednostek (tanio — videos.list w paczce to prawdziwy ratunek)
  • Komentarze dla tych 1000 filmów (zakładając 1 stronę na film): 1000 wywołań × 1 jednostka = 1000 jednostek

Razem: około 3020 jednostek dla umiarkowanego scrapingu. Ale jeśli te filmy mają rozbudowane wątki komentarzy (50+ stron każdy), bardzo szybko zużyjesz pozostałe 7000 jednostek. Film z 50 000 komentarzy = około 500 stron = 500 jednostek. Scrapujesz 20 takich filmów i limit dnia się kończy.

Proces zwiększenia quota wymaga pełnego audytu zgodności: URL polityki prywatności, URL regulaminu, wideo pokazującego działanie aplikacji, uzasadnienie matematyki quota. Z raportów społeczności wynika, że typowa odpowiedź Google trwa 3–5 dni roboczych, pełna akceptacja może zająć tygodnie lub miesiące, a wiele wniosków zostaje odrzuconych — szczególnie w przypadkach typu „chcę więcej danych do analizy”.

Kiedy używać API: na małą i średnią skalę, gdy potrzebujesz ustrukturyzowanych i wiarygodnych danych, gdy liczą się komentarze i statystyki kanału, i gdy możesz zaakceptować limit quota.

Kiedy scraping ma większy sens: projekty na dużą skalę (>10 tys. filmów dziennie), pola, których API nie udostępnia (pełne transkrypcje — captions.download wymaga OAuth i uprawnień właściciela filmu), albo gdy potrzebujesz więcej niż 500 wyników wyszukiwania na jedno zapytanie (twardy limit API, niezależnie od deklarowanego totalResults).

Szybka ścieżka bez kodu: scrapowanie YouTube z Thunderbit (bez Pythona)

Jeśli potrzebujesz Pythona do pipeline’u danych, użyj powyższych metod 1–4. Ale jeśli chcesz dane z YouTube w 2 minuty — być może jesteś marketerem zbierającym statystyki konkurencji albo developerem, który chce po prostu szybki eksport bez konfigurowania środowiska — istnieje szybsza droga.

Thunderbit to rozszerzenie do Chrome oparte na AI, stworzone właśnie na takie sytuacje, gdy pisanie kodu to przesada. Działa bezpośrednio na stronach YouTube w Twojej przeglądarce.

Jak scrapować YouTube z Thunderbit w 3 krokach

Krok 1: Zainstaluj rozszerzenie Thunderbit do Chrome i otwórz stronę kanału YouTube, stronę wyników wyszukiwania albo stronę filmu.

Krok 2: Kliknij „AI Suggest Fields” w panelu bocznym Thunderbit. AI odczyta stronę i zasugeruje kolumny, takie jak tytuł filmu, wyświetlenia, data publikacji, czas trwania, nazwa kanału i URL miniatury. Możesz dodawać, usuwać lub zmieniać nazwy kolumn według potrzeb.

Krok 3: Kliknij „Scrape” i wyeksportuj dane do Google Sheets, Excela, CSV, Airtable lub Notion. Dane trafiają do czystej tabeli, gotowej do użycia.

Wypróbuj Thunderbit do scrapowania YouTube

Dla kogo to jest

  • Marketerzy, którzy potrzebują danych z kanałów konkurencji, ale nie kodują
  • Developerzy, którzy chcą szybki eksport danych bez tworzenia virtual environment i instalowania zależności
  • Każdy, kto wpada na ściany anty-bot — Thunderbit scrapuje w Twojej zalogowanej sesji przeglądarki, więc dziedziczy cookies i PO tokens. Omija to wiele problemów blokad, które nękają scrapery po stronie serwera
  • Thunderbit może też używać scrapowania podstron, aby wejść na każdą stronę filmu i wzbogacić tabelę o dodatkowe szczegóły (liczba polubień, opis, tagi)

Jeśli chcesz głębiej zobaczyć, jak Thunderbit radzi sobie konkretnie z YouTube, sprawdź szablon Thunderbit YouTube Channel Scraper oraz kanał Thunderbit na YouTube.

Jak scrapować YouTube w Pythonie, żeby nie zostać zablokowanym

Te wskazówki dotyczą wszystkich czterech metod w Pythonie. Mechanizmy anty-bot YouTube są oceniane jako 6/10 trudności przez ScrapeOps, a działają głównie na trzech sygnałach: analizie zachowania IP, wymaganiu wykonywania JS oraz często zmieniającej się strukturze HTML.

Dla wszystkich metod:

  • Rotuj nie tylko User-Agent, ale cały zestaw nagłówków — Accept, Accept-Language, Sec-CH-UA muszą zgadzać się z deklarowanym UA. Aktualną listę znajdziesz w przewodniku ScraperAPI z 2026 roku.
  • Dodawaj losowe opóźnienia 2–8 sekund między żądaniami. Stałe odstępy to sygnał detekcyjny.
  • Używaj proxy residential przy czymkolwiek większym niż kilka stron. IP z centrów danych (AWS, GCP, Hetzner) są praktycznie martwe dla scrapowania YouTube w latach 2025–2026.
  • Rotuj jednocześnie sesję i IP — YouTube wiąże sesje z IP, więc ten sam cookie sesyjny na dwóch różnych IP to czerwona flaga.

Dla requests + BS4: ustaw cookie CONSENT=YES+cb. Bez niego żądania z UE zostają przekierowane na stronę zgody bez danych.

Dla Selenium/Playwright: uruchamiaj w trybie z interfejsem z xvfb na serwerach Linux zamiast --headless=new — headless Chrome nadal ujawnia wystarczająco dużo fingerprintów, by zaawansowane detektory mogły go rozpoznać. Rozważ playwright-stealth, które stosuje około 17 obejść.

Dla yt-dlp: używaj opcji sleep_interval i max_sleep_interval. Zainstaluj wtyczkę bgutil-ytdlp-pot-provider do generowania PO Tokenów. Korzystaj z --cookies-from-browser chrome na testowym koncie.

Dla API: monitoruj wykorzystanie quota w Google Cloud Console i efektywnie grupuj żądania. Jedno wywołanie videos.list z 50 ID oddzielonymi przecinkami kosztuje 1 jednostkę — wykorzystuj to.

Dla Thunderbit: mechanizmy anty-bot są obsługiwane automatycznie, bo scrapowanie odbywa się w Twojej sesji przeglądarki. W praktyce automatyzujesz po prostu to, co robiłbyś ręcznie.

Czy scrapowanie YouTube w Pythonie jest legalne?

To zależy od tego, co scrapujesz, jak to robisz i co potem robisz z tymi danymi.

Sytuacja prawna zmieniła się w 2024 roku wraz ze sprawą Meta Platforms v. Bright Data (N.D. Cal., styczeń 2024), gdzie sędzia Chen orzekł, że regulamin Meta zakazuje tylko scrapowania po zalogowaniu, a nie publicznego scrapowania bez logowania. Dostęp do publicznie dostępnych danych stał się po tym wyroku „znacznie mniej ryzykowny”. Z drugiej strony, sprawa hiQ v. LinkedIn zakończyła się wyrokiem $500 000 przeciw hiQ za naruszenie ToS, naruszenia CFAA (fałszywe konta) i trespass to chattels — plus stały zakaz sądowy.

Własne Warunki korzystania z YouTube są jednoznaczne: „Nie wolno Ci korzystać z usługi przy użyciu automatycznych środków (takich jak roboty, botnety lub scrapery)” — chyba że masz wcześniejszą pisemną zgodę albo pozwala na to obowiązujące prawo. YouTube Data API to oficjalnie zatwierdzona droga dostępu do danych.

Kilka praktycznych zasad:

  • Scrapowanie publicznie widocznych danych do badań osobistych lub analizy niekomercyjnej jest zwykle mniej ryzykowne
  • API to najbezpieczniejsza ścieżka — jest wprost autoryzowane
  • Unikaj scrapowania treści prywatnych / za ekranem logowania, pobierania chronionych prawem autorskim filmów do dalszej dystrybucji oraz naruszania GDPR przez dane osobowe z komentarzy
  • Komentarze YouTube zawierają dane osobowe w rozumieniu GDPR art. 4(1) — informacje o osobach z UE należy przetwarzać ostrożnie
  • W projektach komercyjnych skonsultuj się z prawnikiem

To nie jest porada prawna. Sytuacja zmienia się szybko — nowa fala pozwów DMCA §1201 od twórców przeciw firmom AI, które scrapowały YouTube do danych treningowych, przekształca ten obszar w latach 2025–2026.

Którą metodę wybrać do scrapowania YouTube w Pythonie?

Przewodnik decyzyjny:

  • Potrzebujesz szybkich metadanych z kilku stron? → Metoda 1 (requests + BS4). Szybka, lekka, bez zależności poza requests i beautifulsoup4.
  • Chcesz scrapować wyniki wyszukiwania albo interakcje z dynamicznymi stronami? → Metoda 2 (Selenium/Playwright). Pełne renderowanie przeglądarki, obsługa nieskończonego scrollowania, ale wolna i podatna na wykrycie.
  • Potrzebujesz masowych metadanych, komentarzy albo transkrypcji? → Metoda 3 (yt-dlp). Najbardziej wszechstronne pojedyncze narzędzie — nie bez powodu ma ponad 157 tys. gwiazdek.
  • Potrzebujesz ustrukturyzowanych, niezawodnych danych na średnią skalę? → Metoda 4 (YouTube Data API). Oficjalna, czysta, ale ograniczona quota do 10 000 jednostek/dzień.
  • Potrzebujesz danych w 2 minuty bez pisania kodu?Thunderbit. Oparte na przeglądarce, z AI, eksport do Google Sheets kilkoma kliknięciami.

Żadna metoda nie pokrywa wszystkich przypadków użycia. Zapisz sobie tabelę porównawczą i tabelę pól danych powyżej — zaoszczędzą Ci czasu przy następnym projekcie. A jeśli chcesz poznać więcej podejść do web scrapingu, na blogu Thunderbit mamy mnóstwo poradników, od samouczków scrapowania w Pythonie po pobieranie danych do Google Sheets.

Wypróbuj Thunderbit do scrapowania YouTube Get Started Free

FAQ

Czy mogę scrapować YouTube bez klucza API?

Tak. Metody 1 (requests + BS4), 2 (Selenium/Playwright) i 3 (yt-dlp) nie wymagają klucza API. Tylko Metoda 4 (YouTube Data API) go potrzebuje. Thunderbit również działa bez żadnego klucza API — scrapuje bezpośrednio w Twojej przeglądarce.

Jaki jest najszybszy sposób scrapowania YouTube w Pythonie?

W Pythonie najszybsze są yt-dlp i requests + BS4 — oba omijają narzut przeglądarki i potrafią pobierać metadane w kilka sekund na film. yt-dlp jest szczególnie szybki przy operacjach wsadowych, bo sam obsługuje paginację. Dla osób spoza Pythona Thunderbit jest najszybszy ogólnie, bo nie wymaga żadnej konfiguracji.

Jak scrapować komentarze z YouTube w Pythonie?

yt-dlp ma wbudowaną ekstrakcję komentarzy przez opcję getcomments — to najprostsza ścieżka. YouTube Data API też obsługuje komentarze przez commentThreads.list (1 jednostka quota za wywołanie, do 100 komentarzy na stronę). Selenium/Playwright też da się do tego użyć, przewijając i wyciągając wyrenderowane elementy komentarzy, ale jest to wolne i kruche.

Czy mogę scrapować YouTube Shorts w Pythonie?

Tak. yt-dlp dobrze obsługuje metadane Shorts — traktuje je jak zwykłe filmy z dodatkowymi polami specyficznymi dla Shorts. YouTube Data API ma częściowe wsparcie (liczenie wyświetleń Shorts zmieniono 30 kwietnia 2025 — views liczy teraz każde rozpoczęcie odtwarzania / ponowne odtworzenie). BS4 i Selenium/Playwright mają ograniczone wsparcie dla Shorts, ponieważ sekcja Shorts korzysta z innych struktur DOM.

Ile filmów z YouTube mogę scrapować dziennie?

W przypadku YouTube Data API jesteś ograniczony do około 10 000 jednostek quota dziennie. Przy batched videos.list (50 ID na wywołanie za 1 jednostkę) daje to nawet 500 000 odczytów statystyk filmów dziennie — ale search.list kosztujące 100 jednostek na wywołanie szybko zjada budżet. W metodach scrapujących (BS4, Selenium, yt-dlp) limit jest praktyczny, a nie zapisany na sztywno: blokady IP zwykle wchodzą po kilkuset do kilku tysięcy żądań dziennie na jedno IP, zależnie od proxy i wzorca ruchu. Thunderbit korzysta z systemu kredytów przypisanego do Twojego planu.

Dowiedz się więcej

Ke
Ke
CTO w Thunderbit | Starszy data scientist i ekspert ML Dzięki prawie dziesięciu latom doświadczenia w uczeniu maszynowym i data science, Ke Shen jest absolwentem Columbia University i byłym starszym data scientistą w Walmart Labs. Dysponując dogłębną, uznaną przez branżowych ekspertów wiedzą w zakresie Python, R, Java i statystyki, dzieli się sprawdzonymi w boju spostrzeżeniami na temat wdrażania złożonych algorytmów AI — od teorii po architekturę gotową do produkcji.

Wypróbuj Thunderbit

Zbieraj leady i inne dane w zaledwie 2 kliknięcia. Wspierane przez AI.

Pobierz Thunderbit To darmowe
Wyciągaj dane z użyciem AI
Łatwo przenoś dane do Google Sheets, Airtable lub Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week