Kalau akhir-akhir ini Anda mencari “scrape IMDb with Python”, Anda mungkin sadar satu hal: kebanyakan tutorial yang muncul justru sudah rusak. Bukan rusak yang “sedikit usang” — lebih seperti rusak “menghasilkan nol hasil dan banjir error NoneType”.
Beberapa minggu terakhir saya menguji hampir semua tutorial besar tentang scraping IMDb yang bisa saya temukan — GeeksforGeeks, Medium, freeCodeCamp, notebook Kaggle, sebut saja. Dari yang diberi tag untuk scraping IMDb, sebagian besar masih merujuk selector CSS (td.titleColumn, td.ratingColumn) yang sudah tidak ada sejak Juni 2023 ketika IMDb mendesain ulang halaman Top 250 mereka. Hasilnya? Forum penuh dengan developer yang bertanya, “kenapa kode saya mengembalikan kosong?” dan maintainer library populer seperti “Tidak banyak yang bisa kami lakukan, selain memperbaiki setiap parser.” Panduan ini membahas dua metode Python yang benar-benar masih berfungsi saat ini, cara menangani pagination dan error umum, kapan Python sebenarnya bukan alat yang tepat, serta cara membuat scraper Anda tahan perubahan supaya tidak ikut masuk kuburan proyek gagal.
Apa Artinya Scrape IMDb dengan Python?
Web scraping adalah proses mengekstrak data dari halaman web secara terprogram — alih-alih menyalin dan menempel manual, Anda menulis skrip yang melakukannya untuk Anda. Saat kita bicara tentang “scraping IMDb”, yang dimaksud adalah mengambil data film terstruktur (judul, rating, genre, pemeran, durasi, jumlah suara) dari halaman IMDb menggunakan Python.
Stack Python yang umum untuk ini terdiri dari tiga library: requests (untuk mengambil halaman web), BeautifulSoup (untuk mengurai HTML dan mencari data), dan pandas (untuk mengatur serta mengekspor hasil). Beberapa tutorial juga memakai Selenium atau Playwright untuk halaman yang membutuhkan rendering JavaScript, tetapi seperti yang akan Anda lihat, ada pendekatan yang lebih cepat.
Satu catatan penting: semua isi panduan ini sudah diverifikasi terhadap struktur halaman IMDb terbaru per pertengahan 2025. IMDb biasanya mengubah tampilan sekitar setiap 6–12 bulan, jadi kalau Anda membaca ini pada 2027, sebagian selector mungkin sudah bergeser. (Saya juga akan jelaskan cara menghadapinya.)
Mengapa Scrape IMDb dengan Python? Contoh Penggunaan di Dunia Nyata
Sebelum menulis satu baris kode pun, sebenarnya data IMDb ini mau dipakai untuk apa? Jawabannya tergantung siapa Anda.
Dataset ulasan IMDb adalah salah satu benchmark NLP yang paling banyak digunakan di dunia — paper dasar oleh Maas dkk. (2011) sudah mengumpulkan , dan dataset ini sudah tertanam di TensorFlow, Keras, dan PyTorch. Di Hugging Face, dataset stanfordnlp/imdb diunduh 213.321 kali per bulan dan sudah dipakai untuk melatih lebih dari 1.500 model. Jadi kalau Anda bergerak di machine learning, Anda kemungkinan sudah akrab dengan data IMDb.
Tetapi kasus penggunaannya jauh melampaui dunia akademik:
| Kasus Penggunaan | Untuk Siapa | Field Data yang Dibutuhkan |
|---|---|---|
| Mesin rekomendasi film | Data scientist, penghobi | Judul, genre, rating, pemeran |
| Strategi konten platform streaming | Tim produk/konten | Rating, jumlah suara, tahun rilis, genre |
| Analisis sentimen / pelatihan NLP | Peneliti ML, mahasiswa | Ulasan, rating |
| Analisis konten kompetitor | Analis industri hiburan | Box office, tanggal rilis, tren rating |
| Riset wisata film | Dinas pariwisata, perusahaan travel | Lokasi syuting, metrik popularitas |
| Riset akademik | Peneliti universitas | Metadata film terstruktur apa pun |
Pasar wisata film saja diperkirakan bernilai . Netflix menghabiskan lebih dari $17 miliar untuk konten pada 2024, dengan didorong oleh rekomendasi yang dipersonalisasi. Intinya: data IMDb benar-benar dipakai untuk keputusan bisnis lintas industri.
Opsi Anda untuk Mendapatkan Data IMDb (Sebelum Menulis Kode)
Bagian ini sering dilewatkan sepenuhnya oleh tutorial lain. Mereka langsung loncat ke pip install beautifulsoup4 tanpa bertanya apakah scraping dengan Python memang pendekatan yang tepat untuk situasi Anda.
Berikut peta lengkapnya:
| Jalur | Paling Cocok Untuk | Kelebihan | Kekurangan |
|---|---|---|---|
| Python + BeautifulSoup | Belajar, ekstraksi kustom | Kontrol penuh, fleksibel | Selector rapuh, sering rusak |
Ekstraksi JSON-LD / __NEXT_DATA__ | Developer yang butuh stabilitas | Menangani konten JS, lebih tahan perubahan | Perlu memahami struktur JSON |
| IMDb Official Datasets | Analisis skala besar, penggunaan akademik | Legal, lengkap, 26 juta+ judul, update harian | Format TSV, tanpa ulasan/gambar |
| Library Cinemagoer (IMDbPY) | Lookup per judul secara terprogram | API ala Python, field kaya | 88 isu terbuka, rilis terakhir Mei 2023 |
| TMDb API | Metadata film + gambar | API key gratis, JSON, terdokumentasi baik | Sumber berbeda (bukan rating IMDb) |
| Thunderbit (no-code) | Non-coder, ekspor cepat | Scraping 2 klik, AI menyarankan field, ekspor ke Excel/Sheets | Berbasis kredit untuk scraping besar |
Ada beberapa catatan tentang opsi-opsi ini. Cinemagoer belum punya rilis PyPI sejak Mei 2023 dan sebagian besar parser-nya rusak setelah desain ulang IMDb pada Juni 2025 — saya tidak menyarankannya untuk penggunaan produksi saat ini. TMDb sangat bagus, tetapi memakai sistem rating sendiri, bukan rating IMDb. Dan API enterprise resmi IMDb biayanya melalui AWS Data Exchange, jadi itu jelas bukan opsi bagi kebanyakan orang.
Bagi pembaca yang sama sekali tidak ingin menulis kode, membaca halaman IMDb, menyarankan field ekstraksi secara otomatis (judul, rating, tahun, genre), lalu mengekspor ke Excel, Google Sheets, Airtable, atau Notion dalam dua klik. AI-nya beradaptasi saat IMDb mengubah tata letak, jadi tidak ada selector yang perlu dipelihara. Nanti saya bahas lebih lanjut.
Sekarang, untuk Anda yang memang ingin menulis Python — berikut dua metode yang berhasil.
Metode 1: Scrape IMDb dengan Python Menggunakan BeautifulSoup (Pendekatan Tradisional)
Ini adalah pendekatan klasik yang akan Anda temukan di kebanyakan tutorial. Cara ini memang berfungsi, tetapi saya ingin jujur: inilah metode yang paling rapuh dari semua yang akan saya bahas. Nama class CSS IMDb digenerate otomatis dan berubah saat redesign. Meski begitu, ini tetap cara terbaik untuk belajar dasar-dasar web scraping.
Langkah 1: Instal dan Import Library Python Anda
Anda butuh empat paket:
1pip install requests beautifulsoup4 pandas lxml
Fungsi masing-masing:
requests— mengirim permintaan HTTP untuk mengambil halaman webbeautifulsoup4— mengurai HTML agar Anda bisa mencari elemen tertentupandas— mengatur data yang diekstrak ke dalam tabel dan mengekspor ke CSV/Excellxml— parser HTML yang cepat (BeautifulSoup bisa menggunakannya sebagai backend)
Bagian import Anda:
1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
Langkah 2: Kirim Permintaan HTTP ke IMDb
Di sinilah kebanyakan pemula mentok pertama kali. IMDb memblokir permintaan yang tidak menyertakan header User-Agent yang layak — Anda akan mendapat error 403 Forbidden. String user-agent bawaan Python Requests (python-requests/2.31.0) langsung terdeteksi.
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"Gagal mengambil halaman: {response.status_code}")
9else:
10 print("Halaman berhasil diambil")
Header Accept-Language juga penting — tanpa itu, IMDb mungkin menampilkan konten dalam bahasa yang berbeda berdasarkan geolokasi IP Anda.
Langkah 3: Parse HTML dengan BeautifulSoup
Setelah Anda punya HTML, buat objek BeautifulSoup lalu mulai cari elemen yang tepat. Buka halaman Top 250 IMDb di Chrome, klik kanan pada judul film, lalu pilih “Inspect” untuk melihat struktur HTML dasarnya.
1soup = BeautifulSoup(response.text, "lxml")
Per pertengahan 2025, halaman Top 250 memakai selector berikut:
- Kontainer film:
li.ipc-metadata-list-summary-item - Judul:
h3.ipc-title__text - Tahun:
span.cli-title-metadata-item(span pertama) - Rating:
span.ipc-rating-star--rating
Perhatian: class name berawalan ipc- itu digenerate oleh sistem komponen IMDb. Sejauh ini stabil sejak redesign Juni 2023, tetapi tidak ada jaminan tidak akan berubah lagi.
Langkah 4: Ekstrak Data Film (Judul, Tahun, Rating)
Di sini saya berbeda dari kebanyakan tutorial: saya memasukkan penanganan error try/except. Tidak ada satu pun panduan pesaing yang saya review melakukan ini, dan itu alasan kenapa kode mereka diam-diam rusak saat selector berubah.
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> This paragraph contains content that cannot be parsed and has been skipped.
12print(f"Berhasil mengekstrak {len(movies)} film")
Langkah 5: Simpan ke CSV atau Excel dengan Pandas
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())
Contoh output:
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
Itu berfungsi. Tetapi semuanya bergantung pada selector CSS yang bisa saja rusak kapan pun — dan di sinilah kita masuk ke pendekatan yang sebenarnya saya rekomendasikan.
Metode 2: Trik JSON-LD — Lewati Parsing HTML Sepenuhnya
Ini adalah teknik yang tidak dibahas artikel kompetitor mana pun, dan ini yang akan saya pakai untuk proyek serius apa pun. IMDb menyematkan data terstruktur sebagai (JavaScript Object Notation for Linked Data) di tag <script type="application/ld+json"> pada setiap halaman. Data ini mengikuti standar Schema.org, dipakai Google untuk hasil pencarian kaya, dan jauh lebih jarang berubah dibandingkan nama class CSS.
Apify IMDb Scraper, alat kelas produksi, menggunakan urutan prioritas ekstraksi: “JSON-LD > NEXT_DATA > DOM.” Itulah hierarki yang juga saya sarankan.
Mengapa JSON-LD Lebih Andal daripada Selector CSS
| Pendekatan | Menangani Konten JS? | Tahan terhadap Perubahan UI? | Kecepatan | Kompleksitas |
|---|---|---|---|---|
| BeautifulSoup + selector CSS | ❌ Tidak | ⚠️ Rapuh (nama class bergeser) | Cepat | Rendah |
| Ekstraksi JSON-LD | ✅ Ya | ✅ Mengikuti standar Schema.org | Cepat | Rendah-Menengah |
Ekstraksi JSON __NEXT_DATA__ | ✅ Ya | ✅ Cukup stabil | Cepat | Rendah-Menengah |
| Selenium / Playwright | ✅ Ya | ⚠️ Rapuh | Lambat | Menengah-Tinggi |
| Thunderbit (no-code, 2 klik) | ✅ Ya (AI membaca halaman) | ✅ AI beradaptasi otomatis | Cepat | Tidak ada |
Nama class CSS seperti ipc-metadata-list-summary-item digenerate otomatis oleh sistem komponen React IMDb dan berubah setiap kali ada redesign. Skema JSON-LD merepresentasikan model data sebenarnya, bukan lapisan presentasi. Ini seperti bedanya membaca daftar isi buku versus mencoba menebak bab hanya dari ukuran font-nya.

