İçindekiler (3)
Bir YouTube kanalında biriken onlarca veya yüzlerce videoyu bir web sitesine, blog altyapısına ya da statik site jeneratörüne (Astro, Hugo, Publii, Jekyll) taşımak gerektiğinde en büyük operasyonel yük, her video için tek tek YouTube sayfasına gidip "Paylaş > Yerleştir" adımlarını tekrarlamaktır. Manuel olarak yürütülen bu süreç yalnızca zaman kaybına yol açmaz; iframe boyutlandırmalarında tutarsızlıklara, kopyalama hatalarına ve içerik yayınlama sürecinin tıkanmasına neden olur.
Bu sorunun kesin ve ölçeklenebilir çözümü, Google’ın sunduğu resmi YouTube Data API v3 altyapısını hafif bir Python otomasyonu (youtube_embed_cekici.py) ile birleştirmektir.
Neden Web Scraping Yerine YouTube Data API v3?
YouTube içeriklerini toplu olarak çekmek istendiğinde akla ilk gelen alternatifler genellikle yt-dlp veya doğrudan HTML kazıma (scraping) araçları olur. Ancak platformun bot tespit mekanizmaları son dönemde önemli ölçüde sıkılaşmıştır:
- IP Kısıtlamaları ve CAPTCHA: Scraping araçları özellikle bulut sunucularda (VPS) veya yoğun ev ağı sorgularında
429 Too Many Requestsveya "Sign in to confirm you're not a bot" engeline takılır. - Arayüz Değişiklikleri: Web sayfalarının DOM yapısı değiştiğinde kazıma scriptleri anında işlevsiz kalır.
- Resmi Yetkilendirme Güvencesi:
youtube_embed_cekici.pybetiğinde kullanılan YouTube Data API v3, Google tarafından sağlanan resmi kapıdır. IP engeli riski sıfırdır, veri formatı standart JSON yapısıyla her zaman kararlıdır. - Cömert Ücretsiz Kota: Google Cloud, her geliştiriciye günlük 10.000 birim ücretsiz istek kotası sunar. 50 videoluk bir oynatma listesi sayfasını çekmek yalnızca 1 birim harcar. Kanalınızda bin video bulunsa dahi harcanan kota yalnızca 20 birimdir.
Betiğin Mimarisi ve Çalışma Mantığı
[Kanal ID]
└──> channels endpoint (contentDetails)
└──> Uploads Playlist ID (UU...)
└──> playlistItems endpoint (Snippet, 50'şerli döngü)
└──> Başlık + İntro + Özel Boyutlu Iframe1. Uploads Oynatma Listesini Tespit Etme
YouTube, bir kanala yüklenen tüm herkese açık videoları aslında gizli bir "Yüklenenler" (Uploads) oynatma listesinde tutar. Script, channels uç noktasını sorgulayarak kanalın UU... ile başlayan yükleme listesi kimliğini saniyeler içinde dinamik olarak belirler.
2. Sayfalama (Pagination) Yönetimi
YouTube API, tek sorguda en fazla 50 video döndürür. Script içinde yer alan while döngüsü, yanıttan dönen nextPageToken değerini otomatik takip ederek kanalınızda 10 video da olsa 500 video da olsa listenin sonuna kadar eksiksiz ilerler.
3. Dinamik Embed Kodlaması ve HTML Güvenliği
Betiğin en kritik işlevlerinden biri, ham video kimliğini (videoId) alıp doğrudan web standartlarına uygun bir HTML5 <iframe> şablonuna yerleştirmesidir. Özel genişlik ve yükseklik değerleri (örneğin 820x409 px, 16:9 oranı) doğrudan kod içinde üretilir. Ayrıca başlıklarda yer alabilecek tırnak ve özel karakterler html.escape filtresinden geçirilerek web sitenizde bozuk HTML oluşmasının önüne geçilir.
Karşılaştırma: Yöntemlerin Teknik Analizi
| Kriter | Manuel Kopyalama | Scraping / yt-dlp | YouTube Data API v3 (youtube_embed_cekici.py) |
|---|---|---|---|
| İşlem Süresi (50 Video) | ~45-60 Dakika | ~30-60 Saniye | ~2 Saniye |
| IP Engeli / Bot Riski | Yok | Yüksek (Özellikle VPS/Cloud) | Sıfır (Resmi Protokol) |
| Iframe Standartlaşması | Hataya Açık | Manuel regex gerektirir | Tam Şablon Uyumu (Örn: 820x409) |
| Çıktı Formatı | Yok | Metin / JSON | Doğrudan CSV veya Markdown (.md) |
Kurulum ve Uygulama Adımları
Betiği kendi kanalınızda çalıştırmak için aşağıdaki adımları tamamlamanız yeterlidir:
- Google Cloud Üzerinde API Anahtarı Oluşturma: Google Cloud Console paneline giriş yapın. Yeni bir proje açarak kütüphaneden YouTube Data API v3 servisini etkinleştirin. Credentials (Kimlik Bilgileri) sekmesinden yeni bir API Key oluşturun.
- Kanal Kimliğini (Channel ID) Belirleme: YouTube Studio arayüzünde Özelleştirme > Temel Bilgiler adımlarını izleyin.
UC...ile başlayan kanal kimliğinizi kopyalayarak koddakiCHANNEL_IDdeğişkenine yapıştırın. - Gerekli Kütüphaneyi Yükleme ve Çalıştırma: Python ortamınızda HTTP isteklerini yönetmek için
requestspaketini kurun:
pip install requestsKurulum tamamlanınca şu dosyayı youtube_embed_cekici.py olarak kaydedin:
import csv
import html
import requests
# --- AYARLAR ---
API_KEY = "BURAYA_YOUTUBE_API_KEY_YAZIN"
CHANNEL_ID = "BURAYA_KANAL_ID_YAZIN" # Örn: UC_x5XG1OV2P6uZZ5FSM9Ttw
OUTPUT_FILE = "videolar_ve_embed_kodlari.csv"
def get_uploads_playlist_id(channel_id, api_key):
"""Kanalın yüklenenler (uploads) oynatma listesi ID'sini alır."""
url = "https://www.googleapis.com/youtube/v3/channels"
params = {"part": "contentDetails", "id": channel_id, "key": api_key}
response = requests.get(url, params=params).json()
items = response.get("items", [])
if not items:
raise ValueError("Kanal bulunamadı veya geçersiz API anahtarı.")
return items[0]["contentDetails"]["relatedPlaylists"]["uploads"]
def fetch_all_videos(playlist_id, api_key):
"""Oynatma listesindeki tüm herkese açık videoların başlık ve embed kodunu döner."""
url = "https://www.googleapis.com/youtube/v3/playlistItems"
videos = []
next_page_token = None
while True:
params = {
"part": "snippet",
"playlistId": playlist_id,
"maxResults": 50,
"key": api_key,
"pageToken": next_page_token,
}
res = requests.get(url, params=params).json()
for item in res.get("items", []):
snippet = item["snippet"]
title = snippet["title"]
video_id = snippet["resourceId"]["videoId"]
# YouTube standart iframe embed şablonu
embed_code = (
f'<iframe width="560" height="315" '
f'src="https://www.youtube.com/embed/{video_id}" '
f'title="{html.escape(title)}" frameborder="0" '
f'allow="accelerometer; autoplay; clipboard-write; encrypted-media; '
f'gyroscope; picture-in-picture; web-share" '
f"referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>"
)
videos.append({"title": title, "embed_code": embed_code})
next_page_token = res.get("nextPageToken")
if not next_page_token:
break
return videos
def main():
try:
print("Kanal bilgileri sorgulanıyor...")
uploads_id = get_uploads_playlist_id(CHANNEL_ID, API_KEY)
print("Videolar ve embed kodları çekiliyor...")
video_list = fetch_all_videos(uploads_id, API_KEY)
with open(
OUTPUT_FILE, mode="w", newline="", encoding="utf-8-sig"
) as file:
writer = csv.DictWriter(file, fieldnames=["title", "embed_code"])
writer.writeheader()
writer.writerows(video_list)
print(
f"Tamamlandı! Toplam {len(video_list)} video '{OUTPUT_FILE}' dosyasına kaydedildi."
)
except Exception as e:
print(f"Hata oluştu: {e}")
if __name__ == "__main__":
main()
Daha sonra bu dosyayı python youtube_embed_cekici.py olarak çalıştırdığınız zaman, kanalınızdaki tüm videoların başlığı ve web sitenize doğrudan eklenmeye hazır iframe kodları Excel uyumlu UTF-8 formatında bir CSV dosyası olarak dışa aktarılır.
CMS, Markdown ve Headless Web Sitelerine Entegrasyon
Elde edilen veriler yalnızca tablo olarak saklanmakla kalmaz; modern web geliştirme süreçlerinde içerik motorlarına doğrudan girdi olarak beslenebilir.
Özellikle Markdown tabanlı statik site mimarilerinde (Publii, Astro, Hugo, Next.js Contentlayer) her satır bir .md dosyasına dönüştürülebilir. Üst kısımda YAML Frontmatter içinde başlık, açıklama ve etiketler yer alırken; gövde kısmında doğrudan betiğin ürettiği 560x315 boyutundaki iframe embed kodu konumlanır. Böylece kanalınızdaki tüm video arşivi, saatler süren manuel veri girişi yerine dakikalar içinde arama motorlarına ve kullanıcılara hazır bir video kütüphanesine dönüştürülmüş olur.
Tekrarlayan içerik operasyonlarında resmi API uç noktalarını hafif Python scriptleri ile otomatize etmek, veri kaybını önlerken projelerin teknik altyapısını hız ve güvenilirlik açısından modern web standartlarına taşır.
Henüz yorum yapılmamış. İlk yorumu siz yapın!