Scraper IMDb avec Python : un code qui fonctionne vraiment

Dernière mise à jour le April 28, 2026

Si vous avez récemment cherché « scrape IMDb with Python », vous avez sans doute remarqué une chose : la plupart des tutoriels que vous trouvez sont cassés. Pas juste un peu dépassés — plutôt du genre « renvoie zéro résultat et un mur d’erreurs NoneType ».

J’ai passé les dernières semaines à tester tous les grands tutoriels de scraping IMDb que j’ai pu trouver — GeeksforGeeks, Medium, freeCodeCamp, notebooks Kaggle, bref, tout ce qui existe. Sur étiquetés pour le scraping IMDb, l’immense majorité renvoient à des sélecteurs CSS (td.titleColumn, td.ratingColumn) qui n’existent plus depuis juin 2023, quand IMDb a refondu sa page Top 250. Résultat ? Des forums remplis de développeurs qui demandent « pourquoi mon code renvoie-t-il du vide ? » et des mainteneurs de bibliothèques populaires comme : « On ne peut pas faire grand-chose, à part corriger chaque parser. » Ce guide couvre deux méthodes Python qui fonctionnent réellement aujourd’hui, la gestion de la pagination et des erreurs courantes, les cas où Python n’est même pas le bon outil, et la manière de pérenniser votre scraper pour qu’il ne rejoigne pas le cimetière des scripts cassés.

Que signifie scrapper IMDb avec Python ?

Le web scraping consiste à extraire automatiquement des données de pages web — au lieu de copier-coller à la main, vous écrivez un script qui le fait pour vous. Quand on parle de « scrapper IMDb », il s’agit d’extraire des données structurées de films (titres, notes, genres, casting, durée, nombre de votes) depuis les pages IMDb à l’aide de Python.

La pile Python classique pour cela repose sur trois bibliothèques : requests (pour récupérer la page web), BeautifulSoup (pour analyser le HTML et trouver les données), et pandas (pour organiser et exporter les résultats). Certains tutoriels utilisent aussi Selenium ou Playwright pour les pages qui nécessitent un rendu JavaScript, mais comme vous allez le voir, il existe des approches plus rapides.

Un avertissement important : tout ce guide est vérifié par rapport à la structure actuelle des pages IMDb, telle qu’elle existe à la mi-2025. IMDb modifie ses pages environ tous les 6 à 12 mois, donc si vous lisez ceci en 2027, certains sélecteurs auront peut-être changé. (Je vais aussi expliquer comment gérer cela.)

Pourquoi scrapper IMDb avec Python ? Cas d’usage réels

Avant d’écrire une seule ligne de code, que feriez-vous réellement des données IMDb ? La réponse dépend de qui vous êtes.

Le jeu de données d’avis IMDb est l’un des benchmarks NLP les plus utilisés au monde — l’article fondateur de Maas et al. (2011) a accumulé , et l’ensemble de données est intégré à TensorFlow, Keras et PyTorch. Sur Hugging Face, le dataset stanfordnlp/imdb reçoit 213 321 téléchargements par mois et a servi à entraîner plus de 1 500 modèles. Donc si vous travaillez en machine learning, vous connaissez probablement déjà les données IMDb.

Mais les usages dépassent largement le cadre académique :

Cas d’usagePour quiChamps de données nécessaires
Moteur de recommandation de filmsData scientists, passionnésTitres, genres, notes, casting
Stratégie de contenu pour plateforme de streamingÉquipes produit/contenuNotes, votes, année de sortie, genres
Analyse de sentiment / entraînement NLPChercheurs ML, étudiantsAvis, notes
Analyse concurrentielle de contenuAnalystes du secteur du divertissementBox-office, dates de sortie, tendances de notes
Recherche sur le tourisme cinématographiqueOffices de tourisme, agences de voyageLieux de tournage, métriques de popularité
Recherche académiqueChercheurs universitairesToutes les métadonnées structurées de films

Le seul marché du tourisme cinématographique est estimé à . Netflix a dépensé plus de 17 milliards de dollars en contenu en 2024, avec portée par des recommandations personnalisées. En clair : les données IMDb alimentent de vraies décisions dans de nombreux secteurs.

Vos options pour obtenir les données IMDb (avant d’écrire une ligne de code)

