Kalau Anda pernah mencoba requests.get("https://www.youtube.com/...") lalu mem-parse hasilnya dengan BeautifulSoup sambil mencari judul video, Anda pasti sudah tahu ujung-ujungnya: yang keluar cuma deretan <div> kosong dan tidak ada data yang benar-benar berguna.
Itulah keluhan paling sering yang saya lihat dari developer yang baru pertama kali coba scrape YouTube. YouTube itu aplikasi single-page β hampir seluruh kontennya dirender di sisi client lewat JavaScript. HTML yang diterima script Python Anda cuma kerangka kosong. Lalu judul video, jumlah tayangan, dan metadata lainnya ada di mana? Semuanya disimpan dalam blob JSON besar bernama ytInitialData, yang disuntikkan oleh JS setelah halaman dimuat.
Jadi wajar saja kalau soup.find("div", class_="ytd-video-renderer") mengembalikan None, karena elemen itu memang tidak ada di response HTTP mentah. Begitu saya paham hal ini, semuanya langsung masuk akal β dan empat metode di bawah ini lahir dari banyak eksperimen, error, dan membaca terlalu banyak issue GitHub. Saya akan tunjukkan satu per satu pendekatannya, kapan sebaiknya dipakai, plus opsi no-code di bagian akhir untuk Anda yang hanya ingin datanya tanpa pusing setup proyek.
Kenapa Perlu Scrape YouTube dengan Python?
YouTube bukan cuma platform video β ini juga sumber data raksasa dengan 2,58 miliar pengguna aktif bulanan. Dengan lebih dari 5,1 miliar video yang di-host dan 500+ jam konten diunggah setiap menit, ada begitu banyak informasi publik yang ingin dianalisis oleh bisnis, peneliti, dan kreator secara terprogram.
Masalahnya, analytics bawaan YouTube hanya menampilkan data untuk channel milik Anda sendiri. Kalau Anda ingin memahami ritme upload kompetitor, memantau topik yang sedang naik di niche Anda, atau menganalisis sentimen audiens dari komentar di video orang lain, Anda perlu melakukan scraping.
Berikut beberapa use case nyata yang paling sering saya lihat:
| Use Case | Siapa yang Butuh | Data yang Diambil |
|---|---|---|
| Analisis kompetitor | Tim marketing, content strategist | Jumlah views, frekuensi upload, engagement rate |
| Lead generation | Tim sales, outreach B2B | Info kontak channel, email bisnis di deskripsi |
| Riset pasar | Product manager, analis | Topik yang sedang tren, sentimen audiens lewat komentar |
| Strategi konten | YouTuber, agensi | Format yang performanya tinggi, pola judul/tag yang optimal |
| SEO / riset keyword | Spesialis SEO | Judul video, tag, deskripsi, sinyal peringkat |
| Monitoring brand | Tim PR, brand manager | Penyebutan merek di judul video, komentar, deskripsi |
| Riset akademik | Peneliti, data scientist | Dataset komentar untuk analisis sentimen (satu studi tahun 2025 mencapai akurasi 93,1% saat fine-tuning BERT pada 45 ribu komentar YouTube) |
Contohnya, analisis kompetitif DJI vs. GoPro vs. Insta360 menemukan bahwa jangkauan YouTube DJI (390 juta views) melampaui kedua kompetitor jika digabung β insight seperti ini tidak kelihatan dari dalam YouTube Studio.
Kenapa requests + BeautifulSoup Saja Tidak Bisa Scrape YouTube
Sebelum masuk ke metode yang benar-benar jalan, Anda perlu paham dulu kenapa pendekatan yang paling masuk akal justru gagal. Ini bukan sekadar teori β ini akan menghemat banyak waktu debugging.
Pendekatan "yang kelihatannya paling logis" biasanya seperti ini secara konsep:
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 β selalu
Hasilnya memang selalu nol. Seperti dijelaskan ScrapeOps dalam playbook debugging-nya: "The page was loaded dynamically, which is not supported by the requests lib." Panduan pemula dari Teclado bahkan lebih tegas: "Using requests and BeautifulSoup alone you cannot execute JavaScript."
Ulasan YouTube dari Scrapfly tahun 2026 menjelaskan mekanismenya: YouTube dibangun sebagai Single Page Application (SPA). Saat Anda memakai HTTP request biasa, yang Anda terima cuma shell HTML awal β kontennya belum dirender. Data video tersembunyi di dalam objek JavaScript yang biasanya dieksekusi browser lalu dimasukkan ke DOM.
Kabar baiknya: YouTube tetap menyisipkan semua data yang Anda butuhkan di HTML mentah. Hanya saja bukan dalam elemen DOM, melainkan dalam dua blob JSON di dalam tag <script>:
ytInitialDataβ struktur halaman, daftar video, metrik engagement, token lanjutan komentarytInitialPlayerResponseβ metadata inti video (judul, deskripsi, durasi, format, caption)
Keduanya bisa diakses hanya dengan satu requests.get() β tanpa browser β asal Anda tahu cara mengekstrak dan mem-parse-nya. Itu adalah Metode 1 di bawah.
4 Cara Scrape YouTube dengan Python: Perbandingan Langsung
Sebelum membahas tiap metode, ini dulu matriks keputusannya. Saya sudah menguji keempat pendekatan ini dan membandingkannya berdasarkan kriteria yang benar-benar penting saat memilih tool untuk proyek nyata.
| Kriteria | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | No-Code (Thunderbit) |
|---|---|---|---|---|---|
| Kompleksitas setup | Rendah | Sedang | Rendah | Sedang (API key) | Tidak ada |
| Bisa handle rendering JS | Parsial (parse JSON) | Ya | Ya | N/A (API terstruktur) | Ya |
| Kecepatan | Cepat | Lambat | Cepat | Cepat | Cepat (cloud) |
| Risiko anti-bot | Sedang | Tinggi | Rendah | Tidak ada | Ditangani |
| Kuota / rate limit | Tidak ada (tapi bisa kena blok IP) | Tidak ada (tapi terdeteksi) | Tidak ada | 10.000 unit/hari | Berbasis credit |
| Ekstraksi komentar | Sulit | Bisa, tapi kompleks | Bawaan | Bawaan | Tergantung halaman |
| Transkrip | Tidak | Kompleks | Ya | Tidak | Tidak |
| Cocok untuk | Metadata cepat | Hasil pencarian, halaman dinamis | Metadata massal + komentar | Data terstruktur skala besar | Non-coder, ekspor cepat |
Ringkasan cepat:

