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życia | Kto tego potrzebuje | Jakie dane |
|---|---|---|
| Analiza konkurencji | Zespoły marketingu, strategowie treści | Liczba wyświetleń, częstotliwość publikacji, wskaźniki zaangażowania |
| Generowanie leadów | Zespoły sprzedaży, outreach B2B | Dane kontaktowe kanału, e-maile firmowe w opisach |
| Badania rynku | Product managerowie, analitycy | Trendujące tematy, sentyment odbiorców na podstawie komentarzy |
| Strategia contentowa | YouTuberzy, agencje | Najlepiej działające formaty, optymalne wzorce tytułów i tagów |
| SEO / research słów kluczowych | Specjaliści SEO | Tytuły filmów, tagi, opisy, sygnały rankingowe |
| Monitoring marki | Zespoły PR, brand managerowie | Wzmianki w tytułach filmów, komentarzach, opisach |
| Badania naukowe | Badacze, data scientisty | Zestawy 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 komentarzyytInitialPlayerResponse— 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.
| Kryterium | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | Bez kodu (Thunderbit) |
|---|---|---|---|---|---|
| Złożoność konfiguracji | Niska | Średnia | Niska | Średnia (klucz API) | Brak |
| Obsługa renderowania JS | Częściowa (parsowanie JSON) | Tak | Tak | Nie dotyczy (ustrukturyzowane API) | Tak |
| Szybkość | Szybka | Wolna | Szybka | Szybka | Szybka (cloud) |
| Ryzyko anty-bot | Średnie | Wysokie | Niskie | Brak | Obsługiwane |
| Limity / quota | Brak (ale możliwe blokady IP) | Brak (ale wykrywanie) | Brak | 10 000 jednostek/dzień | Oparte na kredytach |
| Pobieranie komentarzy | Trudne | Możliwe, ale złożone | Wbudowane | Wbudowane | Zależy od strony |
| Transkrypcje | Nie | Złożone | Tak | Nie | Nie |
| Najlepsze do | Szybkich metadanych | Wyników wyszukiwania, dynamicznych stron | Masowych metadanych + komentarzy | Ustrukturyzowanych danych na dużą skalę | Osób nietechnicznych, szybkich eksportów |
Szybkie podsumowanie:

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 danych | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| 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.

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: toggleButtonRenderer → segmentedLikeDislikeButtonViewModel), refaktor opisu (2023: description.runs[] → attributedDescription.content) oraz redesign zakładki Videos na kanale (2022–2023: gridRenderer → richGridRenderer). 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
- Wejdź do Google Cloud Console
- Utwórz nowy projekt (lub wybierz istniejący)
- Przejdź do APIs & Services → Library → wyszukaj „YouTube Data API v3” → Enable
- Wejdź do APIs & Services → Credentials → Create Credentials → API Key
- 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 API | Koszt quota za wywołanie | Maks. wyników na wywołanie |
|---|---|---|
search.list | 100 jednostek | 50 wyników |
videos.list | 1 jednostka | 50 ID filmów (w paczce) |
channels.list | 1 jednostka | 50 ID kanałów |
commentThreads.list | 1 jednostka | 100 komentarzy |
captions.list | 50 jednostek | N/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.listw 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-UAmuszą 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
requestsibeautifulsoup4. - 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


