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:
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.
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.
İ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'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.
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
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
})
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")
İş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")
Herhangi bir web sitesini kazımadan önce, etik ve yasal konuları göz önünde bulundurmak önemlidir:
Her zaman kurallara dikkat edin ve web kazımayı meşru amaçlar için kullanın.
Yorumlar: 0