Data YouTube Apa Saja yang Bisa Diekstrak, dan Pakai Metode Apa?
Ini tabel referensi yang saya harap sudah ada saat pertama kali mulai. Tidak ada satu metode pun yang bisa mencakup semua field β itulah kenapa artikel ini membahas empat metode.
| Field Data | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| Judul video | β | β | β | β | β |
| Jumlah tayangan | β | β | β | β | β |
| Jumlah like | β οΈ Tidak konsisten | β | β | β | β |
| Komentar (teks) | β | β οΈ Kompleks | β | β | β οΈ |
| Transkrip/subtitle | β | β οΈ | β | β | β |
| Tag | β | β | β | β | β οΈ |
| URL thumbnail | β | β | β | β | β |
| Jumlah subscriber channel | β οΈ | β | β | β | β |
| Tanggal upload | β | β | β | β | β |
| Durasi video | β | β | β | β | β |
| Data khusus Shorts | β | β οΈ | β | β οΈ | β οΈ |
Pilih metode berdasarkan baris mana yang paling penting untuk proyek Anda. Kalau Anda butuh komentar dan transkrip, yt-dlp jelas unggul. Kalau Anda butuh data terstruktur dalam skala menengah, API adalah pilihan terbaik. Kalau Anda butuh data dalam dua menit, lanjut ke bagian Thunderbit.