Langkah demi Langkah: Ekstrak Data IMDb dari JSON-LD
Langkah 1: Ambil Halaman
Sama seperti sebelumnya — gunakan requests dengan header User-Agent yang layak.
1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5> This paragraph contains content that cannot be parsed and has been skipped.
6response = requests.get(url, headers=headers)
7soup = BeautifulSoup(response.text, "lxml")
Langkah 2: Cari Tag Script JSON-LD
1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3 print("Tidak ada JSON-LD di halaman ini")
4else:
5 data = json.loads(script_tag.string)
6 print(f"Menemukan JSON-LD dengan tipe: {data.get('@type', 'unknown')}")
Langkah 3: Parse Data Terstruktur
Pada halaman Top 250, JSON-LD berisi array itemListElement dengan semua 250 film. Setiap entri mencakup posisi, nama, URL, aggregateRating, datePublished, genre, description, director, dan array actor.
1movies = []
2for item in data.get("itemListElement", []):
3 movie = item.get("item", {})
4 rating_info = movie.get("aggregateRating", {})
5> This paragraph contains content that cannot be parsed and has been skipped.
6#### Langkah 4: Ekspor ke CSV
7```python
8df = pd.DataFrame(movies)
9df.to_csv("imdb_top_250_json_ld.csv", index=False)
10print(df.head())
Contoh output:
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
Semua 250 film. Bersih, terstruktur, tanpa akrobat selector CSS. Dan karena data ini mengikuti standar Schema.org (yang dipakai Google untuk hasil pencarian), kemungkinan perubahannya jauh lebih kecil daripada layout visualnya.
Bonus: __NEXT_DATA__ untuk Halaman Film Individual
Untuk data yang lebih kaya dari halaman judul individual (durasi, pemeran lengkap, ringkasan plot, gambar poster), IMDb juga menyematkan objek JSON __NEXT_DATA__. Inilah data yang dipakai React untuk menghidupkan halaman — tidak bisa dihapus tanpa merusak situs.
1# Pada halaman film individual seperti /title/tt0111161/
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"]
Gunakan JSON-LD untuk halaman chart/list, __NEXT_DATA__ untuk halaman judul individual. Itulah pendekatan kelas produksi.
Mengapa Scraper IMDb Anda Terus Rusak (Dan Cara Memperbaikinya)
Ini adalah masalah yang paling sering dilaporkan di semua forum scraping IMDb yang saya cek. Pengguna menulis: “Sebagian kode rusak karena perubahan UI” dan “Tidak berfungsi di 2024!” — lalu responsnya biasanya diam atau “coba Selenium.”
Akar masalahnya adalah migrasi IMDb yang terus berlangsung ke frontend React/Next.js. Berikut linimasa perubahan besar yang mematahkan scraper:
| Tanggal | Yang Berubah | Yang Rusak |
|---|---|---|
| Nov 2022 | Halaman Nama didesain ulang | Scraper halaman nama lama |
| Juni 2023 | Halaman Top 250 didesain ulang | Semua selector td.titleColumn / td.ratingColumn |
| April 2023 | Subhalaman judul didesain ulang | Scraper bio, penghargaan, berita |
| Okt 2023 | Advanced Search didesain ulang | Scraper berbasis pencarian |
| Juni 2025 | Halaman /reference didesain ulang | Library Cinemagoer (sebagian besar parser) |
Itu kira-kira satu perubahan besar yang mematahkan scraper setiap 6–12 bulan. Kalau scraper Anda bergantung pada nama class CSS, Anda sedang lari di treadmill.
Error Umum dan Cara Memperbaikinya
Hasil kosong / error NoneType
Ini error paling umum. Anda akan melihat AttributeError: 'NoneType' object has no attribute 'text'. Artinya BeautifulSoup tidak menemukan elemen yang Anda cari — biasanya karena nama class CSS berubah atau konten dirender oleh JavaScript.
Perbaikan: Pindah ke ekstraksi JSON-LD (Metode 2 di atas). Datanya ada di respons HTML awal, tidak perlu JavaScript.
403 Forbidden
IMDb memakai untuk mendeteksi dan memblokir bot. Pemicu nomor satu adalah header User-Agent yang hilang atau terlihat palsu. Ini sudah terdokumentasi di proyek open source dan tempat seorang karyawan IMDb mengakui masalah tersebut.
Perbaikan: Selalu sertakan string User-Agent browser yang realistis dan header Accept-Language: en-US. Gunakan requests.Session() untuk connection pooling.
Hanya 25 hasil yang muncul
Halaman pencarian IMDb dan daftar “Most Popular” memakai lazy loading — mereka hanya merender sekitar 25 hasil di awal dan memuat sisanya lewat AJAX saat Anda scroll.
Perbaikan: Gunakan pagination parameter URL (dibahas di bagian berikutnya) atau pindah ke halaman Top 250, yang memuat semua 250 film dalam satu respons.
Selector tiba-tiba berhenti berfungsi
Selector lama yang tidak lagi berfungsi: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Kalau kode Anda memakai salah satu dari ini, berarti sudah rusak.
Perbaikan: Lebih baik gunakan atribut data-testid (seperti h1[data-testid="hero-title-block__title"]) daripada nama class yang digenerate otomatis. Lebih bagus lagi, pakai JSON-LD.
Kerangka Pengambilan Keputusan: Perbaikan Jangka Pendek vs Jangka Panjang
- Perbaikan cepat: Tambahkan blok
try/exceptdi sekitar setiap selector, validasi status HTTP, log error alih-alih crash - Perbaikan menengah: Pindah dari selector CSS ke ekstraksi JSON-LD (Metode 2)
- Perbaikan jangka panjang: Gunakan untuk analisis skala besar, atau alat seperti yang memakai AI untuk membaca ulang struktur halaman setiap kali — tidak ada selector yang perlu dipelihara, AI menyesuaikan perubahan layout secara otomatis
Melampaui Batas 25 Hasil: Scraping Pagination dan Dataset Besar IMDb
Setiap tutorial pesaing yang saya review hanya men-scrape satu halaman. Tidak ada yang membahas pagination. Padahal kalau Anda butuh lebih dari satu daftar, Anda akan cepat menemui batas.
Halaman yang Tidak Perlu Pagination
Kabar baik: halaman Top 250 memuat semua 250 film dalam satu respons yang dirender server. JSON-LD dan __NEXT_DATA__ sama-sama berisi dataset lengkap. Tidak perlu pagination.
Cara Kerja Pagination Pencarian IMDb
Halaman pencarian IMDb memakai parameter URL start=, bertambah 50 setiap kali:
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
Berikut loop Python untuk mem-paging hasil:
1import time
2all_movies = []
3for start in range(1, 1001, 50): # Mem-paging top 1000
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"Gagal pada start={start}: {response.status_code}")
8 break
9 soup = BeautifulSoup(response.text, "lxml")
10 # Ekstrak film dengan metode pilihan Anda
11 # ...
12 print(f"Berhasil scrape halaman mulai {start}")
13 time.sleep(3) # Tetap sopan — IMDb memblokir setelah ~50 request cepat
time.sleep(3) itu penting. Laporan komunitas menunjukkan IMDb mulai memblokir IP setelah sekitar 50 request cepat. Jeda acak 2–5 detik adalah praktik yang baik.
Kapan Sebaiknya Tidak Scraping Sama Sekali: Bulk Dataset Resmi IMDb
Untuk kebutuhan yang benar-benar besar, IMDb menyediakan 7 file TSV gratis di , diperbarui setiap hari:
| File | Isi | Ukuran |
|---|---|---|
| title.basics.tsv.gz | Judul, tipe, genre, durasi, tahun | ~800 MB |
| title.ratings.tsv.gz | Rating rata-rata, jumlah suara | ~25 MB |
| title.crew.tsv.gz | Sutradara, penulis | ~300 MB |
| title.principals.tsv.gz | Pemeran/crew utama | ~2 GB |
| title.akas.tsv.gz | Judul alternatif per wilayah | ~1,5 GB |
| title.episode.tsv.gz | Info episode TV | ~200 MB |
| name.basics.tsv.gz | Orang: nama, tahun lahir, judul yang dikenal | ~700 MB |
Memuatnya ke Pandas itu mudah:
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# Gabungkan berdasarkan tconst (IMDb title ID)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")
Dataset ini mencakup 26 juta+ judul. Tanpa pagination, tanpa selector, tanpa error 403. Lisensinya hanya untuk penggunaan pribadi dan non-komersial — Anda tidak boleh menerbitkan ulang atau menjual data ini.
This paragraph contains content that cannot be parsed and has been skipped.
Jalan Pintas Tanpa Kode: Thunderbit Menangani Pagination untuk Anda
Bagi pembaca yang butuh data IMDb berpaginasi tetapi tidak ingin menulis logika pagination, mendukung pagination berbasis klik dan infinite scroll secara native. Anda minta dia scrape, sisanya dia yang tangani — termasuk scrolling konten yang diload secara lazy.
Scrape IMDb dengan Python: Kode Lengkap yang Berfungsi (Siap Copy-Paste)
Berikut dua skrip mandiri yang bisa langsung Anda jalankan sekarang.
Skrip A: Metode BeautifulSoup (Selector CSS)
1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4> This paragraph contains content that cannot be parsed and has been skipped.
5response = requests.get(url, headers=headers)
6if response.status_code != 200:
7 print(f"Error: {response.status_code}")
8 exit()
9soup = BeautifulSoup(response.text, "lxml")
10movie_items = soup.select("li.ipc-metadata-list-summary-item")
11movies = []
12for item in movie_items:
13 try:
14 title = item.select_one("h3.ipc-title__text")
15 year = item.select_one("span.cli-title-metadata-item")
16 rating = item.select_one("span.ipc-rating-star--rating")
17> This paragraph contains content that cannot be parsed and has been skipped.
18df = pd.DataFrame(movies)
19df.to_csv("imdb_top250_bs4.csv", index=False)
20print(f"Menyimpan {len(df)} film")
21print(df.head())
Skrip B: Metode JSON-LD (Disarankan)
1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5> This paragraph contains content that cannot be parsed and has been skipped.
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8 print(f"Error: {response.status_code}")
9 exit()
10> This paragraph contains content that cannot be parsed and has been skipped.
11if not script_tag:
12 print("Tidak ditemukan data JSON-LD")
13 exit()
14data = json.loads(script_tag.string)
15movies = []
16for item in data.get("itemListElement", []):
17 movie = item.get("item", {})
18 rating_info = movie.get("aggregateRating", {})
19 directors = movie.get("director", [])
20 director_names = ", ".join(
21 d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
22 )
23> This paragraph contains content that cannot be parsed and has been skipped.
24df = pd.DataFrame(movies)
25df.to_csv("imdb_top250_jsonld.csv", index=False)
26print(f"Menyimpan {len(df)} film")
27print(df.head())
Kedua skrip menyertakan penanganan error dan menghasilkan output CSV yang rapi. Skrip B memberi Anda data yang lebih kaya — sutradara, deskripsi, URL — dan lebih tahan terhadap perubahan layout.
Cara Scrape IMDb Tanpa Menulis Kode Sama Sekali (Menggunakan Thunderbit)
Tidak semua orang perlu atau ingin menulis Python. Mungkin Anda seorang analis operasional yang hanya butuh film dengan rating tertinggi minggu ini di spreadsheet. Mungkin Anda seorang content strategist yang ingin membandingkan tren genre lintas tahun. Dalam kasus-kasus seperti ini, membuat scraper sendiri justru terlalu berlebihan.
Berikut cara mendapatkan data yang sama menggunakan :
Sebelum mulai:
- Tingkat Kesulitan: Pemula
- Waktu yang Dibutuhkan: ~2 menit
- Yang Anda Butuhkan: Browser Chrome, (paket gratis bisa dipakai)
Langkah 1: Buka halaman IMDb yang ingin Anda scrape. Buka Top 250 IMDb (atau halaman daftar/pencarian IMDb lainnya) di Chrome.
Langkah 2: Klik "AI Suggest Fields" di sidebar Thunderbit. AI akan memindai halaman dan merekomendasikan kolom — biasanya Title, Year, Rating, Genre, dan beberapa lainnya tergantung halamannya. Anda akan melihat tabel pratinjau dengan field yang disarankan.
Langkah 3: Sesuaikan field jika perlu. Hapus kolom yang tidak dibutuhkan, atau tambahkan kolom kustom dengan mengklik "+ Add Column" dan mendeskripsikan apa yang Anda inginkan dalam bahasa biasa (misalnya, "Nama sutradara" atau "Jumlah suara").
Langkah 4: Klik "Scrape." Thunderbit mengekstrak datanya. Untuk halaman dengan infinite scroll atau pagination, scrolling ditangani otomatis.
Langkah 5: Ekspor. Klik tombol ekspor dan pilih format Anda — Excel, Google Sheets, CSV, Airtable, atau Notion. Datanya masuk ke tujuan Anda dalam hitungan detik.
Keunggulan utamanya bukan cuma soal kenyamanan — tetapi karena AI Thunderbit membaca struktur halaman dari awal setiap kali. Saat IMDb mengubah layout-nya (dan itu akan terjadi), AI ikut menyesuaikan. Tidak ada selector yang perlu diperbarui, tidak ada kode yang perlu diperbaiki. Bagi siapa pun yang pernah kena masalah scraper rusak jam 2 pagi menjelang deadline, nilai ini sangat besar.
Thunderbit juga mendukung scraping subhalaman — Anda bisa membuka detail tiap film dan memperkaya tabel dengan cast, sutradara, durasi, dan field lain yang tidak terlihat di halaman daftar. Kalau ingin melihatnya beraksi, kunjungi .
Apakah Scrape IMDb Itu Legal? Yang Perlu Anda Ketahui
Pengguna secara eksplisit menanyakan ini di forum: “Apakah sesuatu seperti ini legal?… IMDb tidak ingin orang melakukan scraping pada situs mereka.” Ini pertanyaan yang wajar, dan tidak ada artikel pesaing yang membahasnya.
robots.txt IMDb: Chart Top 250 (/chart/top/), halaman judul individual (/title/ttXXXXXXX/), dan halaman nama (/name/nmXXXXXXX/) TIDAK diblokir oleh robots.txt. Path yang diblokir termasuk /find, /_json/*, /search/name-text, /user/ur*/ratings, dan berbagai endpoint AJAX. Tidak ada direktif Crawl-delay yang ditentukan.
Conditions of Use IMDb: Klausul yang relevan berbunyi: “Anda tidak boleh menggunakan data mining, robots, screen scraping, atau alat pengumpulan dan ekstraksi data serupa di situs ini, kecuali dengan persetujuan tertulis dari kami.” Klausul tambahan melarang penjualan ulang atau penggunaan komersial atas data yang di-scrape.
Artinya dalam praktik: Putusan pengadilan 2024 yang relatif baru (Meta v. Bright Data, X Corp v. Bright Data) menyatakan bahwa Terms of Service mungkin tidak mengikat pengguna yang tidak pernah menyetujui syarat tersebut — jika Anda melakukan scraping data yang tersedia publik tanpa login, penegakan ToS masih bisa diperdebatkan. Namun ini area hukum yang terus berkembang.
Alternatif aman: secara eksplisit diizinkan untuk penggunaan pribadi dan non-komersial. API TMDb juga cukup permisif dengan API key gratis. Keduanya adalah opsi yang solid jika Anda ingin tetap jelas aman.
Panduan praktis: Kalau Anda tetap melakukan scraping, gunakan laju crawl yang sopan (time.sleep(3) antar request), set header yang benar, dan jangan menyentuh path yang diblokir robots.txt. Untuk proyek komersial, konsultasikan dengan profesional hukum atau gunakan dataset/API resmi.
Kami juga membahas secara mendalam di blog Thunderbit.
Kesimpulan: Pilih Cara yang Tepat untuk Scrape IMDb dengan Python
Versi singkatnya:
- BeautifulSoup + selector CSS: Bagus untuk belajar dasar-dasarnya. Siap-siap rusak setiap 6–12 bulan. Selalu sertakan penanganan error.
- Ekstraksi JSON-LD: Pendekatan yang saya rekomendasikan untuk proyek Python berkelanjutan apa pun. Mengikuti standar Schema.org, berubah jauh lebih jarang daripada class CSS, dan memberi data terstruktur yang bersih tanpa rendering JavaScript.
- JSON
__NEXT_DATA__: Gunakan ini sebagai pelengkap untuk data yang lebih kaya di halaman judul individual (durasi, pemeran lengkap, plot, gambar poster). - IMDb Official Datasets: Pilihan terbaik untuk analisis skala besar. 26 juta+ judul, update harian, tanpa perlu scraping. Hanya untuk penggunaan pribadi/non-komersial.
- : Pilihan terbaik untuk non-coder atau siapa pun yang ingin data cepat tanpa memelihara kode. AI menyesuaikan perubahan layout, menangani pagination, mengekspor ke Excel/Sheets/Airtable/Notion.
Bookmark panduan ini — saya akan memperbaruinya saat struktur IMDb berubah lagi. Dan kalau Anda ingin melewati kodenya sama sekali, dan lihat seberapa cepat Anda bisa berpindah dari halaman IMDb ke spreadsheet yang rapi. Kalau Anda juga bekerja dengan situs lain, panduan kami tentang membahas alur kerja yang lebih luas.
FAQ
Apakah legal melakukan scraping IMDb?
Terms of Service IMDb melarang scraping tanpa persetujuan, tetapi daya mengikat ToS untuk data yang bisa diakses publik masih diperdebatkan secara hukum setelah putusan pengadilan 2024 yang terbaru. Opsi paling aman adalah (penggunaan pribadi/non-komersial) atau API TMDb (kunci gratis). Jika Anda tetap melakukan scraping, hormati robots.txt, gunakan jeda yang wajar antar request, dan hindari path yang diblokir. Untuk penggunaan komersial, konsultasikan dengan profesional hukum.
Mengapa scraper IMDb saya mengembalikan hasil kosong?
Hampir selalu penyebabnya adalah selector CSS yang sudah usang — class seperti td.titleColumn dan td.ratingColumn sudah tidak ada sejak Juni 2023. Solusinya adalah pindah ke ekstraksi JSON-LD (parse tag <script type="application/ld+json">) atau perbarui selector Anda ke class terkini yang diawali ipc-. Pastikan juga Anda menyertakan header User-Agent yang benar, karena header yang hilang akan memicu error 403 yang bisa terlihat seperti hasil kosong.
Bagaimana cara scrape lebih dari 25 hasil dari IMDb?
Halaman Top 250 memuat semua 250 film dalam satu respons — tidak perlu pagination. Untuk hasil pencarian, gunakan parameter URL start= (bertambah 50 setiap halaman) untuk berpindah antar hasil. Contohnya: start=1, start=51, start=101. Tambahkan time.sleep(3) di antara request agar tidak diblokir. Alternatifnya, official datasets IMDb di berisi 26 juta+ judul tanpa perlu pagination.
Apa itu __NEXT_DATA__ dan kenapa saya harus memakainya untuk scrape IMDb?
__NEXT_DATA__ adalah objek JSON yang disematkan dalam tag <script id="__NEXT_DATA__"> pada halaman React/Next.js IMDb. Objek ini berisi data terstruktur lengkap yang dipakai React untuk merender halaman — judul, rating, cast, genre, durasi, dan lain-lain. Karena merepresentasikan model data dasar, bukan layout visual, objek ini lebih tahan terhadap redesign UI dibanding selector CSS. Gunakan bersama JSON-LD untuk pendekatan ekstraksi yang paling kuat.
Bisakah saya scrape IMDb tanpa coding?
Bisa. Dua opsi utama: (1) Unduh — 7 file TSV yang mencakup 26 juta+ judul, diperbarui harian, gratis untuk penggunaan non-komersial. (2) Pakai , yang membaca halaman IMDb, menyarankan field ekstraksi otomatis, dan mengekspor ke Excel, Google Sheets, atau CSV dalam dua klik — tanpa kode, tanpa selector yang perlu dipelihara.
Pelajari Lebih Lanjut
