Python kullanarak IMDB verileri nasıl kazınır?

Yorumlar: 0

Günümüz dünyasında, IMDB gibi çevrimiçi sosyal platformlardan veri çıkarmak, araştırma veya eğlence amacıyla filmlerle ilgili çok ihtiyaç duyulan bilgileri toplamak için etkili bir yol olabilir. Bu eğitimde, Python kullanarak IMDB'deki En İyi 250 filmi kazıyacağız ve film başlıkları, film özetleri, derecelendirmeler, türler ve daha fazlası gibi ayrıntıları çıkaracağız.

IMDB gibi web sitelerini kazırken, tespit edilme riskini en aza indirmek ve başarılı veri alımını sağlamak için gerçek bir kullanıcının davranışını simüle etmek çok önemlidir. İşte kullanılabilecek bazı stratejiler:

  1. IP Engellemesini Önleyin: Web siteleri, kazımayı önlemek için genellikle tek bir IP adresinden yapılabilecek istek sayısını sınırlar. Proxy kullanarak, isteklerinizi birden fazla IP adresine yayabilir ve engellenme riskini azaltabilirsiniz.
  2. Anonimliği Sağlayın: Proxy'ler gerçek IP adresinizi maskeler, bu da yalnızca gizliliğinizi korumaya yardımcı olmakla kalmaz, aynı zamanda web sitelerinin kazıma etkinliklerini size geri izlemesini zorlaştırır.
  3. Hız Limitlerine Uyun: İstekleri birden fazla proxy aracılığıyla dağıtmak, sorgularınızın sıklığını yönetmeye yardımcı olabilir, web sitesinin hız sınırları içinde kalabilir ve kazıma karşıtı önlemleri tetikleme olasılığını azaltabilir.
  4. Sunucu Şüphelerini Bypass Edin: User-Agent gibi tipik bir tarayıcınınkileri taklit eden başlıklar eklemek, kazıma isteklerinizin normal kullanıcı istekleri gibi görünmesini sağlayabilir. Bu, sunucunun faaliyetlerinizi şüpheli olarak işaretlemesini önleyebilir.

Adım 1: Kazıyıcının Hazırlanması

Bu eğitimde, web içeriğini indirmek için Python'un requests kütüphanesini, HTML'yi ayrıştırmak için lxml'yi ve gerektiğinde biçimlendirilmiş verileri işlemek için isteğe bağlı olarak json kütüphanesini kullanacağız. İlk olarak, gerekli kütüphaneleri yükleyin.

Kütüphanelerin yüklenmesi

Başlamadan önce, gerekli Python kütüphanelerini yüklemeniz gerekir. Bunları yüklemek için terminalinizde aşağıdaki komutu çalıştırın:


pip install requests lxml

Bu kütüphaneler HTTP istekleri yapmak, HTML içeriğini ayrıştırmak ve çıkarılan verileri işlemek için kullanılacaktır.

HTTP İstek Başlıklarının Yapılandırılması

İsteklerimizin gerçek bir web tarayıcısından gelen isteklere benzemesini sağlamak için HTTP başlıklarını uygun şekilde ayarlamak çok önemlidir. İşte bu başlıkları kodunuzda nasıl yapılandırabileceğinize dair bir örnek:


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',  # Takip Etme başlığı
    '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)

Proxy'leri Ayarlama

Proxy'ler büyük ölçekli kazıma için kullanışlıdır. İsteklerinizi birden fazla IP'ye dağıtarak engellenmekten kaçınmanıza yardımcı olurlar. İşte bir proxy'yi nasıl dahil edebileceğiniz:


proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

"your_proxy_server" yerine erişiminiz olan gerçek proxy bilgilerini yazın. Bu, IP adresinizin açığa çıkmamasını sağlar ve engellenmekten kaçınmanıza yardımcı olur.

Adım 2: HTML İçeriğini Ayrıştırma

Web sayfası içeriğini getirdikten sonra, film ayrıntılarını çıkarmak için ayrıştırmamız gerekir. HTML'yi ayrıştırmak için lxml ve yapılandırılmış verileri işlemek için json kullanacağız:


from lxml.html import fromstring
import json

# HTML yanıtını ayrıştırma
parser = fromstring(response.text)

# JSON-LD verilerini (yapılandırılmış veriler) kod etiketinden çıkarın
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Artık JSON biçiminde yapılandırılmış film verilerimiz var

Adım 3: Film Ayrıntılarını Çıkarma

IMDB Top 250 sayfası, XPath kullanılarak kolayca erişilebilen ve JSON olarak ayrıştırılabilen HTML içine gömülü yapılandırılmış veriler içerir. Ad, açıklama, derecelendirmeler, türler ve daha fazlası gibi film ayrıntılarını çıkaracağız:


movies_details = json_data.get('itemListElement')

# Film verileri arasında döngü
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']
    
    # Her filmin verilerini listeye ekle
    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
    })

Adım 4: Verilerin Depolanması

Veriler çıkarıldıktan sonra, analiz edilmesi kolay bir formatta saklanması önemlidir. Bu durumda, pandas kütüphanesini kullanarak bir CSV dosyasına kaydedeceğiz:


import pandas as pd

# Film listesini pandas DataFrame'e dönüştürme
df = pd.DataFrame(movies_data)

# Verileri bir CSV dosyasına kaydedin
df.to_csv('imdb_top_250_movies.csv', index=False)

print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")

Tamamlanmış Kod

İşte IMDB'nin En İyi 250 filmini kazımak için eksiksiz kod:


import requests
from lxml.html import fromstring
import json
import pandas as pd

# İstek için üstbilgileri tanımlama
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',
}

# İsteğe bağlı olarak, proxy'leri ayarlayın
proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

# IMDB Top 250 sayfasına istek gönderin
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

# HTML yanıtını ayrıştırma
parser = fromstring(response.text)

# JSON-LD verilerini ayıklayın
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Film ayrıntılarını çıkar
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
    })

# Verileri bir CSV dosyasına kaydedin
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")

Etik Hususlar

Herhangi bir web sitesini kazımadan önce, etik ve yasal konuları göz önünde bulundurmak önemlidir:

  • Robots.txt dosyasına saygı gösterin: Web sitesinin hangi bölümlerinin kazınmasına izin verildiğini görmek için IMDB'nin robots.txt dosyasını kontrol edin. Her zaman web sitesinin politikalarına uyun.
  • Sunucuya Aşırı Yüklenmekten Kaçının: Sunucuya gereksiz yük bindirmekten kaçınmak için isteklerinizin sıklığını sınırlandırarak verileri sorumlu bir şekilde kazıyın.
  • Hizmet Koşullarına Saygı Gösterin: Kazıma işleminin IMDB'nin hizmet şartlarını ihlal etmediğinden emin olun.

Her zaman kurallara dikkat edin ve web kazımayı meşru amaçlar için kullanın.

Yorumlar:

0 yorumlar