Python ile IMDb’yi Kazıyın: Gerçekten Çalışan Kod

Son güncelleme: April 28, 2026

Son zamanlarda “Python ile IMDb’yi kazıma” diye arattıysanız muhtemelen bir şey fark etmişsinizdir: Bulduğunuz eğitimlerin çoğu bozuk. “Biraz eski” bozuk değil — daha çok “sıfır sonuç dönüyor ve NoneType hataları sağanağa dönüşmüş” seviyesinde bozuk.

Son birkaç haftayı bulabildiğim tüm büyük IMDb kazıma eğitimlerini test ederek geçirdim — GeeksforGeeks, Medium, freeCodeCamp, Kaggle notebook’ları, aklınıza ne gelirse. IMDb kazıma için etiketlenmiş içinde büyük çoğunluk, IMDb’nin Top 250 sayfasını Haziran 2023’te yeniden tasarlamasından beri var olmayan CSS seçicilere (td.titleColumn, td.ratingColumn) referans veriyor. Sonuç mu? Forumlarda “kodum neden boş dönüyor?” diye soran geliştiriciler ve gibi popüler kütüphane bakımcıları: “Tüm ayıklayıcıları tek tek düzeltmek dışında yapabileceğimiz pek bir şey yok.” Bu rehber, şu anda gerçekten çalışan iki Python yöntemini, sayfalama ve yaygın hataları nasıl yöneteceğinizi, Python’un ne zaman doğru araç olmadığını ve kazıyıcınızı mezarlığa katılmayacak şekilde nasıl geleceğe hazırlayacağınızı anlatıyor.

Python ile IMDb’yi Kazımak Ne Demek?

Web kazıma, web sayfalarından veriyi programlı olarak çıkarma sürecidir — elle kopyala-yapıştır yapmak yerine bunu sizin için yapan bir script yazarsınız. “IMDb’yi kazımak” derken, Python kullanarak IMDb sayfalarından yapılandırılmış film verilerini (başlıklar, puanlar, türler, oyuncular, süre, oy sayıları) çekmeyi kastediyoruz.

Bunun için tipik Python yığını üç kütüphaneden oluşur: requests (web sayfasını çekmek için), BeautifulSoup (HTML’yi ayrıştırıp veriyi bulmak için) ve pandas (sonuçları düzenlemek ve dışa aktarmak için). Bazı eğitimler, JavaScript render gerektiren sayfalar için Selenium ya da Playwright da kullanır; ancak birazdan göreceğiniz gibi, daha hızlı yaklaşımlar var.

Önemli bir not: Bu rehberdeki her şey, IMDb’nin 2025 ortası itibarıyla geçerli olan mevcut sayfa yapısına göre doğrulanmıştır. IMDb yaklaşık her 6–12 ayda bir değişiklik yapıyor; bu yüzden bunu 2027’de okuyorsanız bazı seçiciler değişmiş olabilir. (Bununla nasıl başa çıkacağınızı da anlatacağım.)

Neden Python ile IMDb Kazımalısınız? Gerçek Kullanım Senaryoları

Tek satır kod yazmadan önce, IMDb verisiyle gerçekte ne yapacaksınız? Cevap, kim olduğunuza bağlı.

IMDb inceleme veri kümesi, dünyada en yaygın kullanılan NLP ölçütlerinden biridir — Maas ve arkadaşlarının (2011) temel çalışması topladı ve veri kümesi TensorFlow, Keras ve PyTorch’a gömülü halde geliyor. Hugging Face’te stanfordnlp/imdb veri kümesi ayda 213.321 kez indiriliyor ve 1.500’den fazla modeli eğitmek için kullanıldı. Yani makine öğrenmesi alanındaysanız, IMDb verisine muhtemelen zaten aşinasınızdır.

Ama kullanım alanları akademiyle sınırlı değil:

Kullanım AlanıKimler İçinGerekli Veri Alanları
Film öneri motoruVeri bilimcileri, hobi amaçlı çalışanlarBaşlıklar, türler, puanlar, oyuncular
Yayın platformu içerik stratejisiÜrün/içerik ekipleriPuanlar, oy sayıları, çıkış yılı, türler
Duygu analizi / NLP eğitimiML araştırmacıları, öğrencilerİncelemeler, puanlar
Rekabetçi içerik analiziEğlence sektörü analistleriGişe, çıkış tarihleri, puan trendleri
Film turizmi araştırmasıTurizm kurulları, seyahat şirketleriÇekim yerleri, popülerlik metrikleri
Akademik araştırmaÜniversite araştırmacılarıHer türlü yapılandırılmış film meta verisi

Sadece film turizmi pazarı bile 2025’te küresel ölçekte tahminen değerinde. Netflix, 2024’te içerik için 17 milyar doların üzerinde harcama yaptı ve kişiselleştirilmiş öneriler tarafından yönlendirildi. Kısacası: IMDb verisi, sektörler arasında gerçek kararları besliyor.