C’est la section que la plupart des tutoriels ignorent complètement. Ils passent directement à pip install beautifulsoup4 sans se demander si le scraping Python est vraiment la bonne approche pour votre cas.

Voici le panorama complet :

ApprocheIdéal pourAvantagesInconvénients
Python + BeautifulSoupApprentissage, extraction personnaliséeContrôle total, flexibleSélecteurs fragiles, casse souvent
Extraction JSON-LD / __NEXT_DATA__Développeurs qui veulent de la stabilitéGère le contenu JS, plus robusteNécessite de comprendre la structure JSON
Jeux de données officiels IMDbAnalyse à grande échelle, usage académiqueLégal, complet, plus de 26 M de titres, mises à jour quotidiennesFormat TSV, pas d’avis/images
Bibliothèque Cinemagoer (IMDbPY)Recherches programmatiques par titreAPI Pythonique, champs riches88 tickets ouverts, dernière version en mai 2023
API TMDbMétadonnées de films + imagesClé API gratuite, JSON, bien documentéSource différente (pas les notes IMDb)
Thunderbit (sans code)Non-développeurs, export rapideScraping en 2 clics, l’IA suggère les champs, export vers Excel/SheetsBasé sur des crédits pour les gros volumes

Quelques remarques sur ces options. Cinemagoer n’a pas eu de sortie PyPI depuis mai 2023 et la plupart de ses parsers ont cassé après la refonte d’IMDb en juin 2025 — je ne le recommanderais pas pour un usage en production pour le moment. TMDb est excellent, mais utilise son propre système de notation, pas celui d’IMDb. Et l’API entreprise officielle d’IMDb coûte via AWS Data Exchange, ce qui n’est pas une option pour la plupart d’entre nous.

Pour les lecteurs qui ne veulent pas écrire de code du tout, lit la page IMDb, suggère automatiquement les champs à extraire (titre, note, année, genre) et exporte vers Excel, Google Sheets, Airtable ou Notion en deux clics. L’IA s’adapte lorsque IMDb modifie sa mise en page, donc aucun sélecteur à maintenir. J’y reviens plus loin.

Maintenant, pour ceux qui veulent écrire du Python — voici deux méthodes qui fonctionnent.

Méthode 1 : scrapper IMDb avec Python à l’aide de BeautifulSoup (approche traditionnelle)

C’est l’approche classique que vous trouverez dans la plupart des tutoriels. Elle fonctionne, mais je préfère être transparent : c’est la plus fragile des méthodes que je vais présenter. Les noms de classes CSS d’IMDb sont générés automatiquement et changent lors des refontes. Cela dit, c’est la meilleure façon d’apprendre les bases du web scraping.

Étape 1 : installer et importer vos bibliothèques Python

Vous avez besoin de quatre paquets :

1pip install requests beautifulsoup4 pandas lxml

Voici leur rôle :

  • requests — envoie des requêtes HTTP pour récupérer la page web
  • beautifulsoup4 — analyse le HTML afin de rechercher des éléments précis
  • pandas — organise les données extraites dans des tableaux et les exporte en CSV/Excel
  • lxml — un analyseur HTML rapide (BeautifulSoup peut l’utiliser en backend)

Votre bloc d’import :

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd

Étape 2 : envoyer une requête HTTP à IMDb

C’est ici que la plupart des débutants se heurtent à leur premier mur. IMDb bloque les requêtes qui n’incluent pas un en-tête User-Agent correct — vous obtiendrez une erreur 403 Forbidden. La chaîne user-agent par défaut de Python Requests (python-requests/2.31.0) est immédiatement repérée.

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
4    "Accept-Language": "en-US,en;q=0.9"
5}
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Échec de la récupération de la page : {response.status_code}")
9else:
10    print("Page récupérée avec succès")

L’en-tête Accept-Language compte aussi — sans lui, IMDb peut renvoyer un contenu dans une autre langue selon la géolocalisation de votre adresse IP.

Étape 3 : analyser le HTML avec BeautifulSoup

Une fois le HTML récupéré, créez un objet BeautifulSoup et commencez à chercher les bons éléments. Ouvrez la page IMDb Top 250 dans Chrome, faites un clic droit sur un titre de film, puis cliquez sur « Inspecter » pour voir la structure HTML sous-jacente.

1soup = BeautifulSoup(response.text, "lxml")

