Cara mengikis data IMDB menggunakan Python

Komentar: 0

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:

  1. Hindari Pemblokiran IP: Situs web sering kali membatasi jumlah permintaan yang dapat dibuat dari satu alamat IP untuk mencegah pengikisan. Dengan menggunakan proxy, Anda bisa menyebarkan permintaan Anda ke beberapa alamat IP, sehingga mengurangi risiko pemblokiran.
  2. Memastikan Anonimitas: Proksi menyembunyikan alamat IP asli Anda, yang tidak hanya membantu melindungi privasi Anda, tetapi juga mempersulit situs web untuk melacak aktivitas scraping kembali kepada Anda.
  3. Mematuhi Batas Kecepatan: Mendistribusikan permintaan melalui beberapa proxy dapat membantu mengelola frekuensi kueri Anda, tetap berada dalam batas kecepatan situs web dan mengurangi kemungkinan memicu tindakan anti-scraping.
  4. Melewati Kecurigaan Server: Memasukkan header yang meniru header dari peramban biasa, seperti User-Agent, dapat membuat permintaan scraping Anda terlihat seperti permintaan pengguna biasa. Hal ini dapat mencegah server menandai aktivitas Anda sebagai sesuatu yang mencurigakan.

Langkah 1: Mempersiapkan Scraper

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.

Menginstal perpustakaan

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.

Mengkonfigurasi Header Permintaan HTTP

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)

Mengatur Proksi

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.

Langkah 2: Mengurai Konten HTML

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

Langkah 3: Mengekstrak Detail Film

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
    })

Langkah 4: Menyimpan Data

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")

Kode Lengkap

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")

Pertimbangan Etis

Sebelum melakukan scraping pada situs web apa pun, penting untuk mempertimbangkan masalah etika dan hukum:

  • Hormati Robots.txt: Periksa file robots.txt IMDB untuk melihat bagian situs web mana yang diizinkan untuk di-scraping. Selalu patuhi kebijakan situs web.
  • Hindari Membebani Server secara Berlebihan: Mengikis data secara bertanggung jawab dengan membatasi frekuensi permintaan Anda untuk menghindari beban yang tidak perlu pada server.
  • Hormati Ketentuan Layanan: Pastikan bahwa pengikisan tidak melanggar ketentuan layanan IMDB.

Selalu perhatikan peraturan dan gunakan pengikisan web untuk tujuan yang sah.

Komentar:

0 komentar