Eğer bir kez requests.get("https://www.youtube.com/...") deyip sonucu BeautifulSoup ile ayrıştırarak video başlıklarını çekmeye çalıştıysanız, neyle karşılaştığınızı zaten biliyorsunuzdur: önünüze içi boş <div> etiketleriyle dolu bir sayfa gelir ve işinize yarayacak veri neredeyse hiç çıkmaz.
YouTube’u ilk kez kazımaya çalışan geliştiricilerden en sık duyduğum hayal kırıklığı tam olarak bu. YouTube bir tek sayfalı uygulama (SPA) — yani neredeyse her şeyi istemci tarafında, JavaScript ile üretiyor. Python betiğinizin aldığı HTML ise sadece bir iskelet. Asıl video başlıkları, görüntülenme sayıları ve diğer metaveriler mi? Onlar, sayfa yüklendikten sonra JS tarafından enjekte edilen ytInitialData adlı dev bir JSON bloğunun içinde duruyor.
Bu yüzden kulağa mantıklı gelen soup.find("div", class_="ytd-video-renderer") çağrınız None döndürüyor; çünkü o öğe ham HTTP yanıtında gerçekten yok. Bunu fark edince bütün tablo yerine oturuyor — aşağıdaki dört yöntem de deneme-yanılma, hatalarla boğuşma ve epeyce GitHub issue okumanın ürünü. Her yaklaşımı tek tek anlatacağım, hangisini ne zaman kullanmanız gerektiğini göstereceğim ve sonunda kurulum gerektirmeden, doğrudan veriye ulaşmak isteyenler için hızlı bir alternatif de paylaşacağım.
Neden YouTube'u Python ile Kazımak İsteyelim?
YouTube sadece bir video platformu değil — aynı zamanda ayda 2,58 milyar aktif kullanıcıya ulaşan devasa bir veri kaynağı. 5,1 milyardan fazla video ve her dakika yüklenen 500+ saatlik içerik ile, işletmelere, araştırmacılara ve içerik üreticilerine programlı olarak analiz etmek isteyebilecekleri kocaman bir açık veri havuzu sunuyor.
İşin asıl kilit noktası şu: YouTube’un kendi analiz ekranı yalnızca kendi kanalınızın verilerini gösterir. Rakibinizin içerik yükleme hızını anlamak, nişinizde öne çıkan konuları takip etmek ya da başka birinin videolarındaki yorumlardan kitle duyarlılığını analiz etmek istiyorsanız, veriyi kendiniz çekmeniz gerekir.
Sahada en sık gördüğüm kullanım alanları şunlar:
| Kullanım Alanı | Kimler İçin | İçerdiği Veri |
|---|---|---|
| Rakip analizi | Pazarlama ekipleri, içerik stratejistleri | Görüntülenme sayıları, yükleme sıklığı, etkileşim oranları |
| Lead oluşturma | Satış ekipleri, B2B outreach ekipleri | Kanal iletişim bilgileri, açıklamalardaki iş e-postaları |
| Pazar araştırması | Ürün yöneticileri, analistler | Trend konular, yorumlardan çıkan kitle duyarlılığı |
| İçerik stratejisi | YouTuber’lar, ajanslar | En iyi performans gösteren formatlar, ideal başlık/etiket kalıpları |
| SEO / anahtar kelime araştırması | SEO uzmanları | Video başlıkları, etiketler, açıklamalar, sıralama sinyalleri |
| Marka takibi | PR ekipleri, marka yöneticileri | Video başlıklarında, yorumlarda ve açıklamalarda geçen marka adları |
| Akademik araştırma | Araştırmacılar, veri bilimciler | Duygu analizi için yorum veri setleri (2025 tarihli bir çalışmada 45 bin YouTube yorumu üzerinde BERT ince ayarı yapılarak %93,1 doğruluk elde edildi) |
Örneğin DJI, GoPro ve Insta360 arasındaki bir rekabet analizi, DJI’nin YouTube erişiminin (390 milyon görüntülenme) iki rakibin toplamını geçtiğini ortaya koydu — bu da YouTube Studio içinde asla göremeyeceğiniz türden bir içgörü.
Neden Sadece requests + BeautifulSoup Yetmiyor?
İşe yarayan yöntemlere geçmeden önce, neden ilk bakışta en mantıklı görünen yaklaşımın patladığını anlamanız gerekiyor. Bu, akademik bir ayrıntı değil — sizi saatlerce sürecek hata ayıklamadan kurtarır.
"Bariz" yaklaşım kabaca şöyle görünür:
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 — her zaman
Sonuç hep sıfırdır. ScrapeOps’un hata ayıklama rehberinde de söylendiği gibi: "Sayfa dinamik olarak yüklendi ve requests kütüphanesi bunu desteklemiyor." Teclado’nun başlangıç rehberi daha da net söylüyor: "requests ve BeautifulSoup tek başına JavaScript çalıştıramaz."
Scrapfly’ın 2026 YouTube incelemesi mekanizmayı açıklıyor: YouTube, Single Page Application (SPA) olarak tasarlanmış. Basit HTTP istekleri kullandığınızda yalnızca ilk HTML iskeletini alırsınız — gerçek içerik henüz render edilmemiş olur. Video verileri, tarayıcının normalde çalıştırıp DOM’a ekleyeceği JavaScript nesnelerinin içinde saklıdır.
İyi haber şu: YouTube ihtiyaç duyduğunuz verinin tamamını gerçekten ham HTML içine gömüyor. Sadece DOM öğeleri olarak değil — <script> etiketlerinin içinde yer alan iki JSON bloğu halinde:
ytInitialData— sayfa yapısı, video listeleri, etkileşim metrikleri, yorum devam token’larıytInitialPlayerResponse— temel video metaverileri (başlık, açıklama, süre, formatlar, altyazılar)
Bunların ikisine de tek bir requests.get() çağrısıyla ulaşabilirsiniz — tarayıcıya gerek yok — yeter ki nasıl çıkarıp ayrıştıracağınızı bilin. Aşağıdaki 1. yöntem tam olarak bunu yapıyor.
Python ile YouTube Kazımanın 4 Yolu: Yan Yana Karşılaştırma
Tek tek yöntemlere geçmeden önce karar tablosuna bakalım. Dört yaklaşımı da test ettim ve gerçek bir projede araç seçerken önemli olan kriterlere göre karşılaştırdım.
| Kriter | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | Kod yazmadan (Thunderbit) |
|---|---|---|---|---|---|
| Kurulum karmaşıklığı | Düşük | Orta | Düşük | Orta (API anahtarı) | Yok |
| JS render desteği | Kısmi (JSON ayrıştırma) | Evet | Evet | N/A (yapılandırılmış API) | Evet |
| Hız | Hızlı | Yavaş | Hızlı | Hızlı | Hızlı (bulut) |
| Anti-bot riski | Orta | Yüksek | Düşük | Yok | Yönetiliyor |
| Kota / hız sınırı | Yok (ama IP engeli olabilir) | Yok (ama tespit edilebilir) | Yok | Günlük 10.000 birim | Kredi tabanlı |
| Yorum çekme | Zor | Mümkün ama karmaşık | Yerleşik | Yerleşik | Sayfaya bağlı |
| Transkriptler | Hayır | Karmaşık | Evet | Hayır | Hayır |
| En uygun kullanım | Hızlı metaveri | Arama sonuçları, dinamik sayfalar | Toplu metaveri + yorumlar | Ölçeklenebilir yapılandırılmış veri | Kod bilmeyenler, hızlı dışa aktarma |
Kısa özet:

Hangi YouTube Verilerini Hangi Yöntemle Çekebilirsiniz?
Başta elimde olmasını çok istediğim referans tablo bu. Hiçbir yöntem her alanı kapsamaz — bu yüzden bu yazıda dört ayrı yöntem anlatıyorum.
| Veri Alanı | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| Video başlığı | ✅ | ✅ | ✅ | ✅ | ✅ |
| Görüntülenme sayısı | ✅ | ✅ | ✅ | ✅ | ✅ |
| Beğeni sayısı | ⚠️ Tutarsız | ✅ | ✅ | ✅ | ✅ |
| Yorumlar (metin) | ❌ | ⚠️ Karmaşık | ✅ | ✅ | ⚠️ |
| Transkript / altyazı | ❌ | ⚠️ | ✅ | ❌ | ❌ |
| Etiketler | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| Küçük resim URL’leri | ✅ | ✅ | ✅ | ✅ | ✅ |
| Kanal abone sayısı | ⚠️ | ✅ | ✅ | ✅ | ✅ |
| Yüklenme tarihi | ✅ | ✅ | ✅ | ✅ | ✅ |
| Video süresi | ✅ | ✅ | ✅ | ✅ | ✅ |
| Shorts’a özel veriler | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ |
Yönteminizi, projenizde hangi satırların kritik olduğuna göre seçin. Yorumlar ve transkriptler gerekiyorsa yt-dlp açık ara önde. Yapılandırılmış istatistikleri makul ölçekte istiyorsanız API en iyi seçenek. İki dakika içinde veri almak istiyorsanız aşağıdaki Thunderbit bölümüne atlayabilirsiniz.