À la mi-2025, la page Top 250 utilise les sélecteurs suivants :

  • Conteneur du film : li.ipc-metadata-list-summary-item
  • Titre : h3.ipc-title__text
  • Année : span.cli-title-metadata-item (premier span)
  • Note : span.ipc-rating-star--rating

Attention : ces classes préfixées par ipc- sont générées par le système de composants d’IMDb. Elles sont restées stables depuis la refonte de juin 2023, mais rien ne garantit qu’elles ne changeront pas à nouveau.

Étape 4 : extraire les données des films (titre, année, note)

Ici, je diffère de la plupart des tutoriels : j’intègre une gestion d’erreurs try/except. Aucun des guides concurrents que j’ai examinés ne le fait, ce qui explique précisément pourquoi leur code casse silencieusement lorsqu’un sélecteur change.

1movies = []
2movie_items = soup.select("li.ipc-metadata-list-summary-item")
3for item in movie_items:
4    try:
5        title_tag = item.select_one("h3.ipc-title__text")
6        title = title_tag.text.strip() if title_tag else "N/A"
7        year_tag = item.select_one("span.cli-title-metadata-item")
8        year = year_tag.text.strip() if year_tag else "N/A"
9        rating_tag = item.select_one("span.ipc-rating-star--rating")
10        rating = rating_tag.text.strip() if rating_tag else "N/A"
11        movies.append({
12            "title": title,
13            "year": year,
14            "rating": rating
15        })
16    except Exception as e:
17        print(f"Erreur lors de l’analyse du film : {e}")
18        continue
19print(f"{len(movies)} films extraits")

Étape 5 : enregistrer en CSV ou Excel avec Pandas

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250.csv", index=False)
3df.to_excel("imdb_top_250.xlsx", index=False)
4print(df.head())

Exemple de sortie :

1                          title  year rating
20  1. The Shawshank Redemption  1994    9.3
31           2. The Godfather    1972    9.2
42     3. The Dark Knight        2008    9.0
53  4. The Godfather Part II     1974    9.0
64         5. 12 Angry Men       1957    9.0

Cela fonctionne. Mais l’ensemble repose sur des sélecteurs CSS qui peuvent casser à tout moment — ce qui nous amène à l’approche que je recommande vraiment.

Méthode 2 : l’astuce JSON-LD — contourner totalement l’analyse HTML

C’est la technique qu’aucun article concurrent ne couvre, et celle que j’utiliserais pour tout projet sérieux. IMDb intègre des données structurées au format (JavaScript Object Notation for Linked Data) dans des balises <script type="application/ld+json"> sur chaque page. Ces données suivent le standard Schema.org, sont utilisées par Google pour les résultats enrichis et changent bien moins souvent que les noms de classes CSS.

L’Apify IMDb Scraper, un outil de niveau production, utilise l’ordre de priorité d’extraction suivant : « JSON-LD > NEXT_DATA > DOM ». C’est aussi la hiérarchie que je recommande.

Pourquoi le JSON-LD est plus fiable que les sélecteurs CSS

ApprocheGère le contenu JS ?Résistant aux changements d’interface ?VitesseComplexité
BeautifulSoup + sélecteurs CSS❌ Non⚠️ Fragile (les noms de classes changent)RapideFaible
Extraction JSON-LD✅ Oui✅ Suit le standard Schema.orgRapideFaible à moyenne
Extraction JSON __NEXT_DATA__✅ Oui✅ Assez stableRapideFaible à moyenne
Selenium / Playwright✅ Oui⚠️ FragileLentMoyenne à élevée
Thunderbit (sans code, 2 clics)✅ Oui (l’IA lit la page)✅ L’IA s’adapte automatiquementRapideAucune

Les noms de classes comme ipc-metadata-list-summary-item sont générés automatiquement par le système de composants React d’IMDb et changent à chaque refonte. Le schéma JSON-LD représente le modèle de données réel, pas la couche d’affichage. C’est un peu la différence entre lire la table des matières d’un livre et essayer d’identifier ses chapitres à la taille de leur police.

css-selectors-vs-json-ld.webp

Étape par étape : extraire les données IMDb à partir du JSON-LD

Étape 1 : récupérer la page

Comme précédemment — utilisez requests avec un en-tête User-Agent correct.

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11soup = BeautifulSoup(response.text, "lxml")