Metode 1: Scrape YouTube dengan Python Menggunakan requests + BeautifulSoup (Parsing ytInitialData)
Metode ini memanfaatkan fakta bahwa YouTube menyisipkan semua data halaman sebagai JSON di dalam HTML mentah. Anda tidak perlu browser β Anda hanya perlu tahu di mana mencarinya.
- Tingkat kesulitan: Pemula
- Waktu yang dibutuhkan: ~15 menit
- Yang dibutuhkan: Python 3.10+,
requests,beautifulsoup4
Langkah 1: Kirim GET Request ke Halaman YouTube
Kirim request dengan header User-Agent yang realistis. Header default python-requests/2.x biasanya langsung diblokir β panduan header dari ScrapeOps menegaskan bahwa ini kesalahan paling umum bagi pemula.
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", # melewati halaman consent EU
}
url = "https://www.youtube.com/@mkbhd/videos"
response = requests.get(url, headers=HEADERS)
print(response.status_code) # Seharusnya 200
Cookie CONSENT sangat penting β tanpa ini, request dari region EU akan dialihkan ke consent.youtube.com, yang hanya menampilkan HTML tanpa ytInitialData.
Langkah 2: Parse HTML dan Temukan Script ytInitialData
Gunakan BeautifulSoup atau regex untuk mencari tag <script> yang berisi var ytInitialData =:
import re
import json
# Ekstrak JSON ytInitialData
match = re.search(
r"var ytInitialData\s*=\s*({.*?});</script>",
response.text,
re.DOTALL
)
if match:
data = json.loads(match.group(1))
print("ytInitialData berhasil diekstrak")
else:
print("ytInitialData tidak ditemukan β cek header/cookie Anda")
Kesalahan yang sering terjadi: memakai .*? yang tidak greedy dengan penanda akhir hanya };. Penutup objek bersarang muncul terus-menerus di dalam JSON dan akan memotong capture terlalu awal. Gunakan };</script> seperti yang dilakukan Scrapfly dalam scraper 2026-nya β itu adalah assignment terakhir di blok script itu sendiri.
Langkah 3: Telusuri Struktur JSON untuk Mengambil Data Video
Struktur JSON-nya sangat bertingkat. Daripada meng-hardcode path yang gampang rusak setiap kali YouTube mengubah struktur (dan itu sering terjadi β issue tracker yt-dlp mendokumentasikan banyak perubahan format sejak 2023), lebih aman pakai pencarian key secara rekursif:
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)
# Ekstrak info video dari halaman channel
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"Ditemukan {len(videos)} video")
for v in videos[:5]:
print(f" {v['title']} β {v['views']}")
Pendekatan rekursif ini juga dipakai oleh scrapetube, yt-dlp, dan Scrapfly β dan terbukti tahan terhadap perubahan struktur JSON YouTube yang sering terjadi.
Langkah 4: Ekspor Data ke CSV atau Excel
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("Data berhasil diekspor ke youtube_videos.csv")
Kapan Metode Ini Dipakai, dan Kapan Tidak
Cocok untuk: Mengambil metadata cepat dari beberapa halaman channel atau video. Tool SEO ringan. Analisis sekali jalan yang cuma butuh judul, views, dan tanggal upload.
Keterbatasan: Struktur JSON sering berubah β beberapa breakage yang sudah terdokumentasi termasuk refactor tombol like (2023: toggleButtonRenderer β segmentedLikeDislikeButtonViewModel), refactor deskripsi (2023: description.runs[] β attributedDescription.content), dan redesain tab Videos di channel (2022β2023: gridRenderer β richGridRenderer). IP dari datacenter biasanya kena soft-block setelah 50β200 request. Tidak ada komentar, tidak ada transkrip.
Metode 2: Scrape YouTube dengan Python Menggunakan Selenium atau Playwright
Kalau Anda perlu berinteraksi dengan halaman β scrolling hasil pencarian, klik tab, buka deskripsi β otomatisasi browser adalah jalannya.
- Tingkat kesulitan: Menengah
- Waktu yang dibutuhkan: ~30 menit
- Yang dibutuhkan: Python 3.10+, Playwright (
pip install playwright && playwright install) atau Selenium + ChromeDriver
Saya lebih merekomendasikan Playwright daripada Selenium untuk proyek baru. Benchmark TestDino 2026 menunjukkan Playwright kira-kira 1,85Γ lebih cepat per aksi, memakai ~2,1Γ lebih sedikit memori, dan mendukung kapasitas paralel ~4Γ lebih besar dibanding Selenium. Playwright memakai WebSocket persisten melalui Chrome DevTools Protocol, sedangkan Selenium memakai WebDriver lewat HTTP, jadi ada lapisan translasi untuk setiap perintah.
Langkah 1: Setup Playwright
pip install playwright
playwright install chromium
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False) # mode headful mengurangi deteksi
context = browser.new_context()
# Pasang cookie consent untuk melewati halaman EU
context.add_cookies([{
"name": "SOCS",
"value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
"domain": ".youtube.com",
"path": "/",
}])
page = context.new_page()
Langkah 2: Buka Halaman YouTube dan Tunggu Konten Dimuat
page.goto("https://www.youtube.com/@mkbhd/videos")
page.wait_for_selector("a#video-title-link", timeout=15000)
print("Halaman dimuat β elemen video terlihat")
Kalau Anda scraping hasil pencarian, gunakan https://www.youtube.com/results?search_query=your+query.
Langkah 3: Handle Infinite Scroll untuk Memuat Lebih Banyak Video
YouTube memakai infinite scroll di halaman channel dan hasil pencarian. Berikut loop scrollHeight yang umum dipakai, disesuaikan dari panduan scroll Scrapfly:
prev_height = -1
max_scrolls = 20 # batasi ini β channel dengan 10 ribu video bisa scroll tanpa akhir
scroll_count = 0
while scroll_count < max_scrolls:
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
page.wait_for_timeout(1500) # tunggu konten baru dimuat
new_height = page.evaluate("document.body.scrollHeight")
if new_height == prev_height:
break # tidak ada konten baru yang dimuat
prev_height = new_height
scroll_count += 1
print(f"Sudah scroll {scroll_count} kali")
Langkah 4: Ekstrak Data Video dari Halaman yang Sudah Dirender
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"Berhasil mengekstrak {len(videos)} video")
Untuk jumlah views dan tanggal upload, Anda perlu mengambil elemen sibling. Panduan Crawlee 2025 mengingatkan bahwa id="video-title-link" tidak selalu universal β YouTube punya beberapa varian halaman. Fallback yang lebih kuat adalah a[href*="watch"].
Langkah 5: Ekspor ke CSV atau 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()
Kapan Metode Ini Dipakai, dan Kapan Tidak
Cocok untuk: Scraping hasil pencarian, interaksi dengan elemen halaman dinamis (klik tab, buka deskripsi), apa pun yang membutuhkan DOM lengkap.
Keterbatasan: Lambat (~1,5β3 detik per video dalam alur scroll-extract). Risiko deteksi anti-bot tinggi β Selenium standar mengatur navigator.webdriver === true, yang langsung terbaca oleh detektor JS apa pun. Berat di resource (setiap instance browser memakai 200β500 MB RAM). Untuk 100 video, bisa 3β8 menit, dibanding detik dengan yt-dlp.
Metode 3: Scrape YouTube dengan Python Menggunakan yt-dlp
yt-dlp adalah Swiss Army knife untuk scraping YouTube. Ini adalah fork komunitas dari youtube-dl dengan lebih dari 157.000 bintang GitHub, rilis nightly yang aktif, serta dukungan bawaan untuk metadata, komentar, transkrip, dan scraping batch β semuanya tanpa browser atau API key.
- Tingkat kesulitan: Pemula hingga Menengah
- Waktu yang dibutuhkan: ~10 menit
- Yang dibutuhkan: Python 3.10+,
pip install yt-dlp
Langkah 1: Install yt-dlp
pip install yt-dlp
Tidak perlu browser driver, tidak perlu API key, tidak perlu file konfigurasi.
Langkah 2: Ekstrak Metadata Video Tanpa Download
import yt_dlp
opts = {
"quiet": True,
"skip_download": True, # tidak mengunduh video β hanya metadata
"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"Title: {info['title']}")
print(f"Views: {info['view_count']:,}")
print(f"Likes: {info.get('like_count', 'N/A')}")
print(f"Duration: {info['duration']}s")
print(f"Upload date: {info['upload_date']}")
print(f"Channel: {info['channel']} ({info.get('channel_follower_count', 'N/A')} subs)")
print(f"Tags: {info.get('tags', [])[:5]}")
Pemanggilan extract_info biasanya mengembalikan 80β120 field tergantung kondisi video: 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, dan masih banyak lagi.
Langkah 3: Ekstrak Komentar dari Video YouTube
opts = {
"quiet": True,
"skip_download": True,
"getcomments": True,
"extractor_args": {
"youtube": {
"max_comments": ["200", "50", "50", "10"], # total, parent, reply-per, reply-total
"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"Berhasil mengambil {len(comments)} komentar")
for c in comments[:3]:
print(f" [{c.get('like_count', 0)} likes] {c['author']}: {c['text'][:80]}...")
Ekstraksi komentar memang lambat. Issue #3532 di yt-dlp melaporkan kecepatan fetch komentar sekitar ~30 KB/s β video dengan 100 ribu komentar bisa memakan waktu berjam-jam. Issue #11849 mendokumentasikan video di mana URL format kedaluwarsa (~6 jam) sebelum paginasi komentar selesai. Untuk video besar, set max_comments secara agresif.
Langkah 4: Ekstrak Transkrip dan Subtitle
Baik YouTube Data API maupun parsing BS4 tidak bisa memberikan transkrip penuh. Ini keunggulan unik yt-dlp.
opts = {
"quiet": True,
"skip_download": True,
"writesubtitles": True,
"writeautomaticsub": True,
"subtitleslangs": ["en", "en-orig"],
"subtitlesformat": "json3", # mudah diparse mesin: start/dur dalam ms + teks
"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
)
# Akses data subtitle langsung dari dict info
auto_captions = info.get("automatic_captions", {})
manual_subs = info.get("subtitles", {})
print(f"Bahasa auto-caption: {list(auto_captions.keys())[:10]}")
print(f"Bahasa subtitle manual: {list(manual_subs.keys())}")
Format json3 lebih disarankan untuk parsing mesin β setiap segmen punya start/dur dalam milidetik plus teks. Kode bahasa mengikuti BCP-47 (en, en-US, zh-Hans, ja, es).
Langkah 5: Scrape Banyak Video atau Satu Channel Sekaligus
opts = {
"quiet": True,
"skip_download": True,
"extract_flat": "in_playlist", # cepat β hanya ID dan judul video
"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"Ditemukan {len(entries)} video di channel")
for e in entries[:5]:
print(f" {e.get('title', 'N/A')} β {e.get('id')}")
Berikan URL channel, URL playlist, atau bahkan query pencarian (ytsearch10:python scraping), lalu yt-dlp akan menangani pagination secara internal.
Kapan Metode Ini Dipakai, dan Kapan Tidak
Cocok untuk: Ekstraksi metadata massal, komentar, transkrip, download video, scraping seluruh channel yang membutuhkan kumpulan field lengkap.
Keterbatasan: Kurang ideal untuk scraping halaman hasil pencarian (Selenium/Playwright lebih cocok). Perlombaan anti-bot 2024β2026 membuat yt-dlp lebih kompleks digunakan dalam skala besar β YouTube kini menerapkan BotGuard attestation dan PO Tokens pada beberapa klien. Untuk produksi, instal plugin bgutil-ytdlp-pot-provider dan gunakan --cookies-from-browser chrome (dengan akun cadangan β tim yt-dlp memperingatkan bahwa cookies dari akun Google asli bisa membuat akun tersebut diblokir).
Metode 4: Scrape YouTube dengan Python Menggunakan YouTube Data API
YouTube Data API v3 resmi adalah cara paling andal dan terstruktur untuk mengambil data YouTube. Responsnya JSON yang rapi, field-nya terdokumentasi, dan tidak ada perang kucing-kucingan anti-bot. Tapi ada satu hal yang sering disederhanakan tutorial: sistem quota.
- Tingkat kesulitan: Menengah
- Waktu yang dibutuhkan: ~20 menit (termasuk setup API key)
- Yang dibutuhkan: Python 3.10+, Google Cloud project,
pip install google-api-python-client
Langkah 1: Dapatkan API Key YouTube Data API
- Buka Google Cloud Console
- Buat project baru atau pilih yang sudah ada
- Buka APIs & Services β Library β cari "YouTube Data API v3" β Enable
- Buka APIs & Services β Credentials β Create Credentials β API Key
- Salin key tersebut β nanti dipakai di kode di bawah
Langkah 2: Lakukan API Call Pertama Anda
from googleapiclient.discovery import build
API_KEY = "YOUR_API_KEY_HERE"
youtube = build("youtube", "v3", developerKey=API_KEY)
# Ambil detail video tertentu
response = youtube.videos().list(
part="snippet,statistics,contentDetails",
id="dQw4w9WgXcQ"
).execute()
video = response["items"][0]
print(f"Title: {video['snippet']['title']}")
print(f"Views: {video['statistics']['viewCount']}")
print(f"Likes: {video['statistics'].get('likeCount', 'hidden')}")
print(f"Comments: {video['statistics'].get('commentCount', 'disabled')}")
print(f"Duration: {video['contentDetails']['duration']}")
print(f"Tags: {video['snippet'].get('tags', [])[:5]}")
Responsnya rapi, bertipe, dan terdokumentasi. Tidak perlu mengorek-orek JSON.
Langkah 3: Ekstrak Detail Video, Info Channel, dan Komentar
# Cari video
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']}")
# Ambil komentar
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']} likes] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")
Realita Quota YouTube API: Hal yang Jarang Dijelaskan Tutorial
Ini bagian yang membedakan panduan berguna dari sekadar tutorial copy-paste. Alokasi default adalah 10.000 unit quota per hari, yang di-reset setiap tengah malam waktu Pacific. Berikut biaya tiap panggilan:
| API Endpoint | Biaya Quota per Panggilan | Max Results per Panggilan |
|---|---|---|
search.list | 100 unit | 50 hasil |
videos.list | 1 unit | 50 video ID (bisa dibatch) |
channels.list | 1 unit | 50 channel ID |
commentThreads.list | 1 unit | 100 komentar |
captions.list | 50 unit | N/A |
Sekarang hitung-hitungannya. Misalnya Anda ingin scrape 1.000 hasil pencarian:
- Panggilan search: 1.000 hasil Γ· 50 per halaman = 20 panggilan Γ 100 unit = 2.000 unit (20% budget harian langsung habis)
- Detail video untuk 1.000 video tersebut: 1.000 ID Γ· 50 per batch = 20 panggilan Γ 1 unit = 20 unit (murah β
videos.listyang dibatch benar-benar menyelamatkan) - Komentar untuk 1.000 video itu (asumsi 1 halaman per video): 1.000 panggilan Γ 1 unit = 1.000 unit
Total: sekitar 3.020 unit untuk scrape skala menengah. Tapi kalau video-video itu punya thread komentar yang dalam (50+ halaman per video), sisa 7.000 unit akan cepat habis. Satu video dengan 50.000 komentar = sekitar 500 halaman = 500 unit. Scrape 20 video seperti itu, dan jatah harian Anda habis.
Proses kenaikan quota butuh audit kepatuhan penuh: URL privacy policy, URL ToS, video walkthrough aplikasi, dan justifikasi matematika quota. Laporan komunitas menyebut respons Google biasanya 3β5 hari kerja, approval penuh bisa memakan waktu berminggu-minggu sampai berbulan-bulan, dan banyak aplikasi ditolak β terutama untuk use case "saya ingin lebih banyak data untuk analisis".
Kapan pakai API: Skala kecil hingga menengah, saat Anda butuh data yang terstruktur dan andal, saat komentar dan statistik channel penting, dan saat Anda bisa menerima batas quota.
Kapan scraping lebih masuk akal: Proyek skala besar (>10 ribu video/hari), field yang tidak diekspos API (transkrip penuh β captions.download butuh OAuth + izin pemilik video), atau saat Anda butuh lebih dari 500 hasil pencarian per query (limit API ini keras, terlepas dari klaim totalResults).
Jalan Pintas No-Code: Scrape YouTube dengan Thunderbit (Tanpa Python)
Kalau Anda memang butuh Python untuk pipeline data, gunakan Metode 1β4 di atas. Tapi kalau Anda butuh data YouTube dalam 2 menit β misalnya Anda marketer yang sedang menarik statistik kompetitor, atau developer yang cuma ingin ambil data cepat tanpa setup environment proyek β ada cara yang lebih cepat.
Thunderbit adalah ekstensi Chrome AI web scraper yang kami buat khusus untuk situasi ketika menulis kode terasa berlebihan. Thunderbit bekerja langsung di halaman YouTube di browser Anda.
Cara Scrape YouTube dengan Thunderbit dalam 3 Langkah
Langkah 1: Install ekstensi Thunderbit Chrome lalu buka halaman channel YouTube, halaman hasil pencarian, atau halaman video.
Langkah 2: Klik "AI Suggest Fields" di sidebar Thunderbit. AI akan membaca halaman dan menyarankan kolom seperti judul video, views, tanggal upload, durasi, nama channel, dan URL thumbnail. Anda bisa menambah, menghapus, atau mengganti nama kolom sesuai kebutuhan.
Langkah 3: Klik "Scrape" lalu ekspor ke Google Sheets, Excel, CSV, Airtable, atau Notion. Datanya langsung masuk ke tabel yang rapi dan siap dipakai.
Coba Thunderbit untuk scraping YouTube
Cocok untuk Siapa?
- Marketer yang butuh data channel kompetitor tapi tidak bisa coding
- Developer yang ingin ambil data cepat tanpa menyiapkan virtual environment dan memasang dependency
- Siapa pun yang mentok di anti-bot wall β Thunderbit melakukan scraping di sesi browser Anda sendiri yang sudah login, sehingga cookie dan PO token Anda ikut terbawa. Ini membantu melewati banyak masalah blokir yang sering menghantui scraper sisi server
- Thunderbit juga bisa memakai subpage scraping untuk membuka tiap halaman video dan memperkaya tabel dengan detail tambahan (jumlah like, deskripsi, tag)
Untuk melihat lebih dalam bagaimana Thunderbit menangani YouTube secara spesifik, cek template Thunderbit YouTube Channel Scraper dan channel YouTube Thunderbit.
Tips Agar Scrape YouTube dengan Python Tidak Mudah Diblokir
Tips ini berlaku untuk semua empat metode Python. Langkah anti-bot YouTube dinilai tingkat kesulitannya 6/10 oleh ScrapeOps, dengan tiga sinyal utama: analisis perilaku IP, kebutuhan eksekusi JS, dan struktur HTML yang sering berubah.
Untuk semua metode:
- Rotasi User-Agent dan seluruh header β
Accept,Accept-Language,Sec-CH-UAclient hints harus cocok dengan UA yang diklaim. Panduan ScraperAPI 2026 punya daftar terbaru. - Tambahkan jeda acak 2β8 detik antar request. Interval yang tetap justru memicu deteksi.
- Gunakan residential proxy untuk scraping lebih dari beberapa halaman. IP datacenter (AWS, GCP, Hetzner) pada praktiknya sudah hampir mati untuk scraping YouTube di 2025β2026.
- Rotasi session + IP secara bersamaan β YouTube mengaitkan sesi ke IP, dan cookie sesi yang sama muncul di dua IP berbeda adalah tanda merah.
Untuk requests + BS4: Set cookie CONSENT=YES+cb. Tanpa ini, request dari EU akan diarahkan ke halaman consent yang tidak punya data.
Untuk Selenium/Playwright: Jalankan mode headful dengan xvfb di server Linux, bukan --headless=new β Chrome headless masih membocorkan cukup banyak sinyal fingerprint untuk detektor yang lebih canggih. Pertimbangkan playwright-stealth yang menerapkan sekitar 17 evasions.
Untuk yt-dlp: Gunakan opsi sleep_interval dan max_sleep_interval. Pasang plugin bgutil-ytdlp-pot-provider untuk pembuatan PO Token. Gunakan --cookies-from-browser chrome dengan akun cadangan.
Untuk API: Pantau penggunaan quota lewat Google Cloud Console dan batch request secara efisien. Satu panggilan videos.list dengan 50 ID dipisahkan koma hanya biaya 1 unit β manfaatkan itu.
Untuk Thunderbit: Langkah anti-bot ditangani otomatis karena scraping dilakukan di sesi browser Anda. Anda pada dasarnya hanya mengotomatisasi apa yang memang akan Anda lakukan secara manual.
Apakah Legal Scrape YouTube dengan Python?
Jawabannya tergantung pada apa yang Anda scrape, bagaimana cara Anda melakukannya, dan untuk apa data itu dipakai.
Lanskap hukumnya berubah pada 2024 lewat Meta Platforms v. Bright Data (N.D. Cal., Januari 2024), ketika Judge Chen memutuskan bahwa ToS Meta hanya melarang scraping saat login, bukan scraping data publik saat logout. Sejak putusan ini, scraping data yang bisa diakses publik menjadi "jauh lebih rendah risikonya". Di sisi lain, hiQ v. LinkedIn berakhir dengan putusan $500.000 terhadap hiQ atas pelanggaran ToS, pelanggaran CFAA (akun palsu), dan trespass to chattels β plus perintah permanen.
Terms of Service YouTube sendiri sangat jelas: "You are not allowed to access the Service using any automated means (such as robots, botnets or scrapers)" kecuali dengan izin tertulis sebelumnya atau jika diizinkan oleh hukum yang berlaku. YouTube Data API adalah cara resmi yang disetujui untuk mengakses data.
Beberapa aturan praktis:
- Scraping data publik untuk riset pribadi atau analisis non-komersial umumnya risikonya lebih rendah
- API adalah jalur paling aman β memang secara eksplisit diizinkan
- Hindari scraping konten privat atau yang terkunci login, mengunduh video berhak cipta untuk redistribusi, atau melanggar GDPR dengan data pribadi dari komentar
- Komentar YouTube mengandung data pribadi menurut GDPR Art. 4(1) β perlakukan informasi subjek data UE dengan hati-hati
- Konsultasikan dengan penasihat hukum untuk proyek scraping komersial
Ini bukan nasihat hukum. Lanskapnya berubah cepat β gelombang baru gugatan DMCA Β§1201 dari kreator terhadap perusahaan AI yang men-scrape YouTube untuk data training ikut membentuk ulang situasi pada 2025β2026.
Metode Mana yang Harus Anda Pakai untuk Scrape YouTube dengan Python?
Panduan keputusannya:
- Butuh metadata cepat dari beberapa halaman? β Metode 1 (requests + BS4). Cepat, ringan, tanpa dependensi selain
requestsdanbeautifulsoup4. - Butuh scrape hasil pencarian atau berinteraksi dengan halaman dinamis? β Metode 2 (Selenium/Playwright). Render browser penuh, dukungan infinite scroll, tetapi lambat dan mudah terdeteksi.
- Butuh metadata massal, komentar, atau transkrip? β Metode 3 (yt-dlp). Tool tunggal paling kapabel β 157 ribu+ bintang bukan tanpa alasan.
- Butuh data terstruktur dan andal dalam skala menengah? β Metode 4 (YouTube Data API). Resmi, rapi, tapi dibatasi quota 10.000 unit/hari.
- Butuh data dalam 2 menit tanpa menulis kode? β Thunderbit. Berbasis browser, didukung AI, ekspor ke Google Sheets hanya dalam beberapa klik.
Tidak ada satu metode yang cocok untuk semua kebutuhan. Simpan tabel perbandingan dan referensi field data di atas β itu akan menghemat banyak waktu di proyek berikutnya. Dan kalau Anda ingin mempelajari pendekatan web scraping lainnya, kami juga punya banyak panduan di blog Thunderbit, mulai dari tutorial scraping Python sampai scraping data ke Google Sheets.
Coba Thunderbit untuk scraping YouTube Get Started Free
FAQ
Bisa scrape YouTube tanpa API key?
Bisa. Metode 1 (requests + BS4), 2 (Selenium/Playwright), dan 3 (yt-dlp) tidak membutuhkan API key. Hanya Metode 4 (YouTube Data API) yang memerlukannya. Thunderbit juga bisa digunakan tanpa API key apa pun β scraping langsung di browser Anda.
Apa cara tercepat untuk scrape YouTube dengan Python?
Untuk Python, yt-dlp dan requests + BS4 adalah yang paling cepat β keduanya menghindari overhead browser dan bisa mengambil metadata dalam hitungan detik per video. yt-dlp sangat cepat untuk operasi batch karena pagination ditangani secara internal. Untuk pengguna non-Python, Thunderbit adalah yang tercepat secara keseluruhan karena hampir tanpa waktu setup.
Bagaimana cara scrape komentar YouTube dengan Python?
yt-dlp punya ekstraksi komentar bawaan lewat opsi getcomments β ini jalur paling sederhana. YouTube Data API juga mendukung komentar lewat commentThreads.list (1 unit quota per panggilan, hingga 100 komentar per halaman). Selenium/Playwright secara teknis bisa melakukannya dengan scrolling dan mengekstrak elemen komentar yang sudah dirender, tapi lambat dan rapuh.
Bisa scrape YouTube Shorts dengan Python?
Bisa. yt-dlp menangani metadata Shorts dengan baik β ia memperlakukan Shorts seperti video biasa dengan field tambahan khusus Shorts. YouTube Data API punya dukungan parsial (perhitungan views Shorts berubah pada 30 April 2025 β views kini menghitung setiap mulai pemutaran/ulang pemutaran). BS4 dan Selenium/Playwright punya dukungan Shorts yang terbatas karena shelf Shorts memakai struktur DOM yang berbeda.
Berapa banyak video YouTube yang bisa saya scrape per hari?
Dengan YouTube Data API, batasnya sekitar ~10.000 unit quota/hari. Kalau memakai panggilan videos.list yang dibatch (50 ID per panggilan dengan biaya 1 unit), secara teori bisa sampai 500.000 lookup statistik video per hari β tetapi search.list yang biayanya 100 unit per panggilan akan cepat menghabiskan budget. Untuk metode scraping (BS4, Selenium, yt-dlp), batasnya lebih bersifat praktis daripada angka keras: blok IP biasanya muncul setelah beberapa ratus sampai beberapa ribu request per IP per hari, tergantung proxy dan pola request Anda. Thunderbit memakai sistem credit yang terkait dengan plan Anda.
Pelajari Lebih Lanjut


