Wie man mit Python IMDB-Daten abgreift

Bemerkungen: 0

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:

  1. Vermeiden Sie IP-Sperren: Websites begrenzen oft die Anzahl der Anfragen, die von einer einzigen IP-Adresse aus gestellt werden können, um Scraping zu verhindern. Durch die Verwendung von Proxys können Sie Ihre Anfragen auf mehrere IP-Adressen verteilen und so das Risiko einer Sperrung verringern.
  2. Gewährleisten Sie Anonymität: Proxys verbergen Ihre echte IP-Adresse, was nicht nur Ihre Privatsphäre schützt, sondern es auch für Websites schwieriger macht, Scraping-Aktivitäten zu Ihnen zurückzuverfolgen.
  3. Geschwindigkeitsbegrenzungen einhalten: Die Verteilung von Anfragen über mehrere Proxys kann dazu beitragen, die Häufigkeit Ihrer Abfragen zu steuern, so dass die Geschwindigkeitsbegrenzungen der Website eingehalten werden und die Wahrscheinlichkeit, dass Anti-Scraping-Maßnahmen ausgelöst werden, sinkt.
  4. Server-Verdachtsmomente aushebeln: Durch das Einfügen von Headern, die denen eines typischen Browsers ähneln, wie z. B. User-Agent, können Ihre Scraping-Anfragen eher wie normale Benutzeranfragen aussehen. Dadurch kann der Server verhindern, dass Ihre Aktivitäten als verdächtig eingestuft werden.

Schritt 1: Vorbereiten des Scrapers

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.

Installation der 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.

Konfiguration der HTTP-Anfrage-Header

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)

Einrichtung von Proxys

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.

Schritt 2: Parsen des HTML-Inhalts

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

Schritt 3: Filmdetails extrahieren

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

Schritt 4: Speichern der Daten

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

Kompletter Code

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

Ethische Erwägungen

Vor dem Scraping einer Website ist es wichtig, ethische und rechtliche Aspekte zu berücksichtigen:

  • Beachten Sie die Robots.txt: Überprüfen Sie die robots.txt-Datei von IMDB, um zu sehen, welche Teile der Website zum Scraping zugelassen sind. Halten Sie sich immer an die Richtlinien der Website.
  • Vermeiden Sie die Überlastung des Servers: Scrapen Sie Daten verantwortungsbewusst, indem Sie die Häufigkeit Ihrer Anfragen begrenzen, um eine unnötige Belastung des Servers zu vermeiden.
  • Respektieren Sie die Servicebedingungen: Stellen Sie sicher, dass das Scrapen nicht gegen die Nutzungsbedingungen von IMDB verstößt.

Achten Sie immer auf die Regeln und verwenden Sie Web Scraping für legitime Zwecke.

Bemerkungen:

0 Bemerkungen