Étape 2 : trouver la balise script JSON-LD

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("Aucun JSON-LD trouvé sur cette page")
4else:
5    data = json.loads(script_tag.string)
6    print(f"JSON-LD trouvé avec le type : {data.get('@type', 'inconnu')}")

Étape 3 : analyser les données structurées

Sur la page Top 250, le JSON-LD contient un tableau itemListElement avec les 250 films. Chaque entrée inclut la position, le nom, l’URL, aggregateRating, datePublished, le genre, la description, ainsi que des tableaux pour le réalisateur et les acteurs.

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5    movies.append({
6        "rank": item.get("position"),
7        "title": movie.get("name"),
8        "url": movie.get("url"),
9        "rating": rating_info.get("ratingValue"),
10        "vote_count": rating_info.get("ratingCount"),
11        "date_published": movie.get("datePublished"),
12        "genre": ", ".join(movie.get("genre", [])),
13        "description": movie.get("description"),
14    })

Étape 4 : exporter en CSV

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250_json_ld.csv", index=False)
3print(df.head())

Exemple de sortie :

1   rank                      title                                     url  rating  vote_count date_published              genre
20     1  The Shawshank Redemption  https://www.imdb.com/title/tt0111161/     9.3     2900000     1994-10-14     Drama
31     2            The Godfather   https://www.imdb.com/title/tt0068646/     9.2     2000000     1972-03-24     Crime, Drama
42     3          The Dark Knight   https://www.imdb.com/title/tt0468569/     9.0     2800000     2008-07-18     Action, Crime, Drama

Les 250 films y sont. Clair, structuré, sans gymnastique de sélecteurs CSS. Et comme ces données suivent le standard Schema.org (sur lequel Google s’appuie pour les résultats de recherche), elles ont bien moins de chances de changer que la mise en page visuelle.

Bonus : __NEXT_DATA__ pour les pages de films individuelles

Pour obtenir davantage de données depuis une page de titre individuelle (durée, casting complet, résumé, images d’affiche), IMDb intègre aussi un objet JSON __NEXT_DATA__. C’est la donnée que React utilise pour hydrater la page — elle ne peut pas être supprimée sans casser le site.

1# Sur une page de film individuelle comme /title/tt0111161/
2next_data_tag = soup.find("script", {"id": "__NEXT_DATA__"})
3if next_data_tag:
4    next_data = json.loads(next_data_tag.string)
5    above_fold = next_data["props"]["pageProps"]["aboveTheFoldData"]
6    title = above_fold["titleText"]["text"]
7    year = above_fold["releaseYear"]["year"]
8    rating = above_fold["ratingsSummary"]["aggregateRating"]
9    runtime_seconds = above_fold.get("runtime", {}).get("seconds", 0)
10    genres = [g["text"] for g in above_fold["genres"]["genres"]]
11    plot = above_fold["plot"]["plotText"]["plainText"]

Utilisez JSON-LD pour les pages de classement/liste, et __NEXT_DATA__ pour les pages de titre individuelles. C’est l’approche adaptée à la production.

Pourquoi votre scraper IMDb casse sans cesse (et comment y remédier)

C’est le point de douleur le plus souvent signalé dans tous les forums de scraping IMDb que j’ai consultés. Les utilisateurs écrivent : « Une partie du code a cassé à cause des changements d’interface » et « Ça ne marche plus en 2024 ! » — et la réponse est généralement le silence ou « essayez Selenium ».

La cause profonde est la migration continue d’IMDb vers une interface React/Next.js. Voici la chronologie des principaux changements cassants :

DateCe qui a changéCe qui a cassé
Nov. 2022Refonte des pages de nomAnciens scrapers de pages de nom
Juin 2023Refonte de la page Top 250Tous les sélecteurs td.titleColumn / td.ratingColumn
Avril 2023Refonte des sous-pages de titreScrapers de bio, récompenses, actualités
Oct. 2023Refonte de la recherche avancéeScrapers basés sur la recherche
Juin 2025Refonte des pages /referenceBibliothèque Cinemagoer (la plupart des parsers)

Cela représente environ un changement majeur cassant tous les 6 à 12 mois. Si votre scraper dépend des noms de classes CSS, vous courez sur un tapis roulant.

Erreurs courantes et comment les corriger

Résultats vides / erreurs NoneType

