IMDb ist einer der größten öffentlichen Filmkataloge im offenen Web und enthält faktische Metadaten zu Millionen von Titeln: der Name eines Films, das Erscheinungsjahr, seine aggregierte Nutzerbewertung, seine Genres, Laufzeit und den Regisseur. Forscher, die Erscheinungstrends untersuchen, Hobbyisten, die eine persönliche Filmdatenbank aufbauen, und Entwickler, die einen Empfehlungsdienst prototypisieren, greifen alle auf dieselben öffentlichen Titelseiten zurück, auf denen diese Metadaten in einem recht vorhersehbaren Layout zu finden sind.
Diese Anleitung zeigt Ihnen, wie Sie IMDb-Filmdaten mit JavaScript und Node.js sowie Cheerio scrapen. Sie erstellen einen kleinen, lauffähigen Scraper, der eine öffentliche IMDb-Titelseite über die Crawling API abruft, Filmtitel, Erscheinungsjahr, IMDb-Bewertung, Genre, Laufzeit und Regisseur parst und das Ergebnis als JSON und CSV exportiert. Die gesamte Anleitung beschränkt sich auf öffentliche faktische Filmmetadaten, und der Abschnitt zur Rechtslage am Ende ist kein Boilerplate. Lesen Sie ihn daher, bevor Sie den Scraper auf größere Mengen ansetzen.
Was Sie bauen werden
Ein Node.js-Skript, das eine öffentliche IMDb-Titel-URL entgegennimmt, das gerenderte HTML über die Crawling API abruft und für diesen Film einen strukturierten Datensatz extrahiert. Wir verwenden The Shawshank Redemption als durchgängiges Beispiel und lesen diese faktischen Felder pro Titel:
- Titel der primäre Filmtitel im Hero-Bereich der Seite, zum Beispiel "The Shawshank Redemption".
- Jahr das neben dem Titel aufgeführte Erscheinungsjahr.
- Rating die aggregierte IMDb-Nutzerbewertung von 10.
- Genre die von IMDb dem Titel zugewiesenen Genre-Chips, zum Beispiel "Drama".
- Runtime die aufgeführte Laufzeit des Films.
- Director der als Regisseur genannte Verantwortliche.
Warum ein einfacher Request bei IMDb scheitert
Wenn Sie eine IMDb-Titel-URL mit einem einfachen HTTP-Client anfordern, erhalten Sie selten die erwarteten Metadaten. Zwei Faktoren arbeiten gegen Sie. Erstens rendert IMDb einen Großteil der Titelseite im Browser mit JavaScript, sodass das initiale HTML eine dünne Hülle ist, bis die Seitenskripte ausgeführt werden und Bewertung, Credits und Detailzeilen befüllen. Zweitens überwacht IMDb automatisierten Traffic: Datacenter-IPs und Anfragemuster, die nicht nach einem echten Browser aussehen, werden rate-limited oder gechallengt, bevor sie überhaupt die gerenderte Seite erreichen.
Ein funktionierender IMDb-Scraper benötigt daher zwei Dinge in einer einzigen Anfrage: einen Browser, der die Seite tatsächlich rendert, und eine IP-Adresse, die die Plattform als echten Besucher einordnet. Das lässt sich selbst mit einem Headless-Browser plus einem Pool rotierender Residential-Proxys zusammensetzen, aber das Zusammenführen und Pflegen dieser Komponenten ist der aufwändigste Teil. Die Crawling API fasst beides in einem einzigen Aufruf zusammen: Sie übergeben ihr die URL, sie rendert die Seite hinter einer vertrauenswürdigen IP und liefert fertiges HTML zur Verarbeitung mit Cheerio zurück.
Die Crawling API gibt Ihnen zwei Token: ein normales und ein JavaScript-Token. IMDb befüllt Bewertung und Credits im Browser, also verwenden Sie für jede Anfrage in dieser Anleitung Ihr JavaScript-Token. Das normale Token liefert die ungerenderte Hülle, und Ihre Selektoren kommen leer zurück.
Voraussetzungen
Sie benötigen einige Dinge, bevor Sie Code schreiben. Keines davon nimmt viel Zeit in Anspruch.
Grundlegendes JavaScript und Node.js. Sie sollten in der Lage sein, ein Node-Skript zu schreiben und auszuführen sowie Pakete mit npm zu installieren. Wenn Sie neu in Node sind, bringen Sie die offiziellen Docs und ein Einstiegs-Tutorial auf das Niveau, das dieses Tutorial voraussetzt. Eine ausführlichere Einführung bietet unsere Anleitung zum Erstellen eines Web-Scrapers mit Node.js.
Node.js 16 oder höher. Prüfen Sie Ihre Version mit node --version. Falls Sie es nicht haben, installieren Sie es von der Node.js-Website oder über einen Version-Manager wie nvm.
Ein Crawlbase-Konto und Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr JavaScript-Token von der Account-Docs-Seite. Der kostenlose Tarif gibt Ihnen bis zu 20.000 Anfragen ohne Kreditkarte, und Sie zahlen nur für erfolgreiche Anfragen. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, halten Sie es also aus der Versionskontrolle heraus.
Projekt einrichten
Erstellen Sie einen Projektordner, initialisieren Sie ihn und installieren Sie die zwei Bibliotheken, die der Scraper benötigt.
node --version mkdir imdb-scraper && cd imdb-scraper npm init -y npm install crawlbase cheerio
Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Node-Client für die Crawling API, und cheerio parst das zurückgegebene HTML mit einer jQuery-ähnlichen API, sodass Sie einzelne Felder per CSS-Selector extrahieren können. Erstellen Sie in diesem Ordner eine Datei namens scraper.js und fügen Sie den Code aus den folgenden Schritten hinzu.
Schritt 1: Die gerenderte Titelseite abrufen
Beginnen Sie damit, die fertig gerenderte Seite zu holen. Importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem JavaScript-Token und fordern Sie eine öffentliche IMDb-Titel-URL an. Für dieses Beispiel verwenden wir The Shawshank Redemption unter https://www.imdb.com/title/tt0111161/. Die Statuscode-Prüfung vor dem Parsen macht Fehler sofort sichtbar, anstatt sie zu verschleiern.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const imdbPageURL = 'https://www.imdb.com/title/tt0111161/'; api .get(imdbPageURL) .then((response) => { if (response.statusCode === 200) { console.log(response.body.slice(0, 500)); } }) .catch((error) => console.error('API request error:', error));
Führen Sie das Skript mit node scraper.js aus, und Sie sollten echtes IMDb-Titel-Markup am Anfang des Body sehen, keine gekürzte Hülle. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selector schreiben. Die Crawling API verwendet das von Ihnen bereitgestellte JavaScript-Token, um die Seite in einem echten Browser zu rendern, sodass Bewertung und Credits im zurückgegebenen HTML vorhanden sind.
Diese erste Anfrage hat gerade eine vollständig gerenderte IMDb-Titelseite zurückgeliefert, ohne Headless-Browser oder Proxy auf Ihrer Seite. Die Crawling API führt die Seite in einem echten Browser aus, rotiert serverseitig Residential-IPs und verarbeitet die Challenges, die IMDb automatisiertem Traffic entgegenwirft, sodass Sie fertiges HTML aus einem einzigen Aufruf erhalten. Testen Sie es zunächst mit einem öffentlichen Titel im kostenlosen Tarif und fügen Sie dann Ihren Parser hinzu.
Schritt 2: Die Filmfelder mit Cheerio parsen
Mit dem gerenderten HTML laden Sie es in Cheerio und lesen jedes Feld per Selector aus. IMDb kennzeichnet einen Großteil der gewünschten Metadaten mit stabilen data-testid-Attributen, die leichter zu selektieren sind als die generierten Klassennamen. Wir lesen Titel und Jahr aus dem Hero-Bereich der Seite, die Bewertung aus dem Aggregate-Rating-Block, das Genre aus der Chip-Liste sowie Laufzeit und Regisseur aus den Detailzeilen des Titels. Das defensive Lesen jedes Feldes verhindert, dass ein fehlender Wert den Durchlauf abbricht.
const cheerio = require('cheerio'); function parseMovieFromHTML(html) { const $ = cheerio.load(html); const getText = (selector) => $(selector).first().text().trim(); // Read every chip in a labelled metadata row, joined into one string const getRowItems = (selector) => $(selector) .map((_, el) => $(el).text().trim()) .get() .join(', '); const title = getText( '[data-testid="hero__pageTitle"] .hero__primary-text', ); // The first metadata link under the hero title is the release year const year = getText( '[data-testid="hero__pageTitle"] + ul li:first-child a', ); const rating = getText( '[data-testid="hero-rating-bar__aggregate-rating__score"] span', ); const genre = getRowItems( '.ipc-chip-list--baseAlt .ipc-chip__text', ); const runtime = getRowItems( '[data-testid="title-techspec_runtime"] .ipc-metadata-list-item__content-container', ); const director = getRowItems( 'li:contains("Director") a.ipc-metadata-list-item__list-content-item--link:first', ); return { title, year, rating, genre, runtime, director }; }
Einige Details sorgen für Treue zur Seite. Der Titel stammt aus dem Hero-Element [data-testid="hero__pageTitle"] .hero__primary-text, und das Jahr ist der erste Metadaten-Link direkt dahinter. Die aggregierte IMDb-Bewertung befindet sich in [data-testid="hero-rating-bar__aggregate-rating__score"], die Genre-Chips in der Liste .ipc-chip-list--baseAlt .ipc-chip__text und die Laufzeit in der Detailzeile title-techspec_runtime. Der Regisseur wird aus der Credits-Zeile gelesen, die das Label "Director" enthält, wobei der erste verlinkte Name übernommen wird. Das Zusammenfügen der Zeilenelemente zu einem String hält die Ausgabe flach und leicht speicherbar.
Die Klassennamen von IMDb (die generierten ipc-*-Suffixe) ändern sich ohne Vorankündigung; die data-testid-Attribute sind stabiler, aber nicht garantiert. Betrachten Sie die Selektoren als Startvorlage, nicht als Vertrag. Wenn ein Feld leer zurückkommt, untersuchen Sie die Live-Seite in den Entwicklertools Ihres Browsers und aktualisieren Sie den Selector. Regelmäßige Selektor-Wartung ist für jeden produktiven Scraper normal, kein Zeichen für einen Fehler.
Schritt 3: Das vollständige Skript mit JSON- und CSV-Export zusammenstellen
Verbinden Sie nun Fetch und Parse zu einem lauffähigen Skript und schreiben Sie den Datensatz als JSON und CSV auf die Festplatte. Ein einfaches Skript hält die beweglichen Teile klein; Sie können es später in einen Endpunkt einbetten, wenn Sie möchten.
const fs = require('fs'); const { CrawlingAPI } = require('crawlbase'); const cheerio = require('cheerio'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); async function crawl(pageUrl) { const response = await api.get(pageUrl); if (response.statusCode === 200) return response.body; console.error(`Request failed: ${response.statusCode}`); return null; } function toCsv(row) { const headers = [ 'title', 'year', 'rating', 'genre', 'runtime', 'director', ]; const escape = (value) => `"${String(value).replace(/"/g, '""')}"`; const values = headers.map((h) => escape(row[h])); return [headers.join(','), values.join(',')].join('\n'); } async function main() { const url = 'https://www.imdb.com/title/tt0111161/'; const html = await crawl(url); if (!html) return; const movie = parseMovieFromHTML(html); fs.writeFileSync('movie.json', JSON.stringify(movie, null, 2)); fs.writeFileSync('movie.csv', toCsv(movie)); console.log(`Saved ${movie.title} to JSON and CSV`); } main();
Fügen Sie die parseMovieFromHTML-Funktion aus Schritt 2 in dieselbe Datei ein, damit main sie aufrufen kann. Führen Sie das Skript mit node scraper.js aus und erhalten Sie zwei Dateien: movie.json mit dem vollständigen strukturierten Datensatz und movie.csv, die sich direkt in einer Tabelle öffnen lässt. Der toCsv-Helper setzt jedes Feld in Anführungszeichen und verdoppelt eingebettete Anführungszeichen, was bei Titeln und Genre-Listen mit Kommas wichtig ist.
Wie die Ausgabe aussieht
Die JSON-Datei enthält ein Objekt mit Titel, Jahr, IMDb-Bewertung, Genre, Laufzeit und Regisseur.
{ "title": "The Shawshank Redemption", "year": "1994", "rating": "9.3", "genre": "Drama", "runtime": "2h 22m", "director": "Frank Darabont" }
Die CSV spiegelt denselben Datensatz mit einer Kopfzeile wider und lässt sich direkt in Excel, Google Sheets oder jede Datenpipeline laden, die durch Trennzeichen begrenzte Dateien liest.
title,year,rating,genre,runtime,director "The Shawshank Redemption","1994","9.3","Drama","2h 22m","Frank Darabont"
Auf viele Titel skalieren
Eine Titelseite ist eine Demo; ein echter Job sammelt Metadaten über eine Liste von Filmen. Da jede IMDb-Titelseite dieselbe Hero- und Detailzeilen-Struktur teilt, funktioniert der bereits geschriebene Parser auf allen ohne Änderungen. Verwalten Sie eine Liste von Titel-URLs, rufen Sie jede über die Crawling API ab, parsen Sie sie mit derselben Funktion und sammeln Sie die Datensätze. Drosseln Sie die Anfragen mit einer kurzen Verzögerung, um unter den Rate-Limits von IMDb zu bleiben.
async function scrapeTitles(urls) { const movies = []; for (const url of urls) { const html = await crawl(url); if (!html) continue; const movie = parseMovieFromHTML(html); movies.push(movie); console.log(`Parsed ${movie.title || url}`); // Pace requests so you stay under the rate limit await new Promise((r) => setTimeout(r, 2000)); } return movies; }
Für einen größeren Rückstand an Titeln, auf die Sie nicht synchron warten möchten, ermöglicht der asynchrone Crawler das Übergeben von URLs und das Sammeln von Ergebnissen, ohne eine Verbindung pro Anfrage offen zu halten. Mehr über gerenderte, JavaScript-intensive Seiten wie diese finden Sie in unserer Anleitung zum Crawlen von JavaScript-Websites.
Nicht blockiert werden
Auch wenn das Rendering bereits gehandhabt wird, überwacht IMDb weiterhin Scraper-typischen Traffic. Einige Gewohnheiten halten einen Durchlauf gesund, und sie gelten für jede große öffentliche Website.
- Anfragen drosseln. Führen Sie eine Verzögerung zwischen Fetches ein, anstatt die Website in einer engen Schleife zu hämmern. Anfragen zu verteilen ist der bei weitem wichtigste Faktor, um unter den Rate-Limits von IMDb zu bleiben.
- Rotation nutzen. Ein Pool von Residential-IPs verteilt Anfragen über viele echte Nutzeradressen, sodass keine einzelne davon ein Limit auslöst. Die Crawling API erledigt das für Sie; wenn Sie einen eigenen Stack aufbauen, ist das der Teil, den Sie richtig hinbekommen müssen.
- Statuscodes lesen. Ein Durchlauf, der beginnt, Challenges oder Nicht-200-Antworten zurückzugeben, signalisiert Ihnen, dass die aktuelle Rate oder IP-Stufe nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückrudern, nicht als Rauschen, das Sie ignorieren können.
Das umfassendere Playbook finden Sie unter scrape websites without getting blocked. Wenn Sie ähnliche Metadaten aus anderen Unterhaltungsquellen wünschen, lässt sich dasselbe Fetch-und-Parse-Muster direkt auf das Scrapen von Rotten Tomatoes und Goodreads-Bewertungen übertragen.
Ist das Scrapen von IMDb legal?
Ob das Scrapen von IMDb erlaubt ist, hängt von den Nutzungsbedingungen von IMDb, Ihrer Rechtsprechung und dem ab, was Sie mit den Daten tun. Die IMDb-Bedingungen schränken den automatisierten Zugriff und die Wiederverwendung von Inhalten ein, sodass das Scrapen gegen diese Bedingungen verstoßen kann, unabhängig davon, wie sorgfältig Ihre Tools sind. Keiner der Codes hier ändert daran etwas; er macht nur den technischen Teil funktionsfähig. Lesen Sie die Nutzungsbedingungen von IMDb und dessen robots.txt, respektieren Sie alle darin genannten Rate-Erwartungen und behandeln Sie beides als Grenze für das, was Sie sammeln. Das begrenzte Sammeln öffentlicher faktischer Felder für persönliche Forschung ist etwas ganz anderes als umfangreiche oder kommerzielle Extraktion, die IMDb ohne ausdrückliche Genehmigung nicht gestattet.
Diese Anleitung beschränkt sich bewusst auf öffentliche faktische Filmmetadaten: Titel, Erscheinungsjahr, aggregierte Nutzerbewertung, Genre, Laufzeit und Regisseur, die jeder auf einer öffentlichen Titelseite ohne Anmeldung sehen kann. Das sind faktische Katalogdaten, keine personenbezogenen Daten, und es ist der sichere Bereich, in dem man bleiben sollte. Was nicht abgedeckt wird, sind die urheberrechtlich geschützten Materialien auf denselben Seiten. Handlungszusammenfassungen, Nutzerbewertungen, Redaktionstexte, Poster und Standbilder sind geschützte Inhalte. Bewertungen, Zusammenfassungen oder Bilder nicht pauschal weiterverbreiten und nicht so republizieren, als wären sie eigene Werke. Beschränken Sie die Nutzung auf den kleinen Satz faktischer Felder und halten Sie das Volumen moderat.
Wenn Ihr Projekt mehr als eine Handvoll öffentlicher Felder benötigt, ist der offizielle Weg der richtige, kein ausgefeilterer Scraper. IMDb veröffentlicht offizielle, lizenzierbare Datensätze für die nicht-kommerzielle Nutzung und bietet die kommerzielle Datenlizenzierung über IMDb und sein Mutterunternehmen für Produktionsanforderungen an. Das sind die richtigen Werkzeuge, wenn Sie große Mengen, garantierte Struktur oder das Recht zur kommerziellen Nutzung der Daten benötigen, und sie kommen mit klaren Nutzungs- und Zuordnungsbedingungen. Wenn Sie unsicher sind, ob eine Nutzung erlaubt ist, holen Sie ein Datenlizenzabkommen ein, anstatt davon auszugehen, dass Schweigen Zustimmung bedeutet.
Wichtigste Erkenntnisse
- IMDb rendert Metadaten clientseitig. Ein einfacher Request liefert eine dünne Hülle, daher müssen Sie die Seite hinter einer vertrauenswürdigen IP rendern und dabei das JavaScript-Token verwenden, bevor Sie sie parsen.
- Die Crawling API erledigt beides in einem Aufruf. Sie rendert die Seite in einem echten Browser und rotiert Residential-IPs, gibt fertiges HTML zurück, das Sie mit Cheerio parsen.
-
Cheerio extrahiert die Felder. Selektieren Sie den Hero-Titel, den Aggregate-Rating-Block, die Genre-Chips sowie die Laufzeit- und Regisseur-Detailzeilen und bevorzugen Sie dabei die
data-testid-Attribute, da generierte Klassennamen sich ändern können. - Skalieren und exportieren. Verwenden Sie denselben Parser für eine Liste von Titel-URLs, drosseln Sie Anfragen und schreiben Sie strukturierte Datensätze als JSON und CSV.
- Auf öffentliche faktische Daten beschränken. Sammeln Sie nur Titel, Jahr, Bewertung, Genre, Laufzeit und Regisseur, verteilen Sie niemals Bewertungen, Zusammenfassungen oder Bilder, respektieren Sie die Nutzungsbedingungen und robots.txt und bevorzugen Sie für Volumen oder kommerzielle Nutzung den offiziellen Datensatz oder Feed von IMDb.
Häufig gestellte Fragen
Kann ich einen IMDb-Scraper in einer anderen Sprache als JavaScript erstellen?
Ja. Diese Anleitung verwendet JavaScript mit Cheerio, aber derselbe Ansatz funktioniert in jeder Sprache. Die Crawling API verfügt über Bibliotheken und SDKs für mehrere Sprachen, sodass Sie das gerenderte HTML auf dieselbe Weise abrufen und mit dem HTML-Parser Ihrer Wahl parsen können, zum Beispiel BeautifulSoup in Python. Selektoren und Felder bleiben dieselben; nur die Parse-Syntax ändert sich.
Warum liefert ein einfacher Request unvollständige Daten von IMDb?
Weil IMDb einen Großteil der Titelseite im Browser mit JavaScript befüllt und automatisierten Traffic überwacht. Ein roher HTTP-Request von einer Datacenter-IP liefert in der Regel eine dünne Hülle ohne Bewertung und Credits oder eine Challenge-Seite. Um eine vollständige Seite zu erhalten, müssen Sie sie hinter einer vertrauenswürdigen IP rendern, was die Crawling API mit dem JavaScript-Token für Sie übernimmt.
Meine Selektoren liefern leere Werte. Was hat sich geändert?
Höchstwahrscheinlich das Markup von IMDb. Seine generierten ipc-*-Klassennamen ändern sich ohne Vorankündigung, sodass Selektoren, die letzten Monat funktionierten, brechen können. Bevorzugen Sie die stabileren data-testid-Attribute wo vorhanden, untersuchen Sie eine Live-Seite in den Entwicklertools Ihres Browsers, aktualisieren Sie die Selektoren in parseMovieFromHTML, und Sie sind wieder einsatzbereit. Regelmäßige Selektor-Wartung ist für jeden produktiven Scraper normal.
Hat IMDb eine offizielle API oder einen Datensatz?
IMDb bietet keine allgemeine öffentliche API an, veröffentlicht jedoch offizielle Datensätze für persönliche und nicht-kommerzielle Nutzung und lizenziert Daten kommerziell über IMDb und sein Mutterunternehmen. Für Produktionsanforderungen, große Mengen oder kommerzielle Weiterverwendung ist der lizenzierte Datensatz oder Feed der richtige, empfohlene Weg. Dieser öffentliche Datenscraper eignet sich am besten für Forschung, Prototyping und kleinere Analysen, bei denen ein offizielles Abkommen nicht gerechtfertigt ist.
Kann ich auch Bewertungen, Handlungszusammenfassungen und Poster scrapen?
Das liegt außerhalb des Rahmens dieser Anleitung. Bewertungen, Zusammenfassungen, Redaktionstexte, Poster und Standbilder sind urheberrechtlich geschützte Inhalte, und ihre pauschale Weiterverbreitung verletzt dieses Urheberrecht, auch wenn sie auf einer öffentlichen Seite sichtbar sind. Beschränken Sie die Sammlung auf die hier abgedeckten faktischen Felder: Titel, Jahr, Bewertung, Genre, Laufzeit und Regisseur, und verwenden Sie den offiziellen Datensatz oder eine Lizenz von IMDb, wenn Sie das geschützte Material benötigen.
Werde ich beim Scrapen von IMDb blockiert?
Das kann passieren, wenn Sie zu viele Anfragen zu schnell von einer einzigen Adresse senden. Die Crawling API verringert dieses Risiko durch das Rotieren von Residential-IPs, aber Sie sollten trotzdem Anfragen drosseln, Verzögerungen zwischen Fetches einbauen und Statuscodes beobachten, damit Sie zurückrudern können, wenn Challenges erscheinen. Diese Gewohnheiten sind auf jeder großen öffentlichen Website wichtig.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