IMDb Verisini Elde Etme Seçenekleriniz (Bir Satır Kod Yazmadan Önce)

Bu bölüm, çoğu eğitimin tamamen atladığı kısım. Python ile kazımaya, bunun sizin durumunuz için doğru yaklaşım olup olmadığını sormadan doğrudan pip install beautifulsoup4 ile atlıyorlar.

İşte tam tablo:

YolKimler İçin En UygunArtılarıEksileri
Python + BeautifulSoupÖğrenme, özel çıkarımTam kontrol, esnekKırılgan seçiciler, sık bozulur
JSON-LD / __NEXT_DATA__ çıkarımıStabilite isteyen geliştiricilerJS içeriğini işler, daha dayanıklıJSON yapısını anlamak gerekir
IMDb Resmî Veri KümeleriBüyük ölçekli analiz, akademik kullanımYasal, eksiksiz, 26M+ başlık, günlük güncellemeTSV formatı, yorum/görsel yok
Cinemagoer (IMDbPY) kütüphanesiProgramatik tekil başlık sorgularıPython’a uygun API, zengin alanlar88 açık sorun, son sürüm Mayıs 2023
TMDb APIFilm meta verisi + görsellerÜcretsiz API anahtarı, JSON, iyi dokümante edilmişFarklı kaynak (IMDb puanları değil)
Thunderbit (kodsuz)Kod yazmayanlar, hızlı dışa aktarma2 tıkla kazıma, AI alanları önerir, Excel/Sheets’e aktarırBüyük işlemler için kredi bazlı

Bu seçeneklerle ilgili birkaç not. Cinemagoer’in PyPI sürümü Mayıs 2023’ten beri yayınlanmadı ve IMDb’nin Haziran 2025 yeniden tasarımından sonra ayrıştırıcılarının çoğu bozuldu — şu anda üretim kullanımına önermem. TMDb mükemmel ama kendi puan sistemini kullanıyor, IMDb’ninkini değil. IMDb’nin resmî kurumsal API’si ise AWS Data Exchange üzerinden yıllık maliyete sahip; dolayısıyla çoğumuz için seçenek değil.

Hiç kod yazmak istemeyen okurlar için, IMDb sayfasını okur, çıkarım alanlarını otomatik önerir (başlık, puan, yıl, tür) ve veriyi iki tıkla Excel, Google Sheets, Airtable veya Notion’a aktarır. IMDb düzenini değiştirdiğinde AI uyum sağlar; dolayısıyla bakımı yapılacak seçici yoktur. Buna birazdan döneceğiz.

Şimdi Python yazmak isteyenler için — çalışan iki yöntem var.

Yöntem 1: BeautifulSoup Kullanarak Python ile IMDb Kazıma (Geleneksel Yaklaşım)

Bu, çoğu eğitimde bulacağınız klasik yaklaşımdır. Çalışır; ama açık konuşayım: ele alacağım yöntemler içinde en kırılgan olanıdır. IMDb’nin CSS sınıf adları otomatik üretilir ve yeniden tasarımlarla değişir. Yine de web kazımanın temellerini öğrenmek için en iyi yoldur.

1. Adım: Python Kütüphanelerinizi Kurun ve İçeri Aktarın

Dört pakete ihtiyacınız var:

1pip install requests beautifulsoup4 pandas lxml

Her biri ne yapar:

  • requests — web sayfasını çekmek için HTTP istekleri gönderir
  • beautifulsoup4 — HTML’yi ayrıştırır, böylece belirli öğeleri arayabilirsiniz
  • pandas — çıkarılan veriyi tablolara düzenler ve CSV/Excel’e aktarır
  • lxml — hızlı bir HTML ayrıştırıcısıdır (BeautifulSoup bunu arka uç olarak kullanabilir)

İçeri aktarma bloğunuz:

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd

2. Adım: IMDb’ye Bir HTTP İsteği Gönderin

Yeni başlayanların çoğu ilk duvara burada tosluyor. IMDb, uygun bir User-Agent başlığı içermeyen istekleri engeller — 403 Forbidden hatası alırsınız. Python Requests’in varsayılan user-agent dizesi (python-requests/2.31.0) anında işaretlenir.

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
4    "Accept-Language": "en-US,en;q=0.9"
5}
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Sayfa alınamadı: {response.status_code}")
9else:
10    print("Sayfa başarıyla alındı")

Accept-Language başlığı da önemlidir — bu başlık olmadan IMDb, IP’nizin coğrafi konumuna göre farklı bir dilde içerik döndürebilir.

3. Adım: HTML’yi BeautifulSoup ile Ayrıştırın

HTML’yi aldıktan sonra bir BeautifulSoup nesnesi oluşturun ve doğru öğeleri aramaya başlayın. Chrome’da IMDb Top 250 sayfasını açın, bir film başlığında sağ tıklayın ve altında yatan HTML yapısını görmek için “İncele”yi seçin.