L’erreur la plus fréquente. Vous verrez : AttributeError: 'NoneType' object has no attribute 'text'. Cela signifie que BeautifulSoup n’a pas trouvé l’élément recherché — généralement parce que le nom de classe CSS a changé ou que le contenu est rendu par JavaScript.

Correction : passez à l’extraction JSON-LD (méthode 2 ci-dessus). Les données sont dans la réponse HTML initiale, sans JavaScript.

403 Forbidden

IMDb utilise pour détecter et bloquer les robots. Le déclencheur n°1 est un en-tête User-Agent manquant ou manifestement faux. C’est documenté dans projets open source et sur où un employé IMDb a reconnu le problème.

Correction : incluez toujours une chaîne User-Agent réaliste de navigateur et l’en-tête Accept-Language: en-US. Utilisez requests.Session() pour le pooling de connexions.

Seulement 25 résultats renvoyés

Les pages de recherche IMDb et les listes « Most Popular » utilisent le chargement différé — elles n’affichent qu’environ 25 résultats au départ et en chargent davantage via AJAX lorsque vous faites défiler la page.

Correction : utilisez la pagination par paramètre d’URL (couverte dans la section suivante) ou passez à la page Top 250, qui charge les 250 films en une seule réponse.

Les sélecteurs cessent soudainement de fonctionner

Sélecteurs anciens qui ne fonctionnent plus : td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Si votre code en utilise un, il est cassé.

Correction : privilégiez les attributs data-testid (comme h1[data-testid="hero-title-block__title"]) plutôt que les noms de classes générés automatiquement. Mieux encore, utilisez JSON-LD.

Un cadre de décision : correctifs à court terme vs à long terme

  • Correctif rapide : entourez chaque sélecteur de blocs try/except, vérifiez les codes d’état HTTP, journalisez les erreurs au lieu de faire planter le script
  • Correctif à moyen terme : passez des sélecteurs CSS à l’extraction JSON-LD (méthode 2)
  • Correctif à long terme : utilisez les pour l’analyse à grande échelle, ou un outil comme qui relit la structure de la page à chaque fois grâce à l’IA — aucun sélecteur à maintenir, l’IA s’adapte automatiquement aux changements de mise en page

Au-delà de la limite des 25 résultats : pagination IMDb et grands ensembles de données

Chaque tutoriel concurrent que j’ai examiné ne scrape qu’une seule page. Personne ne traite la pagination. Mais si vous avez besoin de plus d’une simple liste, vous atteindrez vite une limite.

Les pages qui n’ont pas besoin de pagination

Bonne nouvelle : la page Top 250 charge les 250 films dans une seule réponse rendue côté serveur. Le JSON-LD et __NEXT_DATA__ contiennent tous deux l’ensemble complet des données. Aucune pagination nécessaire.

Comment fonctionne la pagination de recherche IMDb

Les pages de recherche IMDb utilisent un paramètre d’URL start=, incrémenté par 50 :

1https://www.imdb.com/search/title/?groups=top_1000&start=1
2https://www.imdb.com/search/title/?groups=top_1000&start=51
3https://www.imdb.com/search/title/?groups=top_1000&start=101

