In der heutigen Welt kann das Extrahieren von Daten aus sozialen Online-Plattformen wie IMDB ein effektiver Weg sein, um dringend benötigte filmbezogene Informationen für Forschungs- oder Unterhaltungszwecke zu sammeln. In diesem Tutorial gehen wir durch das Scrapen der Top 250 Filme auf IMDB mit Python und extrahieren Details wie Filmtitel, Filmzusammenfassungen, Bewertungen, Genres und mehr.
Beim Scraping von Websites wie IMDB ist es wichtig, das Verhalten eines echten Benutzers zu simulieren, um das Entdeckungsrisiko zu minimieren und einen erfolgreichen Datenabruf sicherzustellen. Hier sind einige Strategien, die angewendet werden können:
Für dieses Tutorial werden wir die Python-Bibliothek requests zum Herunterladen von Webinhalten, lxml zum Parsen von HTML und optional die json-Bibliothek zum Umgang mit formatierten Daten bei Bedarf verwenden. Installieren Sie zunächst die erforderlichen Bibliotheken.
Bevor Sie beginnen, müssen Sie die erforderlichen Python-Bibliotheken installieren. Führen Sie den folgenden Befehl in Ihrem Terminal aus, um sie zu installieren:
pip install requests lxml
Diese Bibliotheken werden verwendet, um HTTP-Anfragen zu stellen, HTML-Inhalte zu parsen und die extrahierten Daten zu verarbeiten.
Damit unsere Anfragen denen eines echten Webbrowsers ähneln, ist es wichtig, die HTTP-Header entsprechend zu konfigurieren. Hier ist ein Beispiel dafür, wie Sie diese Header in Ihrem Skript konfigurieren können:
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', # Do Not Track-Kopfzeile
'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)
Proxies sind nützlich für groß angelegte Scraping-Aktivitäten. Sie helfen Ihnen, eine Blockierung zu vermeiden, indem sie Ihre Anfragen auf mehrere IPs verteilen. Hier erfahren Sie, wie Sie einen Proxy einbinden können:
proxies = {
"http": "http://your_proxy_server",
"https": "https://your_proxy_server"
}
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)
Ersetzen Sie "your_proxy_server" durch die tatsächlichen Proxy-Daten, auf die Sie Zugriff haben. Dadurch wird sichergestellt, dass Ihre IP-Adresse nicht offengelegt wird, und es hilft, eine Blockierung zu vermeiden.
Nachdem wir den Inhalt der Webseite abgerufen haben, müssen wir ihn parsen, um Filmdetails zu extrahieren. Wir verwenden lxml zum Parsen des HTML-Inhalts und json, um die strukturierten Daten zu verarbeiten:
from lxml.html import fromstring
import json
# Analysieren Sie die HTML-Antwort
parser = fromstring(response.text)
# Extrahieren der JSON-LD-Daten (strukturierte Daten) aus dem Skript-Tag
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Jetzt haben wir strukturierte Filmdaten im JSON-Format
Die IMDB Top 250 Seite enthält strukturierte Daten, die in den HTML-Code eingebettet sind und auf die mit XPath leicht zugegriffen werden kann und die als JSON geparst werden können. Wir extrahieren Filmdetails wie Name, Beschreibung, Bewertungen, Genres und mehr:
movies_details = json_data.get('itemListElement')
# Schleife durch die Filmdaten
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']
# Die Daten der einzelnen Filme an die Liste anhängen
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
})
Sobald die Daten extrahiert sind, ist es wichtig, sie in einem Format zu speichern, das leicht zu analysieren ist. In diesem Fall speichern wir sie mit der Pandas-Bibliothek in einer CSV-Datei:
import pandas as pd
# Konvertieren Sie die Liste der Filme in einen Pandas DataFrame
df = pd.DataFrame(movies_data)
# Speichern der Daten in einer CSV-Datei
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")
Hier ist der komplette Code zum Scrapen der Top 250 Filme von IMDB:
import requests
from lxml.html import fromstring
import json
import pandas as pd
# Definieren Sie Kopfzeilen für die Anfrage
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',
}
# Optional können Sie Proxys einrichten
proxies = {
"http": "http://your_proxy_server",
"https": "https://your_proxy_server"
}
# Senden Sie die Anfrage an die IMDB Top 250 Seite
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)
# Analysieren Sie die HTML-Antwort
parser = fromstring(response.text)
# Extrahieren der JSON-LD-Daten
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Filmdetails extrahieren
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
})
# Speichern der Daten in einer CSV-Datei
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")
Vor dem Scraping einer Website ist es wichtig, ethische und rechtliche Aspekte zu berücksichtigen:
Achten Sie immer auf die Regeln und verwenden Sie Web Scraping für legitime Zwecke.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0