1soup = BeautifulSoup(response.text, "lxml")

2025 ortası itibarıyla Top 250 sayfası şu seçicileri kullanıyor:

  • Film kapsayıcısı: li.ipc-metadata-list-summary-item
  • Başlık: h3.ipc-title__text
  • Yıl: span.cli-title-metadata-item (ilk span)
  • Puan: span.ipc-rating-star--rating

Uyarı: Baştaki ipc- sınıf adları IMDb’nin bileşen sistemi tarafından üretilir. Haziran 2023 yeniden tasarımından beri stabiller, ama tekrar değişmeyeceklerinin garantisi yok.

4. Adım: Film Verisini Çıkarın (Başlık, Yıl, Puan)

Burada çoğu eğitimden farklı davranıyorum: try/except hata yönetimi ekliyorum. İncelediğim rakip rehberlerin hiçbiri bunu yapmıyor; bu yüzden seçici değiştiğinde kodları sessizce bozuluyor.

1movies = []
2movie_items = soup.select("li.ipc-metadata-list-summary-item")
3for item in movie_items:
4    try:
5        title_tag = item.select_one("h3.ipc-title__text")
6        title = title_tag.text.strip() if title_tag else "N/A"
7        year_tag = item.select_one("span.cli-title-metadata-item")
8        year = year_tag.text.strip() if year_tag else "N/A"
9        rating_tag = item.select_one("span.ipc-rating-star--rating")
10        rating = rating_tag.text.strip() if rating_tag else "N/A"
11        movies.append({
12            "title": title,
13            "year": year,
14            "rating": rating
15        })
16    except Exception as e:
17        print(f"Film ayrıştırılırken hata: {e}")
18        continue
19print(f"{len(movies)} film çıkarıldı")

5. Adım: Pandas ile CSV veya Excel’e Kaydedin

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250.csv", index=False)
3df.to_excel("imdb_top_250.xlsx", index=False)
4print(df.head())

Örnek çıktı:

1                          title  year rating
20  1. The Shawshank Redemption  1994    9.3
31           2. The Godfather    1972    9.2
42     3. The Dark Knight        2008    9.0
53  4. The Godfather Part II     1974    9.0
64         5. 12 Angry Men       1957    9.0

Çalışıyor. Ama bir gün bozulabilecek CSS seçicilere dayanıyor — bu da bizi gerçekten önerdiğim yaklaşıma getiriyor.

Yöntem 2: JSON-LD Triki — HTML Ayrıştırmayı Tamamen Atlayın

Bu, rakip makalelerin hiçbirinin anlatmadığı ve ciddi bir proje için benim kullanacağım tekniktir. IMDb, her sayfada <script type="application/ld+json"> etiketleri içinde yapılandırılmış veriyi (Linked Data için JavaScript Object Notation) olarak gömer. Bu veri Schema.org standardını takip eder, Google tarafından zengin arama sonuçları için kullanılır ve CSS sınıf adlarına göre çok daha seyrek değişir.

Üretim düzeyinde bir araç olan Apify IMDb Scraper, çıkarım önceliğini şu sırayla kullanır: “JSON-LD > NEXT_DATA > DOM.” Ben de önereceğim hiyerarşi bu.

JSON-LD Neden CSS Seçicilerden Daha Güvenilir?

YaklaşımJS İçeriğini İşler mi?Arayüz Değişimlerine Dayanıklı mı?HızKarmaşıklık
BeautifulSoup + CSS seçiciler❌ Hayır⚠️ Kırılgan (sınıf adları değişir)HızlıDüşük
JSON-LD çıkarımı✅ Evet✅ Schema.org standardını izlerHızlıDüşük-Orta
__NEXT_DATA__ JSON çıkarımı✅ Evet✅ Oldukça stabilHızlıDüşük-Orta
Selenium / Playwright✅ Evet⚠️ KırılganYavaşOrta-Yüksek
Thunderbit (kodsuz, 2 tık)✅ Evet (AI sayfayı okur)✅ AI otomatik uyum sağlarHızlıYok

ipc-metadata-list-summary-item gibi CSS sınıf adları, IMDb’nin React bileşen sistemi tarafından otomatik oluşturulur ve her yeniden tasarımda değişir. JSON-LD şeması ise görsel katmanı değil, gerçek veri modelini temsil eder. Bu, bir kitabın içindekiler bölümünü okumakla bölümleri yalnızca yazı tipi boyutuna bakarak ayırt etmeye çalışmak arasındaki farka benzer.

css-selectors-vs-json-ld.webp

Adım Adım: IMDb Verisini JSON-LD’den Çekin

1. Adım: Sayfayı Alın

Öncekiyle aynı — uygun bir User-Agent başlığıyla requests kullanın.

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11soup = BeautifulSoup(response.text, "lxml")