Voici une boucle Python qui parcourt les résultats :

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # Parcourt le top 1000
4    url = f"https://www.imdb.com/search/title/?groups=top_1000&start={start}"
5    response = requests.get(url, headers=headers)
6    if response.status_code != 200:
7        print(f"Échec à start={start} : {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # Extraire les films avec la méthode de votre choix
11    # ...
12    print(f"Page scrapée à partir de {start}")
13    time.sleep(3)  # Soyez raisonnable — IMDb bloque après environ 50 requêtes rapides

Ce time.sleep(3) compte. Les retours de la communauté indiquent qu’IMDb commence à bloquer des IP après environ 50 requêtes rapides. Un délai aléatoire entre 2 et 5 secondes est une bonne pratique.

Quand éviter complètement le scraping : les jeux de données officiels IMDb

Pour les besoins réellement massifs, IMDb fournit 7 fichiers TSV gratuits sur , actualisés quotidiennement :

FichierContenuTaille
title.basics.tsv.gzTitres, types, genres, durée, année~800 Mo
title.ratings.tsv.gzNote moyenne, nombre de votes~25 Mo
title.crew.tsv.gzRéalisateurs, scénaristes~300 Mo
title.principals.tsv.gzPrincipaux acteurs/techniciens~2 Go
title.akas.tsv.gzTitres alternatifs par région~1,5 Go
title.episode.tsv.gzInfos sur les épisodes TV~200 Mo
name.basics.tsv.gzPersonnes : nom, année de naissance, titres connus~700 Mo

Les charger dans Pandas est simple :

1ratings = pd.read_csv("title.ratings.tsv.gz", sep="\t", compression="gzip")
2basics = pd.read_csv("title.basics.tsv.gz", sep="\t", compression="gzip", low_memory=False)
3# Fusion sur tconst (ID de titre IMDb)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

Ces jeux de données couvrent plus de 26 millions de titres. Pas de pagination, pas de sélecteurs, pas d’erreur 403. La licence est réservée à un usage personnel et non commercial — vous ne pouvez pas republier ni revendre les données.

L’astuce sans code : Thunderbit gère la pagination pour vous

Pour les lecteurs qui ont besoin de données IMDb paginées mais ne veulent pas écrire de logique de pagination, prend en charge nativement la pagination par clic et le défilement infini. Vous lui dites de scraper, il s’occupe du reste — y compris du défilement du contenu chargé à la volée.

Scraper IMDb avec Python : le code complet prêt à copier-coller

Voici deux scripts autonomes que vous pouvez exécuter immédiatement.

Script A : méthode BeautifulSoup (sélecteurs CSS)

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4url = "https://www.imdb.com/chart/top/"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
7    "Accept-Language": "en-US,en;q=0.9"
8}
9response = requests.get(url, headers=headers)
10if response.status_code != 200:
11    print(f"Erreur : {response.status_code}")
12    exit()
13soup = BeautifulSoup(response.text, "lxml")
14movie_items = soup.select("li.ipc-metadata-list-summary-item")
15movies = []
16for item in movie_items:
17    try:
18        title = item.select_one("h3.ipc-title__text")
19        year = item.select_one("span.cli-title-metadata-item")
20        rating = item.select_one("span.ipc-rating-star--rating")
21        movies.append({
22            "title": title.text.strip() if title else "N/A",
23            "year": year.text.strip() if year else "N/A",
24            "rating": rating.text.strip() if rating else "N/A",
25        })
26    except Exception as e:
27        print(f"Film ignoré à cause d’une erreur : {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"{len(df)} films enregistrés")
31print(df.head())

Script B : méthode JSON-LD (recommandée)

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11if response.status_code != 200:
12    print(f"Erreur : {response.status_code}")
13    exit()
14soup = BeautifulSoup(response.text, "lxml")
15script_tag = soup.find("script", {"type": "application/ld+json"})
16if not script_tag:
17    print("Aucune donnée JSON-LD trouvée")
18    exit()
19data = json.loads(script_tag.string)
20movies = []
21for item in data.get("itemListElement", []):
22    movie = item.get("item", {})
23    rating_info = movie.get("aggregateRating", {})
24    directors = movie.get("director", [])
25    director_names = ", ".join(
26        d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
27    )
28    movies.append({
29        "rank": item.get("position"),
30        "title": movie.get("name"),
31        "url": movie.get("url"),
32        "rating": rating_info.get("ratingValue"),
33        "votes": rating_info.get("ratingCount"),
34        "year": movie.get("datePublished", "")[:4],
35        "genre": ", ".join(movie.get("genre", [])),
36        "director": director_names,
37        "description": movie.get("description"),
38    })
39df = pd.DataFrame(movies)
40df.to_csv("imdb_top250_jsonld.csv", index=False)
41print(f"{len(df)} films enregistrés")
42print(df.head())

Les deux scripts incluent une gestion d’erreurs et produisent un CSV propre. Le script B vous donne des données plus riches — réalisateur, description, URL — et résiste mieux aux changements de mise en page.

Comment scraper IMDb sans écrire de code (avec Thunderbit)

Tout le monde n’a pas besoin ni envie d’écrire du Python. Peut-être êtes-vous analyste opérationnel et vous avez juste besoin du top des films de la semaine dans un tableur. Peut-être êtes-vous stratège de contenu et souhaitez comparer les tendances de genres au fil des années. Dans ces cas-là, écrire un scraper est excessif.

Voici comment obtenir les mêmes données avec :

Avant de commencer :

  • Difficulté : débutant
  • Temps requis : environ 2 minutes
  • Ce dont vous aurez besoin : le navigateur Chrome, (la version gratuite suffit)

Étape 1 : ouvrez la page IMDb à scraper. Ouvrez le Top 250 IMDb (ou toute autre page de liste/recherche IMDb) dans Chrome.

Étape 2 : cliquez sur « Suggestion de champs IA » dans la barre latérale Thunderbit. L’IA analyse la page et recommande des colonnes — généralement Titre, Année, Note, Genre, et quelques autres selon la page. Vous verrez un tableau d’aperçu avec les champs suggérés.

Étape 3 : ajustez les champs si nécessaire. Supprimez les colonnes inutiles ou ajoutez-en de personnalisées en cliquant sur « + Ajouter une colonne » puis en décrivant en langage naturel ce que vous voulez (par ex. « nom du réalisateur » ou « nombre de votes »).

Étape 4 : cliquez sur « Scraper ». Thunderbit extrait les données. Pour les pages à défilement infini ou à pagination, il gère automatiquement le défilement.

Étape 5 : exportez. Cliquez sur le bouton d’export et choisissez votre format — Excel, Google Sheets, CSV, Airtable ou Notion. Les données arrivent dans votre destination en quelques secondes.

L’avantage clé ici n’est pas seulement la commodité — c’est que l’IA de Thunderbit relit la structure de la page à chaque fois. Quand IMDb change sa mise en page (et cela arrivera), l’IA s’adapte. Aucun sélecteur à mettre à jour, aucun code à corriger. Pour quiconque a déjà subi un scraper cassé à 2 h du matin avant une échéance, cela vaut de l’or.

Thunderbit prend aussi en charge le scraping des sous-pages — vous pouvez ouvrir la fiche détaillée de chaque film et enrichir votre tableau avec le casting, le réalisateur, la durée et d’autres champs qui n’apparaissent pas sur la page de liste. Si vous voulez le voir en action, consultez la .

Est-il légal de scraper IMDb ? Ce qu’il faut savoir

Les utilisateurs posent explicitement la question dans les forums : « Est-ce légal ?… IMDb ne veut pas que les gens scrapent leur site. » C’est une question légitime, et aucun article concurrent n’y répond vraiment.

robots.txt d’IMDb : le Top 250 (/chart/top/), les pages de titres individuelles (/title/ttXXXXXXX/) et les pages de noms (/name/nmXXXXXXX/) ne sont PAS bloqués par robots.txt. Les chemins bloqués incluent /find, /_json/*, /search/name-text, /user/ur*/ratings et divers endpoints AJAX. Aucune directive Crawl-delay n’est spécifiée.

Conditions d’utilisation d’IMDb : la clause pertinente stipule : « Vous ne pouvez pas utiliser de data mining, de robots, de screen scraping ou d’outils similaires de collecte et d’extraction de données sur ce site, sauf autorisation écrite expresse de notre part. » Une autre clause interdit la revente ou l’usage commercial des données scrapées.

Ce que cela signifie en pratique : des décisions de justice récentes en 2024 (Meta v. Bright Data, X Corp v. Bright Data) ont estimé que les conditions d’utilisation ne s’imposent pas forcément aux utilisateurs qui n’y ont jamais consenti — si vous scrapez des données librement accessibles sans vous connecter, l’opposabilité des CGU est discutable. Mais ce domaine juridique évolue.

Alternatives sûres : les sont explicitement autorisés pour un usage personnel et non commercial. L’API TMDb est permissive avec une clé gratuite. Les deux sont de solides options si vous voulez rester clairement dans les clous.

Conseil pratique : si vous scrapez malgré tout, utilisez un rythme de crawl respectueux (time.sleep(3) entre les requêtes), définissez les bons en-têtes et n’appelez pas les chemins bloqués par robots.txt. Pour les projets commerciaux, consultez un professionnel du droit ou utilisez les jeux de données/API officiels.

Nous avons abordé en détail les sur le blog Thunderbit.

Conclusion : choisissez la bonne façon de scrapper IMDb avec Python

Version courte :

  • BeautifulSoup + sélecteurs CSS : bien pour apprendre les bases. Attendez-vous à ce que cela casse tous les 6 à 12 mois. Incluez toujours une gestion d’erreurs.
  • Extraction JSON-LD : l’approche que je recommande pour tout projet Python durable. Elle suit le standard Schema.org, change beaucoup moins souvent que les classes CSS et fournit des données structurées propres sans rendu JavaScript.
  • JSON __NEXT_DATA__ : utilisez-le en complément pour obtenir des données plus riches sur les pages de titres individuelles (durée, casting complet, intrigue, images d’affiche).
  • Jeux de données officiels IMDb : le meilleur choix pour l’analyse à grande échelle. Plus de 26 millions de titres, mise à jour quotidienne, aucun scraping nécessaire. Usage personnel / non commercial uniquement.
  • : le meilleur choix pour les non-codeurs ou pour ceux qui veulent des données rapidement sans maintenir de code. L’IA s’adapte aux changements de mise en page, gère la pagination et exporte vers Excel/Sheets/Airtable/Notion.

Ajoutez ce guide à vos favoris — je le mettrai à jour lorsque la structure d’IMDb changera à nouveau. Et si vous voulez éviter complètement le code, et voyez à quelle vitesse vous pouvez passer d’une page IMDb à un tableur propre. Si vous travaillez aussi avec d’autres sites, notre guide sur couvre le flux de travail plus large.

Essayez l’Extracteur Web IA pour IMDb et plus encore

FAQ

Est-il légal de scraper IMDb ?

Les Conditions d’utilisation d’IMDb interdisent le scraping sans consentement, mais l’opposabilité des CGU sur des données accessibles publiquement reste juridiquement débattue après les décisions de justice de 2024. Les options les plus sûres sont les (usage personnel / non commercial) ou l’API TMDb (clé gratuite). Si vous scrapez quand même, respectez robots.txt, espacez raisonnablement les requêtes et évitez les chemins bloqués. Pour un usage commercial, consultez un professionnel du droit.

Pourquoi mon scraper IMDb renvoie-t-il des résultats vides ?

Dans presque tous les cas, la cause est la présence de sélecteurs CSS obsolètes — des classes comme td.titleColumn et td.ratingColumn n’existent plus depuis juin 2023. La solution consiste à passer à l’extraction JSON-LD (analyser la balise <script type="application/ld+json">) ou à mettre à jour vos sélecteurs vers les classes actuelles préfixées ipc-. Vérifiez aussi que vous envoyez un en-tête User-Agent correct, car son absence déclenche une erreur 403 qui peut ressembler à des résultats vides.

Comment scraper plus de 25 résultats sur IMDb ?

La page Top 250 charge les 250 films en une seule réponse — aucune pagination n’est nécessaire. Pour les résultats de recherche, utilisez le paramètre d’URL start= (par incréments de 50) pour parcourir les pages. Par exemple : start=1, start=51, start=101. Ajoutez time.sleep(3) entre les requêtes pour éviter d’être bloqué. Sinon, les jeux de données officiels IMDb sur contiennent plus de 26 millions de titres, sans aucune pagination.

Qu’est-ce que __NEXT_DATA__ et pourquoi l’utiliser pour scraper IMDb ?

__NEXT_DATA__ est un objet JSON intégré dans une balise <script id="__NEXT_DATA__"> sur les pages React/Next.js d’IMDb. Il contient toutes les données structurées que React utilise pour rendre la page — titres, notes, casting, genres, durée, et plus encore. Parce qu’il représente le modèle de données sous-jacent plutôt que la mise en page visuelle, il est plus résistant aux refontes d’interface que les sélecteurs CSS. Utilisez-le avec JSON-LD pour obtenir l’approche d’extraction la plus robuste.

Puis-je scraper IMDb sans coder ?

Oui. Deux options principales : (1) téléchargez les — 7 fichiers TSV couvrant plus de 26 millions de titres, mis à jour quotidiennement et gratuits pour un usage non commercial. (2) Utilisez , qui lit la page IMDb, suggère automatiquement les champs à extraire et exporte vers Excel, Google Sheets ou CSV en deux clics — sans code, sans sélecteurs à maintenir.

En savoir plus

Table des matières

Essayez Thunderbit

Extrayez des leads et autres données en seulement 2 clics. Propulsé par l’IA.

Obtenir Thunderbit C’est gratuit
Extraire des données avec l’IA
Transférez facilement les données vers Google Sheets, Airtable ou Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week