Di zaman sekarang, mengekstrak data dari platform sosial online seperti IMDB dapat menjadi cara yang efektif untuk mengumpulkan informasi terkait film yang sangat dibutuhkan untuk tujuan penelitian atau kesenangan. Dalam tutorial ini, kita akan membahas cara mengikis 250 film teratas di IMDB menggunakan Python dan mengekstrak detail seperti judul film, ringkasan film, peringkat, genre, dan banyak lagi.
Ketika melakukan scraping pada situs web seperti IMDB, sangat penting untuk mensimulasikan perilaku pengguna yang sebenarnya untuk meminimalkan risiko deteksi dan memastikan pengambilan data yang sukses. Berikut adalah beberapa strategi yang dapat digunakan:
Untuk tutorial ini, kita akan menggunakan pustaka permintaan Python untuk mengunduh konten web, lxml untuk mem-parsing HTML, dan secara opsional, pustaka json untuk menangani data yang diformat bila diperlukan. Pertama, instal library yang dibutuhkan.
Sebelum memulai, Anda perlu menginstal pustaka Python yang diperlukan. Jalankan perintah berikut di terminal Anda untuk menginstalnya:
pip install requests lxml
Pustaka-pustaka ini akan digunakan untuk membuat permintaan HTTP, mem-parsing konten HTML, dan memproses data yang diekstrak.
Untuk membuat permintaan kita menyerupai permintaan dari peramban web sungguhan, sangat penting untuk mengatur header HTTP yang sesuai. Berikut ini adalah contoh bagaimana Anda dapat mengonfigurasi header ini dalam skrip Anda:
import requests
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1', # Header Jangan Lacak
'pragma': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
response = requests.get('https://www.imdb.com/chart/top/', headers=headers)
Proksi berguna untuk penggalian berskala besar. Proksi membantu Anda menghindari pemblokiran dengan mendistribusikan permintaan Anda ke beberapa IP. Berikut ini cara Anda dapat menyertakan proksi:
proxies = {
"http": "http://your_proxy_server",
"https": "https://your_proxy_server"
}
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)
Ganti "your_proxy_server" dengan detail proxy yang sebenarnya yang dapat Anda akses. Hal ini memastikan bahwa alamat IP Anda tidak terekspos, dan membantu menghindari pemblokiran.
Setelah mengambil konten halaman web, kita perlu mem-parsingnya untuk mengekstrak detail film. Kita akan menggunakan lxml untuk mem-parsing HTML dan json untuk menangani data terstruktur:
from lxml.html import fromstring
import json
# Mengurai respons HTML
parser = fromstring(response.text)
# Ekstrak data JSON-LD (data terstruktur) dari tag skrip
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Sekarang kita memiliki data film terstruktur dalam format JSON
Halaman IMDB Top 250 menyertakan data terstruktur yang tertanam di dalam HTML, yang dapat dengan mudah diakses menggunakan XPath dan diuraikan sebagai JSON. Kita akan mengekstrak detail film seperti nama, deskripsi, peringkat, genre, dan lainnya:
movies_details = json_data.get('itemListElement')
# Memutar ulang data film
movies_data = []
for movie in movies_details:
movie_type = movie['item']['@type']
url = movie['item']['url']
name = movie['item']['name']
description = movie['item']['description']
image = movie['item']['image']
bestRating = movie['item']['aggregateRating']['bestRating']
worstRating = movie['item']['aggregateRating']['worstRating']
ratingValue = movie['item']['aggregateRating']['ratingValue']
ratingCount = movie['item']['aggregateRating']['ratingCount']
contentRating = movie['item'].get('contentRating')
genre = movie['item']['genre']
duration = movie['item']['duration']
# Menambahkan data setiap film ke dalam daftar
movies_data.append({
'movie_type': movie_type,
'url': url,
'name': name,
'description': description,
'image': image,
'bestRating': bestRating,
'worstRating': worstRating,
'ratingValue': ratingValue,
'ratingCount': ratingCount,
'contentRating': contentRating,
'genre': genre,
'duration': duration
})
Setelah data diekstrak, penting untuk menyimpannya dalam format yang mudah dianalisis. Dalam kasus ini, kita akan menyimpannya ke file CSV menggunakan pustaka pandas:
import pandas as pd
# Mengonversi daftar film ke DataFrame pandas
df = pd.DataFrame(movies_data)
# Menyimpan data ke file CSV
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")
Berikut adalah kode lengkap untuk mengikis 250 film teratas IMDB:
import requests
from lxml.html import fromstring
import json
import pandas as pd
# Tentukan tajuk untuk permintaan
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
# Secara opsional, siapkan proxy
proxies = {
"http": "http://your_proxy_server",
"https": "https://your_proxy_server"
}
# Kirim permintaan ke halaman IMDB Top 250
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)
# Mengurai respons HTML
parser = fromstring(response.text)
# Ekstrak data JSON-LD
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Mengekstrak detail film
movies_details = json_data.get('itemListElement')
movies_data = []
for movie in movies_details:
movie_type = movie['item']['@type']
url = movie['item']['url']
name = movie['item']['name']
description = movie['item']['description']
image = movie['item']['image']
bestRating = movie['item']['aggregateRating']['bestRating']
worstRating = movie['item']['aggregateRating']['worstRating']
ratingValue = movie['item']['aggregateRating']['ratingValue']
ratingCount = movie['item']['aggregateRating']['ratingCount']
contentRating = movie['item'].get('contentRating')
genre = movie['item']['genre']
duration = movie['item']['duration']
movies_data.append({
'movie_type': movie_type,
'url': url,
'name': name,
'description': description,
'image': image,
'bestRating': bestRating,
'worstRating': worstRating,
'ratingValue': ratingValue,
'ratingCount': ratingCount,
'contentRating': contentRating,
'genre': genre,
'duration': duration
})
# Menyimpan data ke file CSV
df = pd.DataFrame(movies_data)
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")
Sebelum melakukan scraping pada situs web apa pun, penting untuk mempertimbangkan masalah etika dan hukum:
Selalu perhatikan peraturan dan gunakan pengikisan web untuk tujuan yang sah.
Komentar: 0