IMDb est l'un des plus grands catalogues publics de films et de télévision sur le web ouvert, contenant des métadonnées factuelles sur des millions de titres : le nom d'un film, son année de sortie, sa note agrégée des utilisateurs, ses genres, sa durée et son réalisateur. Les chercheurs qui étudient les tendances de sortie, les passionnés qui construisent une base de données de films personnelle, et les développeurs qui prototypent une fonctionnalité de recommandation se tournent tous vers les mêmes pages de titres publiques, où ces métadonnées sont présentées dans une mise en page assez prévisible.
Ce guide vous montre comment scraper des données de films IMDb avec JavaScript et Node.js en utilisant Cheerio. Vous construirez un petit scraper fonctionnel qui récupère une page de titre IMDb publique via la Crawling API, parse le titre du film, l'année, la note IMDb, le genre, la durée et le réalisateur, et exporte le résultat en JSON et CSV. L'ensemble du tutoriel se limite aux métadonnées factuelles de films publiques, et la section légale proche de la fin n'est pas une clause de style : lisez-la avant de pointer ce scraper sur des volumes importants.
Ce que vous allez construire
Un script Node.js qui prend une URL de titre IMDb publique, récupère le HTML rendu via la Crawling API et extrait un enregistrement structuré pour ce film. Nous utilisons The Shawshank Redemption comme exemple fil rouge et extrayons ces champs factuels par titre :
- Title le titre principal du film affiché dans le héros de la page, par exemple "The Shawshank Redemption".
- Year l'année de sortie listée à côté du titre.
- Rating la note agrégée IMDb des utilisateurs sur 10.
- Genre les étiquettes de genre qu'IMDb assigne au titre, comme "Drama".
- Runtime la durée listée du film.
- Director le réalisateur crédité du film.
Pourquoi une requête ordinaire échoue sur IMDb
Si vous demandez une URL de titre IMDb avec un client HTTP nu, vous obtenez rarement les métadonnées attendues. Deux obstacles se dressent contre vous. Premièrement, IMDb affiche une grande partie de la page de titre dans le navigateur avec JavaScript, de sorte que le HTML initial n'est qu'une enveloppe jusqu'à ce que les scripts de la page s'exécutent et remplissent la note, les crédits et les lignes de détail. Deuxièmement, IMDb surveille le trafic automatisé : les IPs de datacenter et les patterns de requêtes qui ne ressemblent pas à un vrai navigateur sont limités ou mis au défi avant même d'atteindre la page rendue.
Un scraper IMDb fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend réellement la page, et une IP que la plateforme considère comme un visiteur réel. Vous pouvez assembler cela vous-même avec un navigateur headless et un pool de proxies résidentiels rotatifs, mais connecter ces éléments et les maintenir en bon état représente l'essentiel du travail. La Crawling API regroupe les deux en un seul appel : vous lui envoyez l'URL, elle rend la page derrière une IP de confiance et renvoie un HTML finalisé à parser avec Cheerio.
La Crawling API vous propose deux tokens : un normal et un JavaScript. IMDb renseigne la note et les crédits dans le navigateur, donc utilisez votre token JavaScript pour chaque requête de ce guide. Le token normal renvoie l'enveloppe non rendue et vos sélecteurs reviendront vides.
Prérequis
Quelques éléments doivent être en place avant d'écrire du code. Aucun ne prend longtemps.
JavaScript et Node.js de base. Vous devez être à l'aise pour écrire et exécuter un script Node et installer des packages avec npm. Si vous débutez avec Node, la documentation officielle et n'importe quel cours débutant vous amèneront au niveau que ce tutoriel suppose. Pour un tutoriel plus complet, notre guide sur construire un scraper web avec Node.js couvre les bases.
Node.js 16 ou version ultérieure. Confirmez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site Node.js ou via un gestionnaire de version comme nvm.
Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token JavaScript depuis la page de documentation de votre compte. Le niveau gratuit vous donne jusqu'à 5 000 requêtes sans carte bancaire, et vous ne payez que les requêtes réussies. Traitez le token comme un mot de passe : il authentifie vos requêtes, alors gardez-le hors du contrôle de version.
Configurer le projet
Créez un dossier de projet, initialisez-le et installez les deux bibliothèques dont le scraper a besoin.
node --version mkdir imdb-scraper && cd imdb-scraper npm init -y npm install crawlbase cheerio
Deux dépendances font le travail : crawlbase est le client Node officiel pour la Crawling API, et cheerio parse le HTML renvoyé avec une API de style jQuery pour vous permettre d'extraire des champs individuels par sélecteur CSS. Créez un fichier nommé scraper.js dans ce dossier et ajoutez le code des étapes ci-dessous.
Étape 1 : Récupérer la page de titre rendue
Commencez par obtenir la page finale. Importez la classe CrawlingAPI, initialisez-la avec votre token JavaScript et demandez une URL de titre IMDb publique. Pour cet exemple, nous utilisons The Shawshank Redemption à https://www.imdb.com/title/tt0111161/. Vérifier le code de statut avant de parser permet de rendre les échecs visibles plutôt que silencieux.
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));
Exécutez le script avec node scraper.js et vous devriez voir de véritables balises de titre IMDb en haut du corps, pas une enveloppe allégée. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur. La Crawling API utilise le token JavaScript que vous avez fourni pour rendre la page dans un vrai navigateur, de sorte que la note et les crédits sont présents dans le HTML que vous recevez.
Cette première requête vient de retourner une page de titre IMDb entièrement rendue sans navigateur headless ni proxy de votre côté. La Crawling API exécute la page dans un vrai navigateur, effectue une rotation des IPs résidentielles côté serveur et gère les défis qu'IMDb lance au trafic automatisé, vous donnant un HTML finalisé en un seul appel. Pointez-la sur un titre public dans le cadre du niveau gratuit d'abord, puis ajoutez votre parser.
Étape 2 : Parser les champs du film avec Cheerio
Une fois le HTML rendu en main, chargez-le dans Cheerio et lisez chaque champ par son sélecteur. IMDb balisise la plupart des métadonnées souhaitées avec des attributs data-testid stables, qui sont plus faciles à cibler que les noms de classes générés. Nous extrayons le titre et l'année depuis le héros de la page, la note depuis le bloc de note agrégée, le genre depuis la liste de puces, et la durée et le réalisateur depuis les lignes de détail du titre. Lire chaque champ de manière défensive évite qu'une valeur manquante ne fasse planter l'exécution.
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 }; }
Quelques détails assurent la fidélité à la page. Le titre provient de l'élément héros [data-testid="hero__pageTitle"] .hero__primary-text, et l'année est le premier lien de métadonnées directement après. La note agrégée IMDb se trouve dans [data-testid="hero-rating-bar__aggregate-rating__score"], les puces de genre dans la liste .ipc-chip-list--baseAlt .ipc-chip__text, et la durée dans la ligne de détail title-techspec_runtime. Le réalisateur est lu depuis la ligne de crédits contenant l'étiquette "Director", en prenant le premier nom lié. Joindre les éléments de ligne en une seule chaîne maintient la sortie simple et facile à stocker.
Les noms de classes d'IMDb (les préfixes ipc-* et les suffixes hachés) sont générés et changent sans préavis ; les attributs data-testid sont plus stables mais non garantis. Traitez les sélecteurs comme un modèle de départ, pas comme un contrat. Quand un champ revient vide, ré-inspectez la page en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. La maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que quelque chose est cassé.
Étape 3 : Assembler le script complet avec export JSON et CSV
Reliez maintenant la récupération et le parsing en un seul script fonctionnel, puis écrivez l'enregistrement sur le disque en JSON et CSV. Un script simple réduit les éléments mobiles ; vous pouvez l'envelopper dans un endpoint plus tard si vous en avez besoin.
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();
Collez la fonction parseMovieFromHTML de l'Étape 2 dans le même fichier pour que main puisse l'appeler. Exécutez-le avec node scraper.js et vous obtenez deux fichiers : movie.json avec l'enregistrement structuré complet et movie.csv prêt à ouvrir dans un tableur. L'utilitaire toCsv cite chaque champ et double les guillemets intégrés, ce qui importe car les titres et les listes de genres contiennent fréquemment des virgules.
À quoi ressemble le résultat
Le fichier JSON contient un objet avec le titre, l'année, la note IMDb, le genre, la durée et le réalisateur.
{ "title": "The Shawshank Redemption", "year": "1994", "rating": "9.3", "genre": "Drama", "runtime": "2h 22m", "director": "Frank Darabont" }
Le CSV reflète le même enregistrement avec une ligne d'en-tête, ce qui lui permet de s'intégrer directement dans Excel, Google Sheets, ou tout pipeline de données qui lit des fichiers délimités.
title,year,rating,genre,runtime,director "The Shawshank Redemption","1994","9.3","Drama","2h 22m","Frank Darabont"
Passer à plusieurs titres
Une page de titre, c'est une démo ; un vrai travail collecte des métadonnées sur une liste de films. Comme chaque page de titre IMDb partage la même structure de héros et de lignes de détail, le parser que vous avez déjà écrit fonctionne sur tous sans modification. Gardez une liste d'URLs de titres, récupérez chacune via la Crawling API, parsez-la avec la même fonction et collectez les enregistrements. Espacez les requêtes avec un court délai pour rester sous les limites de débit d'IMDb.
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; }
Pour un backlog plus important de titres sur lesquels vous ne souhaitez pas attendre de manière synchrone, le Crawler asynchrone vous permet de soumettre des URLs et de collecter les résultats sans maintenir une connexion ouverte par requête. Pour plus d'informations sur les pages rendues à forte intensité JavaScript comme celles-ci, consultez notre guide sur crawler des sites web JavaScript.
Rester débloqué
Même avec le rendu pris en charge, IMDb surveille le trafic qui ressemble à des scrapers. Quelques habitudes maintiennent une exécution saine, et elles s'appliquent à tout grand site public.
- Espacez vos requêtes. Introduisez un délai entre les récupérations plutôt que de surcharger le site dans une boucle serrée. Espacer les requêtes est le facteur le plus important pour rester sous les limites de débit d'IMDb.
- Misez sur la rotation. Un pool d'IPs résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels, de sorte qu'aucune ne déclenche une limite. La Crawling API s'en charge pour vous ; si vous gérez votre propre stack, c'est la partie à soigner.
- Lisez les codes de statut. Une exécution qui commence à retourner des défis ou des réponses non-200 vous indique que le débit ou le niveau d'IP actuel n'est plus suffisant. Traitez-le comme un signal pour ralentir, pas comme du bruit à ignorer.
Pour le guide de référence, consultez comment scraper des sites web sans être bloqué. Si vous souhaitez des métadonnées similaires depuis d'autres sources de divertissement, le même pattern récupération-puis-parsing s'applique directement au scraping de Rotten Tomatoes et des notes Goodreads.
Est-il légal de scraper IMDb ?
La légitimité du scraping d'IMDb dépend des conditions d'utilisation d'IMDb, de votre juridiction et de ce que vous faites des données. Les conditions d'IMDb restreignent l'accès automatisé et la réutilisation de son contenu, le scraping peut donc aller à l'encontre de ces conditions quelle que soit la prudence de vos outils. Aucun code ici ne change cela ; il permet simplement que la partie technique fonctionne. Lisez les conditions d'utilisation d'IMDb et son fichier robots.txt, respectez les attentes de débit qu'ils indiquent, et traitez les deux comme la frontière de ce que vous collectez. La collecte limitée de champs factuels publics à des fins de recherche personnelle est très différente d'une extraction à grande échelle ou à des fins commerciales, qu'IMDb n'autorise pas sans permission explicite.
Ce guide est délibérément limité aux métadonnées factuelles de films publiques : le titre, l'année de sortie, la note agrégée des utilisateurs, le genre, la durée et le réalisateur crédité que tout le monde peut voir sur une page de titre publique sans se connecter. Ce sont des données de catalogue factuelles, pas des données personnelles, et c'est le périmètre sûr à respecter. Ce qu'il ne couvre pas, c'est le matériel protégé par le droit d'auteur sur les mêmes pages. Les synopsis, les avis des utilisateurs, les textes éditoriaux, les affiches et les captures d'écran sont des contenus protégés. Ne redistribuez pas les avis, les synopsis ou les images en masse, et ne les republiez pas comme s'ils étaient les vôtres. Limitez votre usage au petit ensemble de champs factuels, et maintenez le volume modeste.
Si votre projet nécessite plus que quelques champs publics, la voie sanctionnée est la bonne, pas un scraper plus astucieux. IMDb publie des ensembles de données officiels pouvant être licenciés pour un usage non commercial et propose des licences de données commerciales via IMDb et sa société mère pour les besoins de production. Ce sont les outils appropriés lorsque vous avez besoin de grands volumes, d'une structure garantie ou du droit de réutiliser les données commercialement, et ils sont accompagnés de conditions d'utilisation et d'attribution claires. Lorsque vous n'êtes pas sûr qu'une utilisation est autorisée, obtenez un accord de données plutôt que de supposer que le silence est un consentement.
Points clés
- IMDb affiche les métadonnées côté client. Une requête ordinaire retourne une enveloppe légère, vous devez donc rendre la page derrière une IP de confiance, en utilisant le token JavaScript, avant de la parser.
- La Crawling API fait les deux en un seul appel. Elle rend la page dans un vrai navigateur et effectue une rotation des IPs résidentielles, retournant un HTML finalisé que vous parsez avec Cheerio.
-
Cheerio extrait les champs. Ciblez le titre du héros, le bloc de note agrégée, les puces de genre, et les lignes de détail de durée et de réalisateur, en préférant les attributs
data-testidet en anticipant la dérive des noms de classes générés. - Mettez à l'échelle et exportez. Réutilisez le même parser sur une liste d'URLs de titres, espacez vos requêtes et écrivez des enregistrements structurés en JSON et CSV.
- Restez sur les données factuelles publiques. Collectez uniquement le titre, l'année, la note, le genre, la durée et le réalisateur, ne redistribuez jamais les avis, les synopsis ou les images, respectez les conditions d'utilisation et le robots.txt, et préférez l'ensemble de données officiel d'IMDb ou un flux sous licence pour les volumes ou l'usage commercial.
Foire aux questions
Puis-je construire un scraper IMDb dans un langage autre que JavaScript ?
Oui. Ce guide utilise JavaScript avec Cheerio, mais la même approche fonctionne dans n'importe quel langage. La Crawling API dispose de bibliothèques et de SDK pour plusieurs langages, vous récupérez donc le HTML rendu de la même manière et le parsez avec le parser HTML que préfère votre stack, comme BeautifulSoup en Python. Les sélecteurs et les champs restent les mêmes ; seule la syntaxe de parsing change.
Pourquoi une requête ordinaire retourne-t-elle des données incomplètes depuis IMDb ?
Parce qu'IMDb renseigne une grande partie de la page de titre dans le navigateur avec JavaScript et surveille le trafic automatisé. Une requête HTTP brute depuis une IP de datacenter retourne généralement une enveloppe légère sans la note et les crédits, ou une page de défi. Pour obtenir une page complète, vous devez la rendre derrière une IP de confiance, ce que gère la Crawling API lorsque vous utilisez le token JavaScript.
Mes sélecteurs retournent des valeurs vides. Qu'est-ce qui a changé ?
Presque certainement le balisage d'IMDb. Ses noms de classes ipc-* générés changent sans préavis, de sorte que des sélecteurs qui fonctionnaient le mois dernier peuvent ne plus fonctionner. Préférez les attributs data-testid plus stables lorsqu'ils existent, ré-inspectez une page en direct dans les outils de développement de votre navigateur, mettez à jour les sélecteurs dans parseMovieFromHTML, et vous êtes de nouveau opérationnel. La maintenance périodique des sélecteurs est normale pour tout scraper en production.
IMDb dispose-t-il d'une API officielle ou d'un ensemble de données ?
IMDb ne propose pas d'API publique générale, mais il publie des ensembles de données officiels téléchargeables pour un usage personnel et non commercial, et il licence les données commercialement via IMDb et sa société mère. Pour les besoins de production, les grands volumes ou la réutilisation commerciale, l'ensemble de données ou le flux sous licence est la voie correcte et sanctionnée. Ce scraper de données publiques convient mieux à la recherche, au prototypage et à l'analyse à plus petite échelle où un accord officiel n'est pas justifié.
Puis-je aussi scraper les avis, les synopsis et les affiches ?
Cela sort du périmètre de ce guide. Les avis, les synopsis, les textes éditoriaux, les affiches et les captures d'écran sont des contenus protégés par le droit d'auteur, et les redistribuer en masse enfreint ce droit même si vous pouvez les voir sur une page publique. Limitez votre collecte aux champs factuels couverts ici, le titre, l'année, la note, le genre, la durée et le réalisateur, et utilisez l'ensemble de données officiel d'IMDb ou une licence si vous avez besoin du matériel protégé.
Serai-je bloqué en scrapant IMDb ?
Vous pouvez l'être si vous envoyez trop de requêtes trop rapidement depuis une seule adresse. La Crawling API réduit ce risque en effectuant une rotation des IPs résidentielles pour vous, mais vous devez tout de même espacer vos requêtes, ajouter des délais entre les récupérations, et surveiller les codes de statut pour pouvoir ralentir lorsque des défis apparaissent. Ces habitudes sont importantes sur tout grand site public.
Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.
Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.
