Python ile YouTube Kazıma: Gerçekten İşe Yarayan 4 Yöntem

Son güncelleme: April 15, 2026
Python ile YouTube Kazıma: Gerçekten İşe Yarayan 4 Yöntem

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 analiziPazarlama ekipleri, içerik stratejistleriGörüntülenme sayıları, yükleme sıklığı, etkileşim oranları
Lead oluşturmaSatış ekipleri, B2B outreach ekipleriKanal iletişim bilgileri, açıklamalardaki iş e-postaları
Pazar araştırmasıÜrün yöneticileri, analistlerTrend konular, yorumlardan çıkan kitle duyarlılığı
İçerik stratejisiYouTuber’lar, ajanslarEn 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 takibiPR ekipleri, marka yöneticileriVideo başlıklarında, yorumlarda ve açıklamalarda geçen marka adları
Akademik araştırmaAraştırmacılar, veri bilimcilerDuygu 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.

Kriterrequests + BS4 (ytInitialData)Selenium / Playwrightyt-dlpYouTube Data APIKod yazmadan (Thunderbit)
Kurulum karmaşıklığıDüşükOrtaDüşükOrta (API anahtarı)Yok
JS render desteğiKısmi (JSON ayrıştırma)EvetEvetN/A (yapılandırılmış API)Evet
HızHızlıYavaşHızlıHızlıHızlı (bulut)
Anti-bot riskiOrtaYüksekDüşükYokYönetiliyor
Kota / hız sınırıYok (ama IP engeli olabilir)Yok (ama tespit edilebilir)YokGünlük 10.000 birimKredi tabanlı
Yorum çekmeZorMümkün ama karmaşıkYerleşikYerleşikSayfaya bağlı
TranskriptlerHayırKarmaşıkEvetHayırHayır
En uygun kullanımHızlı metaveriArama sonuçları, dinamik sayfalarToplu metaveri + yorumlarÖlçeklenebilir yapılandırılmış veriKod bilmeyenler, hızlı dışa aktarma

Kısa özet: youtube-scraping-methods.webp

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/Playwrightyt-dlpYouTube APIThunderbit
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.

extracted-data-categories.webp

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: toggleButtonRenderersegmentedLikeDislikeButtonViewModel), açıklama yapısının değişimi (2023: description.runs[]attributedDescription.content) ve kanalın Videos sekmesinin yeniden tasarımı (2022–2023: gridRendererrichGridRenderer) 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

  1. Google Cloud Console sayfasına gidin
  2. Yeni bir proje oluşturun (veya mevcut bir projeyi seçin)
  3. APIs & Services → Library bölümüne gidin, "YouTube Data API v3" arayın ve Enable edin
  4. APIs & Services → Credentials bölümüne gidin → Create Credentials → API Key seçin
  5. 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.list100 birim50 sonuç
videos.list1 birim50 video ID’si (toplu)
channels.list1 birim50 kanal ID’si
commentThreads.list1 birim100 yorum
captions.list50 birimN/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.list ciddi 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-UA gibi 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, requests ve beautifulsoup4 dışı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

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
İçindekiler
Thunderbit · AI web veri ajanı

Herhangi bir sayfadan veriyi 1 tık içinde çıkar

250.000+ kullanıcı tarafından güveniliyor
ücretsiz plan mevcut
Web sayfasından tabloya
Ne istediğini anlat — Thunderbit'in AI Agent'ı bunu kazır ve Excel, Google Sheets, Airtable veya Notion'a aktarır. Başlamak ücretsiz.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week