2. Adım: JSON-LD Script Etiketini Bulun

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("Bu sayfada JSON-LD bulunamadı")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Bulunan JSON-LD türü: {data.get('@type', 'bilinmiyor')}")

3. Adım: Yapılandırılmış Veriyi Ayrıştırın

Top 250 sayfasında JSON-LD, tüm 250 filmi içeren bir itemListElement dizisi barındırır. Her giriş; konum, ad, URL, aggregateRating, datePublished, genre, description, director ve actor dizilerini içerir.

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5    movies.append({
6        "rank": item.get("position"),
7        "title": movie.get("name"),
8        "url": movie.get("url"),
9        "rating": rating_info.get("ratingValue"),
10        "vote_count": rating_info.get("ratingCount"),
11        "date_published": movie.get("datePublished"),
12        "genre": ", ".join(movie.get("genre", [])),
13        "description": movie.get("description"),
14    })

4. Adım: CSV’ye Aktarın

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250_json_ld.csv", index=False)
3print(df.head())

Örnek çıktı:

1   rank                      title                                     url  rating  vote_count date_published              genre
20     1  The Shawshank Redemption  https://www.imdb.com/title/tt0111161/     9.3     2900000     1994-10-14     Drama
31     2            The Godfather   https://www.imdb.com/title/tt0068646/     9.2     2000000     1972-03-24     Crime, Drama
42     3          The Dark Knight   https://www.imdb.com/title/tt0468569/     9.0     2800000     2008-07-18     Action, Crime, Drama

Tüm 250 film. Temiz, yapılandırılmış, CSS seçici cambazlığı yok. Ve bu veri Schema.org standardına uyduğu için (Google’ın arama sonuçlarında dayandığı standart), görsel düzene göre değişme ihtimali çok daha düşüktür.

Bonus: Tekil Film Sayfaları için __NEXT_DATA__

Tekil başlık sayfalarından daha zengin veri almak için (süre, tam oyuncu kadrosu, özet, poster görselleri), IMDb ayrıca bir __NEXT_DATA__ JSON nesnesi gömer. Bu, React’ın sayfayı hydrate etmek için kullandığı veridir — siteyi bozmadan kaldırılamaz.

1# /title/tt0111161/ gibi tekil bir film sayfasında
2next_data_tag = soup.find("script", {"id": "__NEXT_DATA__"})
3if next_data_tag:
4    next_data = json.loads(next_data_tag.string)
5    above_fold = next_data["props"]["pageProps"]["aboveTheFoldData"]
6    title = above_fold["titleText"]["text"]
7    year = above_fold["releaseYear"]["year"]
8    rating = above_fold["ratingsSummary"]["aggregateRating"]
9    runtime_seconds = above_fold.get("runtime", {}).get("seconds", 0)
10    genres = [g["text"] for g in above_fold["genres"]["genres"]]
11    plot = above_fold["plot"]["plotText"]["plainText"]

Grafik/liste sayfaları için JSON-LD, tekil başlık sayfaları için __NEXT_DATA__ kullanın. Üretim düzeyinde yaklaşım budur.

IMDb Kazıyıcınız Neden Sürekli Bozuluyor? (Ve Nasıl Düzeltilir)

Bu, incelediğim her IMDb kazıma forumunda en çok dile getirilen sorun. Kullanıcılar şunu yazıyor: “Kodun bir kısmı arayüz değişiklikleri yüzünden bozuldu” ve “2024’te çalışmıyor!” — cevap ise genelde sessizlik veya “Selenium deneyin.”

Kök neden, IMDb’nin React/Next.js ön yüzüne devam eden geçişi. İşte büyük kırılma değişikliklerinin zaman çizelgesi:

TarihNe DeğiştiNe Bozuldu
Kasım 2022İsim sayfaları yeniden tasarlandıEski isim sayfası kazıyıcıları
Haziran 2023Top 250 sayfası yeniden tasarlandıTüm td.titleColumn / td.ratingColumn seçicileri
Nisan 2023Başlık alt sayfaları yeniden tasarlandıBiyografi, ödül, haber kazıyıcıları
Ekim 2023Gelişmiş Arama yeniden tasarlandıArama tabanlı kazıyıcılar
Haziran 2025/reference sayfaları yeniden tasarlandıCinemagoer kütüphanesi (çoğu ayrıştırıcı)

Bu, yaklaşık her 6–12 ayda bir büyük kırılma değişikliği demek. Kazıyıcınız CSS sınıf adlarına dayanıyorsa, bitmeyen bir koşu bandındasınız.

Yaygın Hatalar ve Nasıl Düzeltilir

Boş sonuçlar / NoneType hataları

En yaygın hata. AttributeError: 'NoneType' object has no attribute 'text' görürsünüz. Bu, BeautifulSoup’un aradığınız öğeyi bulamadığı anlamına gelir — genellikle CSS sınıf adı değişmiştir ya da içerik JavaScript ile render ediliyordur.