Yöntem 1: requests + BeautifulSoup ile YouTube Kazıma (ytInitialData Ayrıştırma)
Bu yöntem, YouTube’un sayfa verisinin tamamını ham HTML içine JSON olarak gömmesinden yararlanır. Tarayıcıya ihtiyacınız yok — sadece nereye bakacağınızı bilmeniz yeterli.
- Zorluk: Başlangıç
- Gerekli Süre: ~15 dakika
- Gerekenler: Python 3.10+,
requests,beautifulsoup4
Adım 1: YouTube Sayfasına GET İsteği Gönderin
Gerçekçi bir User-Agent başlığı ile istek gönderin. Varsayılan python-requests/2.x başlığı çoğu zaman anında engel yer — ScrapeOps’un başlık rehberi bunun yeni başlayanlar için en büyük tuzaklardan biri olduğunu doğruluyor.
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", # AB onay ekranını aşar
}
url = "https://www.youtube.com/@mkbhd/videos"
response = requests.get(url, headers=HEADERS)
print(response.status_code) # 200 olmalı
CONSENT çerezi burada kritik. Bu olmadan AB bölgesinden gelen istekler consent.youtube.com adresine yönlendirilir ve içinde hiç ytInitialData bulunmayan bir HTML sayfası döner.
Adım 2: HTML'yi Ayrıştırın ve ytInitialData Script'ini Bulun
BeautifulSoup ya da regex kullanarak var ytInitialData = ifadesini içeren <script> etiketini bulun:
import re
import json
# ytInitialData JSON'unu çıkar
match = re.search(
r"var ytInitialData\s*=\s*({.*?});</script>",
response.text,
re.DOTALL
)
if match:
data = json.loads(match.group(1))
print("ytInitialData başarıyla çıkarıldı")
else:
print("ytInitialData bulunamadı — başlıklarınızı/çerezlerinizi kontrol edin")
Sık yapılan hata: sadece }; ile biten, açgözlü olmayan (.*?) bir desen kullanmak. JSON içinde iç içe kapanışlar çok sık geçtiği için eşleşme erken kesilir. Scrapfly’ın 2026 scraper’ında yaptığı gibi };</script> kullanın — çünkü bu, script bloğundaki son atamadır.
Adım 3: Video Verisini Çıkarmak İçin JSON Yapısında Gezin
JSON oldukça derin. YouTube yapıyı sık sık değiştiriyor — ki bu gerçekten düzenli olarak oluyor; yt-dlp’nin issue takibi 2023’ten beri birçok format değişikliğini belgeliyor — bu yüzden sabit yolları tek tek yazmak yerine özyinelemeli bir anahtar araması kullanın:
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)
# Kanal sayfasından video bilgilerini çıkar
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"{len(videos)} video bulundu")
for v in videos[:5]:
print(f" {v['title']} — {v['views']}")
Bu özyinelemeli yaklaşım, scrapetube, yt-dlp ve Scrapfly’ın da benimsediği yöntemdir — çünkü YouTube’un sık sık değiştirdiği JSON yapısına karşı daha dayanıklıdır.
Adım 4: Kazınan Veriyi CSV veya Excel'e Aktarın
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("Veri youtube_videos.csv dosyasına aktarıldı")
Bu Yöntem Ne Zaman Kullanılmalı, Ne Zaman Kullanılmamalı?
En uygun kullanım: Birkaç kanal veya video sayfasından hızlı metaveri çekmek. Hafif SEO araçları. Başlık, görüntülenme ve yüklenme tarihi gereken tek seferlik analizler.
Sınırlamalar: JSON yapısı değişebilir — bilinen kırılmalar arasında beğeni butonunun yeniden tasarımı (2023: toggleButtonRenderer → segmentedLikeDislikeButtonViewModel), açıklama yapısının değişimi (2023: description.runs[] → attributedDescription.content) ve kanalın Videos sekmesinin yeniden tasarımı (2022–2023: gridRenderer → richGridRenderer) var. Veri merkezi IP’leri genellikle 50–200 istekten sonra yumuşak engelle karşılaşır. Yorum yok, transkript yok.
Yöntem 2: Selenium veya Playwright ile YouTube Kazıma
Sayfayla etkileşime girmeniz gerekiyorsa — arama sonuçlarında gezinmek, sekmelere tıklamak, açıklamaları genişletmek gibi — tarayıcı otomasyonu en doğru seçimdir.
- Zorluk: Orta
- Gerekli Süre: ~30 dakika
- Gerekenler: Python 3.10+, Playwright (
pip install playwright && playwright install) veya Selenium + ChromeDriver
Yeni projelerde Selenium yerine Playwright’ı öneririm. TestDino’nun 2026 benchmark sonuçları Playwright’ın Selenium’a göre işlem başına yaklaşık 1,85 kat daha hızlı, ~2,1 kat daha az bellek tüketimli ve ~4 kat daha yüksek paralel kapasiteye sahip olduğunu gösteriyor. Playwright, Chrome DevTools Protocol üzerinden kalıcı bir WebSocket kullanırken Selenium, WebDriver-over-HTTP ile her komutta ek bir çeviri katmanı oluşturur.
Adım 1: Playwright Kurulumu
pip install playwright
playwright install chromium
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False) # görünür mod bazı tespitleri azaltır
context = browser.new_context()
# AB engelini aşmak için onay çerezi ekle
context.add_cookies([{
"name": "SOCS",
"value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
"domain": ".youtube.com",
"path": "/",
}])
page = context.new_page()
Adım 2: YouTube Sayfasına Gidin ve İçeriğin Yüklenmesini Bekleyin
page.goto("https://www.youtube.com/@mkbhd/videos")
page.wait_for_selector("a#video-title-link", timeout=15000)
print("Sayfa yüklendi — video öğeleri görünür durumda")
Arama sonuçlarını kazıyorsanız bunun yerine https://www.youtube.com/results?search_query=arama+sorgunuz adresine gidin.
Adım 3: Daha Fazla Video Yüklemek İçin Sonsuz Kaydırmayı Yönetin
YouTube, kanal sayfalarında ve arama sonuçlarında sonsuz kaydırma kullanır. Scrapfly’ın kaydırma rehberinden uyarlanmış klasik scrollHeight döngüsü şöyle:
prev_height = -1
max_scrolls = 20 # bunu sınırlayın — 10 bin videolu bir kanal sonsuza kadar kaydırılabilir
scroll_count = 0
while scroll_count < max_scrolls:
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
page.wait_for_timeout(1500) # yeni içeriğin yüklenmesini bekle
new_height = page.evaluate("document.body.scrollHeight")
if new_height == prev_height:
break # yeni içerik gelmedi
prev_height = new_height
scroll_count += 1
print(f"{scroll_count} kez kaydırıldı")
Adım 4: Render Edilmiş Sayfadan Video Verisini Çekin
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"{len(videos)} video çıkarıldı")
Görüntülenme sayıları ve yüklenme tarihleri için yan öğeleri de çekmeniz gerekir. Crawlee’nin 2025 rehberi, id="video-title-link" seçicisinin evrensel olmadığını, çünkü YouTube’un birden fazla sayfa varyantı sunduğunu belirtiyor. Daha sağlam bir yedek seçici a[href*="watch"] olur.
Adım 5: CSV veya Google Sheets'e Aktarın
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()
Bu Yöntem Ne Zaman Kullanılmalı, Ne Zaman Kullanılmamalı?
En uygun kullanım: Arama sonuçlarını kazımak, dinamik sayfa öğeleriyle etkileşmek (sekme tıklama, açıklama genişletme) ve tam render edilmiş DOM gerektiğinde.
Sınırlamalar: Yavaş (~kaydırma ve çıkarma akışında video başına 1,5–3 saniye). Anti-bot tespiti riski yüksek — sıradan Selenium navigator.webdriver === true değerini bırakır ve taraflı JS tespitleri bunu anında görür. Kaynak tüketimi de yüksektir (her tarayıcı örneği 200–500 MB RAM kullanabilir). 100 video için, yt-dlp’ye kıyasla saniyeler yerine 3–8 dakika beklemeyi göze alın.
Yöntem 3: yt-dlp ile YouTube Kazıma
yt-dlp, YouTube kazıma işinde elinizin altındaki İsviçre çakısı gibidir. youtube-dl’in topluluk tarafından sürdürülen bir çatallanmasıdır; 157.000’den fazla GitHub yıldızına sahiptir, aktif gece derlemeleri yayınlar ve tarayıcı ya da API anahtarı olmadan metaveri, yorum, transkript ve toplu kazıma desteği sunar.
- Zorluk: Başlangıç-Orta
- Gerekli Süre: ~10 dakika
- Gerekenler: Python 3.10+,
pip install yt-dlp
Adım 1: yt-dlp Kurulumu
pip install yt-dlp
Tarayıcı sürücüsü yok, API anahtarı yok, yapılandırma dosyası yok.
Adım 2: Video Metaverisini İndirmeden Çekin
import yt_dlp
opts = {
"quiet": True,
"skip_download": True, # video bytes yok — sadece metaveri
"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"Başlık: {info['title']}")
print(f"Görüntülenme: {info['view_count']:,}")
print(f"Beğeni: {info.get('like_count', 'N/A')}")
print(f"Süre: {info['duration']} sn")
print(f"Yüklenme tarihi: {info['upload_date']}")
print(f"Kanal: {info['channel']} ({info.get('channel_follower_count', 'N/A')} abone)")
print(f"Etiketler: {info.get('tags', [])[:5]}")
Tipik bir extract_info çağrısı, video durumuna göre 80–120 alan döndürür: 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 ve daha fazlası.
Adım 3: YouTube Videosundan Yorumları Çekin
opts = {
"quiet": True,
"skip_download": True,
"getcomments": True,
"extractor_args": {
"youtube": {
"max_comments": ["200", "50", "50", "10"], # toplam, ana yorum, yanıt/ana, toplam yanıt
"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"{len(comments)} yorum çekildi")
for c in comments[:3]:
print(f" [{c.get('like_count', 0)} beğeni] {c['author']}: {c['text'][:80]}...")
Yorum çekme işlemi yavaştır. yt-dlp Issue #3532, yorum çekme hızını yaklaşık ~30 KB/s olarak raporluyor — 100 bin yorumlu bir video saatler sürebilir. Issue #11849, format URL’lerinin yorum sayfalamadan önce (~6 saat içinde) süresinin dolduğu videoları belgeliyor. Büyük videolarda max_comments değerini agresif biçimde sınırlayın.
Adım 4: Transkript ve Altyazıları Çekin
Ne YouTube Data API ne de BS4 ayrıştırması tam transkript veremez. Bu, yt-dlp’nin en büyük artılarından biridir.
opts = {
"quiet": True,
"skip_download": True,
"writesubtitles": True,
"writeautomaticsub": True,
"subtitleslangs": ["en", "en-orig"],
"subtitlesformat": "json3", # makine ayrıştırmasına uygun: ms cinsinden start/dur + metin
"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
)
# Altyazı verilerine doğrudan info sözlüğünden erişin
auto_captions = info.get("automatic_captions", {})
manual_subs = info.get("subtitles", {})
print(f"Otomatik altyazı dilleri: {list(auto_captions.keys())[:10]}")
print(f"Manuel altyazı dilleri: {list(manual_subs.keys())}")
json3 biçimi makine ayrıştırması için daha uygundur — her segmentte milisaniye cinsinden start/dur ile metin parçaları bulunur. Dil kodları BCP-47 biçimindedir (en, en-US, zh-Hans, ja, es).
Adım 5: Birden Fazla Video ya da Tüm Kanalı Toplu Olarak Kazıyın
opts = {
"quiet": True,
"skip_download": True,
"extract_flat": "in_playlist", # hızlı — sadece video ID ve başlık
"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"Kanaldan {len(entries)} video bulundu")
for e in entries[:5]:
print(f" {e.get('title', 'N/A')} — {e.get('id')}")
Kanal URL’si, oynatma listesi URL’si ya da hatta bir arama sorgusu (ytsearch10:python scraping) verin; yt-dlp sayfalamayı kendi içinde halleder.
Bu Yöntem Ne Zaman Kullanılmalı, Ne Zaman Kullanılmamalı?
En uygun kullanım: Toplu metaveri çıkarma, yorumlar, transkriptler, video indirme ve tüm kanal genelinde tam alan setine ihtiyaç duyulan işler.
Sınırlamalar: Arama sonuç sayfalarını kazımak için en ideal seçenek değildir (orada Selenium/Playwright daha iyi). 2024–2026 anti-bot yarışı yt-dlp’yi büyük ölçekte çalıştırmayı daha karmaşık hale getirdi — YouTube artık bazı istemcilerde BotGuard doğrulaması ve PO Token uyguluyor. Üretim kullanımı için bgutil-ytdlp-pot-provider eklentisini kurun ve --cookies-from-browser chrome kullanın (tercihen tek kullanımlık bir hesapla — yt-dlp ekibi, gerçek bir Google hesabının çerezlerinin hesabın banlanmasına yol açabileceği konusunda uyarıyor).
Yöntem 4: YouTube Data API ile YouTube Kazıma
Resmî YouTube Data API v3, YouTube verisine ulaşmanın en güvenilir ve en yapılandırılmış yoludur. Yanıtlar temiz JSON’dur, alanlar belgelenmiştir ve anti-bot kedi-fare oyunu yoktur. Ama çoğu rehberin göz ardı ettiği bir detay var: kota sistemi.
- Zorluk: Orta
- Gerekli Süre: ~20 dakika (API anahtarı kurulumu dahil)
- Gerekenler: Python 3.10+, bir Google Cloud projesi,
pip install google-api-python-client
Adım 1: YouTube Data API Anahtarı Alın
- Google Cloud Console sayfasına gidin
- Yeni bir proje oluşturun (veya mevcut bir projeyi seçin)
- APIs & Services → Library bölümüne gidin, "YouTube Data API v3" arayın ve Enable edin
- APIs & Services → Credentials bölümüne gidin → Create Credentials → API Key seçin
- Anahtarı kopyalayın — aşağıdaki kodda kullanacaksınız
Adım 2: İlk API Çağrınızı Yapın
from googleapiclient.discovery import build
API_KEY = "YOUR_API_KEY_HERE"
youtube = build("youtube", "v3", developerKey=API_KEY)
# Belirli bir video için detayları çek
response = youtube.videos().list(
part="snippet,statistics,contentDetails",
id="dQw4w9WgXcQ"
).execute()
video = response["items"][0]
print(f"Başlık: {video['snippet']['title']}")
print(f"Görüntülenme: {video['statistics']['viewCount']}")
print(f"Beğeni: {video['statistics'].get('likeCount', 'gizli')}")
print(f"Yorum: {video['statistics'].get('commentCount', 'devre dışı')}")
print(f"Süre: {video['contentDetails']['duration']}")
print(f"Etiketler: {video['snippet'].get('tags', [])[:5]}")
Yanıt temiz, tipli ve belgeli. JSON kazımanız gerekmez.
Adım 3: Video Detaylarını, Kanal Bilgilerini ve Yorumları Çekin
# Video ara
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']}")
# Yorumları çek
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']} beğeni] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")
YouTube API Kotası Gerçeği (Kimsenin Söylemediği Kısım)
Bu bölüm, kopyala-yapıştır bir rehberle gerçekten işe yarar bir kılavuzu birbirinden ayırır. Varsayılan kota günlük 10.000 birimdir ve Pasifik saatine göre gece yarısı sıfırlanır. Her çağrının maliyeti şöyledir:
| API Uç Noktası | Çağrı Başına Kota Maliyeti | Çağrı Başına Maks. Sonuç |
|---|---|---|
search.list | 100 birim | 50 sonuç |
videos.list | 1 birim | 50 video ID’si (toplu) |
channels.list | 1 birim | 50 kanal ID’si |
commentThreads.list | 1 birim | 100 yorum |
captions.list | 50 birim | N/A |
Şimdi bir hesap yapalım. Diyelim ki 1.000 arama sonucunu kazımak istiyorsunuz:
- Arama çağrıları: 1.000 sonuç ÷ sayfa başına 50 = 20 çağrı × 100 birim = 2.000 birim (günlük bütçenin %20’si — gitti)
- Bu 1.000 video için detay çekme: 1.000 ID ÷ toplu başına 50 = 20 çağrı × 1 birim = 20 birim (ucuz — burada toplu
videos.listciddi avantaj sağlar) - Bu 1.000 video için yorumlar (sayfa başına 1 varsayımıyla): 1.000 çağrı × 1 birim = 1.000 birim
Toplam: orta ölçekli bir kazıma için yaklaşık 3.020 birim. Ama videoların yorum dizileri derinse (her biri 50+ sayfa), kalan 7.000 birim çok hızlı biter. 50.000 yorumlu bir video = yaklaşık 500 sayfa = 500 birim. Böyle 20 video kazırsanız, o gün kapanır.
Kota artışı süreci tam bir uyumluluk incelemesi ister: gizlilik politikası URL’si, hizmet şartları URL’si, uygulamanın video anlatımı ve kota hesabı gerekçesi. Topluluk raporlarına göre Google’ın tipik yanıt süresi 3–5 iş günü; tam onay haftalar hatta aylar sürebilir ve birçok başvuru reddedilir — özellikle de "analiz için daha fazla veriye ihtiyacım var" gibi kullanım senaryolarında.
API ne zaman kullanılmalı: Küçük-orta ölçekli işler, yapılandırılmış ve güvenilir veri gerektiğinde, yorumlar ve kanal istatistikleri önemliyse, kota sınırını kabul edebiliyorsanız.
Kazıma ne zaman daha mantıklı: Büyük ölçekli projeler (günde >10K video), API’nin açmadığı alanlar (tam transkriptler — captions.download OAuth + video sahibi izni ister) veya sorgu başına 500’den fazla sonuç gerektiğinde (API’nin totalResults iddiasından bağımsız sabit limit).
Kod Yazmadan Hızlı Yol: Thunderbit ile YouTube Kazıyın (Python Gerektirmez)
Bir veri akışı kuruyorsanız Python kullanın; o zaman yukarıdaki 1–4. yöntemler doğru seçimdir. Ama YouTube verisine 2 dakikada ihtiyacınız varsa — örneğin rakip istatistikleri toplayan bir pazarlamacıysanız ya da proje ortamı kurmadan hızlıca veri çekmek isteyen bir geliştiriciyseniz — daha hızlı bir yol da var.
Thunderbit, tam da kod yazmanın gereksiz kaldığı durumlar için geliştirdiğimiz bir AI web scraper Chrome uzantısıdır. YouTube sayfalarında doğrudan tarayıcınız içinde çalışır.
Thunderbit ile YouTube'u 3 Adımda Nasıl Kazırsınız?
1. Adım: Thunderbit Chrome uzantısını kurun ve bir YouTube kanal sayfası, arama sonuçları sayfası ya da video sayfası açın.
2. Adım: Thunderbit yan panelinde "AI Suggest Fields" düğmesine tıklayın. AI sayfayı okur ve video başlığı, görüntülenme sayısı, yüklenme tarihi, süre, kanal adı ve küçük resim URL’si gibi sütunlar önerir. İsterseniz sütun ekleyebilir, silebilir ya da yeniden adlandırabilirsiniz.
3. Adım: "Scrape" düğmesine tıklayın ve veriyi Google Sheets, Excel, CSV, Airtable veya Notion'a aktarın. Veri temiz bir tablo halinde hazır gelir.
YouTube kazıma için Thunderbit’i deneyin
Kimler İçin Uygun?
- Kod yazmayan ama rakip kanal verisine ihtiyaç duyan pazarlamacılar
- Sanal ortam kurup bağımlılık yüklemek istemeyen geliştiriciler
- Anti-bot engellerine takılan herkes — Thunderbit, kullanıcının kendi oturum açmış tarayıcı oturumunda kazıma yapar; çerezlerinizi ve PO token’larınızı kullanır. Bu da sunucu taraflı kazıyıcıların yaşadığı birçok engeli aşar
- Thunderbit ayrıca alt sayfa kazıma özelliğiyle her video sayfasını ziyaret edip tabloyu beğeni sayısı, açıklama, etiketler gibi ek bilgilerle zenginleştirebilir
Thunderbit’in YouTube özelinde nasıl çalıştığına daha yakından bakmak için Thunderbit YouTube Channel Scraper şablonuna ve Thunderbit YouTube kanalına göz atabilirsiniz.
Python ile YouTube Kazırken Engellenmemek İçin İpuçları
Bu ipuçları dört Python yöntemi için de geçerlidir. YouTube’un anti-bot önlemleri ScrapeOps tarafından 6/10 zorluk seviyesinde değerlendiriliyor; üç ana sinyal var: IP davranış analizi, JS çalıştırma gereksinimleri ve sık değişen HTML yapısı.
Tüm yöntemler için:
- User-Agent dizelerini ve tüm başlık setini döndürün —
Accept,Accept-Language,Sec-CH-UAgibi istemci ipuçları, beyan edilen UA ile eşleşmeli. ScraperAPI’nin 2026 rehberinde güncel bir liste var. - İstekler arasında 2–8 saniye arasında rastgele gecikmeler ekleyin. Sabit aralıklar tespit sinyalidir.
- Birkaç sayfayı aşan işler için residential proxy kullanın. Veri merkezi IP’leri (AWS, GCP, Hetzner) 2025–2026 itibarıyla YouTube kazıma için fiilen etkisiz hale geldi.
- Oturum ve IP’yi birlikte döndürün — YouTube oturumları IP ile ilişkilendirir; aynı oturum çerezinin iki farklı IP’de görünmesi kırmızı bayraktır.
requests + BS4 için: CONSENT=YES+cb çerezini ekleyin. Bu olmadan AB istekleri, veri içermeyen bir onay sayfasına yönlendirilir.
Selenium/Playwright için: Linux sunucularda --headless=new yerine xvfb ile görünür modda çalıştırın — headless Chrome, gelişmiş tespit sistemlerine yeterince parmak izi bırakabilir. Yaklaşık 17 kaçınma önlemi uygulayan playwright-stealth paketini de düşünebilirsiniz.
yt-dlp için: sleep_interval ve max_sleep_interval seçeneklerini kullanın. PO Token üretimi için bgutil-ytdlp-pot-provider eklentisini kurun. --cookies-from-browser chrome komutunu tek kullanımlık bir hesapla kullanın.
API için: Kota kullanımını Google Cloud Console üzerinden izleyin ve istekleri verimli biçimde toplu gönderin. 50 virgülle ayrılmış ID içeren tek bir videos.list çağrısı yalnızca 1 birim harcar — bunu kullanın.
Thunderbit için: Kazıma işlemi kendi tarayıcı oturumunuzda gerçekleştiği için anti-bot önlemleri zaten otomatik olarak yönetilir. Aslında sadece manuel yaptığınız işi otomatikleştirirsiniz.
Python ile YouTube Kazımak Yasal mı?
Bu, neyi kazıdığınıza, nasıl kazıdığınıza ve veriyi ne için kullandığınıza bağlıdır.
Hukuki tablo 2024’te Meta Platforms v. Bright Data davasıyla değişti (N.D. Cal., Ocak 2024). Yargıç Chen, Meta’nın ToS’inin yalnızca oturum açılmış kazımayı yasakladığına, oturum kapalı (açık) kazımayı ise yasaklamadığına karar verdi. Bu karardan sonra herkese açık veriyi kazımak "önemli ölçüde daha az riskli" hale geldi. Öte yandan hiQ v. LinkedIn davası, ToS ihlali, CFAA ihlalleri (sahte hesaplar) ve izinsiz giriş iddiaları nedeniyle hiQ aleyhine 500.000 dolarlık hükümle sona erdi — ayrıca kalıcı ihtiyati tedbir kararı verildi.
YouTube’un Hizmet Şartları oldukça açık: "Önceden yazılı izin almadığınız veya uygulanabilir hukukça izin verilmediği sürece, Servise otomatik araçlarla (robotlar, botnet’ler veya scraper’lar gibi) erişemezsiniz." YouTube Data API, veriye ulaşmanın resmî ve onaylı yoludur.
Birkaç pratik kural:
- Herkese açık veriyi kişisel araştırma veya ticari olmayan analiz için kazımak genellikle daha düşük risk taşır
- API en güvenli yoldur — açıkça yetkilendirilmiştir
- Gizli/giriş duvarlı içerikleri kazımaktan, telifli videoları yeniden dağıtmak için indirmekten veya yorumlardaki kişisel verilerle GDPR ihlali yapmaktan kaçının
- YouTube yorumları GDPR Madde 4(1) kapsamında kişisel veri içerebilir — AB veri sahiplerinin bilgilerini dikkatle yönetin
- Ticari kazıma projeleri için hukuk danışmanına başvurun
Bunların hiçbiri hukuk tavsiyesi değildir. Ortam hızla değişiyor — 2025–2026 döneminde YouTube’u eğitim verisi için kazıyan AI şirketlerine karşı içerik üreticilerinin açtığı yeni DMCA §1201 davaları tabloyu yeniden şekillendiriyor.
Python ile YouTube Kazımak İçin Hangi Yöntemi Kullanmalısınız?
Karar rehberi:
- Birkaç sayfadan hızlı metaveri mi gerekiyor? → Yöntem 1 (requests + BS4). Hızlı, hafif,
requestsvebeautifulsoup4dışında ek bağımlılık gerektirmez. - Arama sonuçlarını kazımak veya dinamik sayfalarla etkileşmek mi gerekiyor? → Yöntem 2 (Selenium/Playwright). Tam tarayıcı render’ı ve sonsuz kaydırma desteği sağlar, ama yavaştır ve tespite açıktır.
- Toplu metaveri, yorum veya transkript mi gerekiyor? → Yöntem 3 (yt-dlp). En yetenekli tek araç — 157 bin+ yıldız boşuna değil.
- Orta ölçekte yapılandırılmış ve güvenilir veri mi gerekiyor? → Yöntem 4 (YouTube Data API). Resmî, temiz, ama günlük 10.000 birim ile sınırlı.
- 2 dakikada, kod yazmadan veri mi gerekiyor? → Thunderbit. Tarayıcı tabanlı, AI destekli, birkaç tıkla Google Sheets’e aktarır.
Hiçbir yöntem her kullanım senaryosunu kapsamaz. Yukarıdaki karşılaştırma tablosunu ve çıkarılabilir alanlar referansını yer imlerine ekleyin — bir sonraki projede zaman kazandırır. Daha fazla web scraping yaklaşımını keşfetmek isterseniz, Thunderbit blog’da Python ile scraping eğitimlerinden Google Sheets’e veri aktarmaya kadar pek çok rehberimiz var.
YouTube kazıma için Thunderbit’i deneyin Get Started Free
Sık Sorulan Sorular
API anahtarı olmadan YouTube kazıyabilir miyim?
Evet. 1. yöntem (requests + BS4), 2. yöntem (Selenium/Playwright) ve 3. yöntem (yt-dlp) API anahtarı gerektirmez. Yalnızca 4. yöntem (YouTube Data API) anahtar ister. Thunderbit de API anahtarı olmadan çalışır — doğrudan tarayıcınızda kazıma yapar.
Python ile YouTube kazımanın en hızlı yolu nedir?
Python tarafında en hızlılar yt-dlp ve requests + BS4’dir — ikisi de tarayıcı yükünü ortadan kaldırır ve metaveriyi saniyeler içinde çekebilir. Toplu işlemlerde özellikle yt-dlp daha hızlıdır çünkü sayfalamayı kendi içinde yönetir. Python kullanmayanlar için ise en hızlı seçenek Thunderbit’tir; kurulum süresi neredeyse sıfırdır.
YouTube yorumlarını Python ile nasıl kazıyabilirim?
yt-dlp, getcomments seçeneğiyle yerleşik yorum çekme desteği sunar — en kolay yol budur. YouTube Data API de commentThreads.list üzerinden yorumları destekler (çağrı başına 1 kota birimi, sayfa başına en fazla 100 yorum). Selenium/Playwright bunu teknik olarak kaydırma ve render edilmiş yorum öğelerini çıkarma yoluyla yapabilir, ama yavaştır ve kırılgandır.
YouTube Shorts’u Python ile kazıyabilir miyim?
Evet. yt-dlp Shorts metaverisini gayet iyi işler — onları ek Shorts alanları olan normal videolar gibi ele alır. YouTube Data API kısmi destek sunar (Shorts görüntülenme sayımı 30 Nisan 2025’te değişti — artık herhangi bir oynatma başlangıcını/yeniden oynatmayı sayıyor). BS4 ve Selenium/Playwright’ta Shorts desteği sınırlıdır; çünkü Shorts akışı farklı DOM yapıları kullanır.
Günde kaç YouTube videosu kazıyabilirim?
YouTube Data API ile günlük yaklaşık 10.000 kota birimiyle sınırlısınız. Toplu videos.list çağrılarıyla (çağrı başına 50 ID, 1 birim), günde 500.000’e kadar video istatistik sorgusu yapılabilir — ancak search.list çağrısının 100 birim maliyeti bütçeyi hızlıca tüketir. Kazıma yöntemlerinde (BS4, Selenium, yt-dlp) sınır sabit değil, pratikte oluşur: IP engelleri genellikle proxy kurulumunuza ve istek kalıplarınıza bağlı olarak IP başına günde birkaç yüz ila birkaç bin istekten sonra devreye girer. Thunderbit, planınıza bağlı kredi tabanlı sistem kullanır.
Daha Fazla Bilgi