Çözüm: JSON-LD çıkarımına geçin (yukarıdaki Yöntem 2). Veri ilk HTML yanıtında zaten var; JavaScript gerekmez.

403 Forbidden

IMDb, botları tespit etmek ve engellemek için kullanır. Bir numaralı tetikleyici, eksik ya da açıkça sahte bir User-Agent başlığıdır. Bu durum, açık kaynak projede ve belgelenmiştir; orada bir IMDb çalışanı sorunu kabul etmiştir.

Çözüm: Her zaman gerçekçi bir tarayıcı User-Agent dizesi ve Accept-Language: en-US başlığı ekleyin. Bağlantı havuzu için requests.Session() kullanın.

Yalnızca 25 sonuç dönüyor

IMDb arama sayfaları ve “En Popüler” listeleri lazy loading kullanır — başlangıçta yalnızca yaklaşık 25 sonuç render edilir ve siz aşağı kaydırdıkça geri kalanı AJAX ile yüklenir.

Çözüm: URL parametreli sayfalama kullanın (bir sonraki bölümde anlatılıyor) ya da tüm 250 filmin tek yanıtta yüklendiği Top 250 sayfasına geçin.

Seçiciler bir anda çalışmayı bırakıyor

Artık çalışmayan eski seçiciler: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Kodunuz bunlardan herhangi birini kullanıyorsa bozulmuştur.

Çözüm: Otomatik oluşturulan sınıf adları yerine data-testid özniteliklerini tercih edin (ör. h1[data-testid="hero-title-block__title"]). Daha iyisi, JSON-LD kullanın.

Bir Karar Çerçevesi: Kısa Vadeli ve Uzun Vadeli Çözümler

  • Hızlı çözüm: Her seçicinin etrafına try/except blokları ekleyin, HTTP durum kodlarını doğrulayın, çökmeden hata kaydedin
  • Orta vadeli çözüm: CSS seçicilerden JSON-LD çıkarımına geçin (Yöntem 2)
  • Uzun vadeli çözüm: Büyük ölçekli analiz için ya da sayfa yapısını her seferinde yeniden okuyan AI kullanan gibi bir aracı kullanın — bakımı yapılacak seçici yok, AI düzen değişikliklerine otomatik uyum sağlar

25 Sonuç Sınırının Ötesi: IMDb Sayfalama ve Büyük Veri Kümeleri

İncelediğim rakip eğitimlerin hepsi tam olarak bir sayfa kazıyor. Kimse sayfalamayı ele almıyor. Ama tek bir liste yeterli değilse, kısa sürede duvara çarparsınız.

Sayfalama Gerektirmeyen Sayfalar

İyi haber: Top 250 sayfası, tüm 250 filmi tek bir sunucu taraflı yanıtta yüklüyor. JSON-LD ve __NEXT_DATA__ tam veri kümesini içeriyor. Sayfalama gerekmez.

IMDb Arama Sayfalaması Nasıl Çalışır?

IMDb arama sayfaları start= URL parametresi kullanır ve 50’şer artar:

1https://www.imdb.com/search/title/?groups=top_1000&start=1
2https://www.imdb.com/search/title/?groups=top_1000&start=51
3https://www.imdb.com/search/title/?groups=top_1000&start=101

Sonuçlar arasında dolaşan bir Python döngüsü:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # İlk 1000 arasında sayfalar
4    url = f"https://www.imdb.com/search/title/?groups=top_1000&start={start}"
5    response = requests.get(url, headers=headers)
6    if response.status_code != 200:
7        print(f"start={start} noktasında başarısız oldu: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # Tercih ettiğiniz yöntemle filmleri çıkarın
11    # ...
12    print(f"{start} başlangıçlı sayfa kazındı")
13    time.sleep(3)  # Saygılı olun — IMDb yaklaşık 50 hızlı isteğin ardından engeller

Bu time.sleep(3) önemli. Topluluk raporları, IMDb’nin yaklaşık 50 hızlı istekten sonra IP’leri engellemeye başladığını gösteriyor. 2–5 saniye arasında rastgele bir gecikme iyi bir uygulamadır.

Kazımayı Tamamen Atlamanız Gereken Durum: IMDb’nin Resmî Toplu Veri Kümeleri

Gerçekten büyük ölçekli ihtiyaçlar için IMDb, adresinde günlük yenilenen 7 ücretsiz TSV dosyası sağlar:

DosyaİçerikBoyut
title.basics.tsv.gzBaşlıklar, türler, süre, yıl~800 MB
title.ratings.tsv.gzOrtalama puan, oy sayısı~25 MB
title.crew.tsv.gzYönetmenler, yazarlar~300 MB
title.principals.tsv.gzÜst sıralı oyuncu/ekip~2 GB
title.akas.tsv.gzBölgeye göre alternatif adlar~1.5 GB
title.episode.tsv.gzTV bölümü bilgileri~200 MB
name.basics.tsv.gzKişiler: ad, doğum yılı, bilinen işler~700 MB

Bunları Pandas’a yüklemek oldukça basittir:

1ratings = pd.read_csv("title.ratings.tsv.gz", sep="\t", compression="gzip")
2basics = pd.read_csv("title.basics.tsv.gz", sep="\t", compression="gzip", low_memory=False)
3# tconst (IMDb başlık kimliği) üzerinden birleştir
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

Bu veri kümeleri 26 milyondan fazla başlığı kapsar. Sayfalama yok, seçici yok, 403 hatası yok. Lisans yalnızca kişisel ve ticari olmayan kullanım içindir — veriyi yeniden yayımlayamaz veya yeniden satamazsınız.

Kodsuz Kestirme Yol: Thunderbit Sizin Yerine Sayfalamayı Yapar

Sayfalanmış IMDb verisine ihtiyaç duyup sayfalama mantığı yazmak istemeyen okurlar için, hem tıklama tabanlı sayfalamayı hem de sonsuz kaydırmayı doğal olarak destekler. Siz kazımasını söylersiniz, gerisini o halleder — yavaş yüklenen içerik içinde kaydırma da dahil.

Python ile IMDb Kazıma: Tam Çalışan Kod (Kopyala-Yapıştır Hazır)

Aşağıda hemen çalıştırabileceğiniz, kendi içinde yeterli iki script var.

Script A: BeautifulSoup Yöntemi (CSS Seçiciler)

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4url = "https://www.imdb.com/chart/top/"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
7    "Accept-Language": "en-US,en;q=0.9"
8}
9response = requests.get(url, headers=headers)
10if response.status_code != 200:
11    print(f"Hata: {response.status_code}")
12    exit()
13soup = BeautifulSoup(response.text, "lxml")
14movie_items = soup.select("li.ipc-metadata-list-summary-item")
15movies = []
16for item in movie_items:
17    try:
18        title = item.select_one("h3.ipc-title__text")
19        year = item.select_one("span.cli-title-metadata-item")
20        rating = item.select_one("span.ipc-rating-star--rating")
21        movies.append({
22            "title": title.text.strip() if title else "N/A",
23            "year": year.text.strip() if year else "N/A",
24            "rating": rating.text.strip() if rating else "N/A",
25        })
26    except Exception as e:
27        print(f"Hata nedeniyle film atlanıyor: {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"{len(df)} film kaydedildi")
31print(df.head())

Script B: JSON-LD Yöntemi (Önerilen)

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11if response.status_code != 200:
12    print(f"Hata: {response.status_code}")
13    exit()
14soup = BeautifulSoup(response.text, "lxml")
15script_tag = soup.find("script", {"type": "application/ld+json"})
16if not script_tag:
17    print("JSON-LD verisi bulunamadı")
18    exit()
19data = json.loads(script_tag.string)
20movies = []
21for item in data.get("itemListElement", []):
22    movie = item.get("item", {})
23    rating_info = movie.get("aggregateRating", {})
24    directors = movie.get("director", [])
25    director_names = ", ".join(
26        d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
27    )
28    movies.append({
29        "rank": item.get("position"),
30        "title": movie.get("name"),
31        "url": movie.get("url"),
32        "rating": rating_info.get("ratingValue"),
33        "votes": rating_info.get("ratingCount"),
34        "year": movie.get("datePublished", "")[:4],
35        "genre": ", ".join(movie.get("genre", [])),
36        "director": director_names,
37        "description": movie.get("description"),
38    })
39df = pd.DataFrame(movies)
40df.to_csv("imdb_top250_jsonld.csv", index=False)
41print(f"{len(df)} film kaydedildi")
42print(df.head())

Her iki script de hata yönetimi içerir ve temiz CSV çıktısı üretir. Script B size daha zengin veri verir — yönetmen, açıklama, URL — ve düzen değişikliklerine karşı daha dayanıklıdır.

Hiç Kod Yazmadan IMDb Nasıl Kazınır? (Thunderbit ile)

Herkes Python yazmak istemez veya buna ihtiyaç duymaz. Belki de sadece bu haftanın en yüksek puanlı filmlerini bir tabloya almak isteyen bir operasyon analistisiniz. Belki de yıllar arasındaki tür trendlerini karşılaştırmak isteyen bir içerik stratejisiniz. Bu durumlarda bir kazıyıcı yazmak gereğinden fazladır.

Aynı veriyi ile şöyle alabilirsiniz:

Başlamadan önce:

  • Zorluk: Başlangıç
  • Gerekli Süre: ~2 dakika
  • Gerekenler: Chrome tarayıcısı, (ücretsiz katman çalışır)

1. Adım: Kazımak istediğiniz IMDb sayfasına gidin. Chrome’da IMDb Top 250’yi (veya herhangi başka bir IMDb liste/arama sayfasını) açın.

2. Adım: Thunderbit kenar çubuğunda “AI Alan Öner”e tıklayın. AI sayfayı tarar ve sütunlar önerir — genellikle Başlık, Yıl, Puan, Tür ve sayfaya bağlı olarak birkaç alan daha. Önerilen alanlarla bir önizleme tablosu göreceksiniz.

3. Adım: Gerekirse alanları düzenleyin. İhtiyacınız olmayan sütunları kaldırın ya da “+ Sütun Ekle”ye tıklayıp ne istediğinizi düz İngilizceyle tarif ederek özel sütunlar ekleyin (ör. “Yönetmen adı” veya “Oy sayısı”).

4. Adım: “Kazı”ya tıklayın. Thunderbit veriyi çıkarır. Sonsuz kaydırma veya sayfalama olan sayfalarda kaydırmayı otomatik olarak yönetir.

5. Adım: Dışa aktarın. Dışa aktarma düğmesine tıklayın ve formatınızı seçin — Excel, Google Sheets, CSV, Airtable veya Notion. Veri saniyeler içinde hedefinize ulaşır.

Buradaki temel avantaj sadece kolaylık değil — Thunderbit’in AI’sı sayfa yapısını her seferinde sıfırdan okur. IMDb düzenini değiştirdiğinde (değiştirecek), AI uyum sağlar. Güncelleyecek seçici, düzeltilecek kod yok. Son teslim tarihinden önce gece 2’de bozuk bir kazıyıcı yüzünden canı yanmış herkes için bu çok değerli.

Thunderbit ayrıca alt sayfa kazımayı da destekler — her film detay sayfasına girip tablonuzu oyuncu kadrosu, yönetmen, süre ve liste sayfasında görünmeyen diğer alanlarla zenginleştirebilirsiniz. Nasıl çalıştığını görmek isterseniz, göz atın.

IMDb’yi Kazımak Yasal mı? Bilmeniz Gerekenler

Kullanıcılar forumlarda bunu açıkça soruyor: “Böyle bir şey yasal mı?… IMDb insanların sitesini kazımasını istemiyor.” Bu makul bir soru ve rakip yazıların hiçbiri bunu ele almıyor.

IMDb robots.txt: Top 250 tablosu (/chart/top/), tekil başlık sayfaları (/title/ttXXXXXXX/) ve isim sayfaları (/name/nmXXXXXXX/) robots.txt tarafından ENGELLENMİŞ değildir. Engellenen yollar arasında /find, / _json/*, /search/name-text, /user/ur*/ratings ve çeşitli AJAX uç noktaları bulunur. Belirlenmiş bir Crawl-delay yönergesi yoktur.

IMDb Kullanım Koşulları: İlgili madde şunu söyler: “Bu sitede, açık yazılı iznimiz olmadan veri madenciliği, robotlar, ekran kazıma veya benzeri veri toplama ve çıkarma araçlarını kullanamazsınız.” Ek bir madde, kazınmış verinin yeniden satılmasını veya ticari kullanımını yasaklar.

Pratikte bunun anlamı: 2024’teki son mahkeme kararları (Meta v. Bright Data, X Corp v. Bright Data), hiç kabul etmediğiniz Kullanım Koşulları’nın sizi bağlamayabileceğini ortaya koydu — kamuya açık veriyi giriş yapmadan kazıyorsanız, ToS’un uygulanabilirliği tartışmalıdır. Ancak bu alan hukuken hâlâ gelişmektedir.

Güvenli alternatifler: IMDb’nin açıkça kişisel ve ticari olmayan kullanım için onaylıdır. TMDb API, ücretsiz API anahtarıyla oldukça esnektir. Hukuken net kalmak istiyorsanız her ikisi de sağlam seçeneklerdir.

Pratik öneri: Eğer kazıma yapacaksanız, saygılı bir istek hızı kullanın (time.sleep(3)), uygun başlıklar ekleyin ve robots.txt tarafından engellenen yollara istek göndermeyin. Ticari projeler için bir hukuk uzmanına danışın ya da resmî veri kümelerini/API’yi kullanın.

Thunderbit blogunda ayrıntılı olarak ele aldık.

Sonuç: Python ile IMDb’yi Kazımak İçin Doğru Yolu Seçin

Kısa versiyon:

  • BeautifulSoup + CSS seçiciler: Temelleri öğrenmek için iyi. Her 6–12 ayda bir bozulmasını bekleyin. Her zaman hata yönetimi ekleyin.
  • JSON-LD çıkarımı: Devam eden herhangi bir Python projesi için önereceğim yaklaşım. Schema.org standardını izler, CSS sınıflarına göre çok daha seyrek değişir ve JavaScript render olmadan temiz yapılandırılmış veri verir.
  • __NEXT_DATA__ JSON: Tekil başlık sayfalarında daha zengin veri için bunu tamamlayıcı olarak kullanın (süre, tam oyuncu kadrosu, özet, poster görselleri).
  • IMDb Resmî Veri Kümeleri: Büyük ölçekli analiz için en iyi seçenek. 26M+ başlık, günlük güncelleme, kazıma gerekmez. Yalnızca kişisel/ticari olmayan kullanım içindir.
  • : Kod yazmayanlar veya kodu bakımda tutmadan hızlı veri isteyen herkes için en iyi seçenek. AI düzen değişikliklerine uyum sağlar, sayfalama işlemlerini yönetir, Excel/Sheets/Airtable/Notion’a aktarır.

Bu rehberi yer imlerine ekleyin — IMDb’nin yapısı bir sonraki değiştiğinde güncelleyeceğim. Ve kodu tamamen atlamak istiyorsanız, ve bir IMDb sayfasından temiz bir tabloya ne kadar hızlı geçebileceğinizi görün. Başka sitelerle de çalışıyorsanız, rehberimiz daha geniş iş akışını kapsıyor.

IMDb ve daha fazlası için AI Web Scraper’ı deneyin

SSS

IMDb’yi kazımak yasal mı?

IMDb’nin Kullanım Koşulları, izin olmadan kazımayı yasaklar; ancak 2024’teki son mahkeme kararlarından sonra, kamuya açık verilerde ToS’un uygulanabilirliği hukuken tartışmalıdır. En güvenli seçenekler IMDb’nin (kişisel/ticari olmayan kullanım) veya TMDb API’dir (ücretsiz anahtar). Kazıma yapacaksanız robots.txt’ye uyun, istekler arasında makul gecikme kullanın ve engellenmiş yollardan kaçının. Ticari kullanım için hukuk uzmanına danışın.

IMDb kazıyıcım neden boş sonuç döndürüyor?

Nedeni neredeyse her zaman eski CSS seçicilerdir — td.titleColumn ve td.ratingColumn gibi sınıf adları Haziran 2023’ten beri yok. Çözüm, JSON-LD çıkarımına geçmek (<script type="application/ld+json"> etiketini ayrıştırmak) veya seçicilerinizi mevcut ipc- ön ekli sınıflara güncellemektir. Ayrıca uygun bir User-Agent başlığı eklediğinizden emin olun; eksik başlık, boş sonuç gibi görünebilen bir 403 hatasını tetikler.

IMDb’den 25’ten fazla sonucu nasıl kazıyabilirim?

Top 250 sayfası tüm 250 filmi tek bir yanıtta yükler — sayfalama gerekmez. Arama sonuçları için, sonuçlar arasında ilerlemek adına start= URL parametresini kullanın (50’şer artar). Örneğin: start=1, start=51, start=101. Engellenmemek için istekler arasına time.sleep(3) ekleyin. Alternatif olarak, adresindeki IMDb resmî veri kümeleri sayfalama gerektirmeyen 26M+ başlık içerir.

__NEXT_DATA__ nedir ve IMDb kazımada neden kullanmalıyım?

__NEXT_DATA__, IMDb’nin React/Next.js sayfalarında <script id="__NEXT_DATA__"> etiketinin içine gömülü bir JSON nesnesidir. React’ın sayfayı oluşturmak için kullandığı eksiksiz yapılandırılmış veriyi içerir — başlıklar, puanlar, oyuncular, türler, süre ve daha fazlası. Görsel düzen yerine alttaki veri modelini temsil ettiği için, CSS seçicilere kıyasla arayüz yeniden tasarımlarına daha dayanıklıdır. En sağlam çıkarım yaklaşımı için JSON-LD ile birlikte kullanın.

Kod yazmadan IMDb kazıyabilir miyim?

Evet. İki ana seçenek var: (1) IMDb’nin indirin — 26M+ başlığı kapsayan, günlük güncellenen 7 TSV dosyası; ticari olmayan kullanım için ücretsiz. (2) IMDb sayfasını okuyan, çıkarım alanlarını otomatik öneren ve veriyi iki tıkla Excel, Google Sheets veya CSV’ye aktaran kullanın — kod yok, bakım gerektiren seçici yok.

Daha Fazla Bilgi

Ke
Ke
Thunderbit'te CTO. Veriler karmaşıklaştığında herkesin ilk yazdığı kişi Ke'dir. Kariyerini, sıkıcı ve tekrarlayan işleri sessizce çalışan küçük otomasyonlara dönüştürerek geçirdi. Keşke bir elektronik tablo kendi kendini doldursa diye düşündüyseniz, Ke muhtemelen bunu yapan şeyi çoktan geliştirmiştir.
İçindekiler

Thunderbit’i dene

Lead’leri ve diğer verileri sadece 2 tıkla çek. Yapay zeka destekli.

Thunderbit’i Al Ücretsiz
Yapay zeka ile veri çıkar
Verileri kolayca Google Sheets, Airtable veya Notion’a aktar
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week