Logo de kxs.frOutils pour l'informatique

Récupérer la base de données de l'IMDb

Introduction

L'IMDb est la plus grosse base de donnée mondiale sur les films, séries et animations. Il est possible de récupérer (légalement) un ensemble limité (mais conséquent) de sa base de données à cette adresse : https://datasets.imdbws.com/. La documentation est à cette adresse : https://www.imdb.com/interfaces/. La limite s'applique au nombre de personnes présentées par film limité à 10 et à toute les données « riches » comme les synopsis, les avis… Néanmoins, la base contient tous les films et séries exploités au cinéma ou à la télévision et la plupart des acteurs et actrices.

Il est interdit de publier la base de données de l'IMDb. Par contre je peux vous expliquer comment faire pour la récupérer.

Téléchargement des fichiers

L'IMDb met à disposition des fichiers .tsv (Tab Separated Values) zippés qu'il faut télécharger sur cette page. Une fois télécharger vous pouvez les dézipper avec votre outils préféré. Sous Linux la commande suivante fera l'affaire (à appliquer à chaque fichier) :

gzip -d fichier.gz

Pour comprendre la signification des données dans les fichiers .tsv, l'IMDb met à dispodition une page d'explications. Ces fichiers sont utilisables en l'état même si leur taille (plusieurs Go pour certains) risque de rendre leur ouvertur pénible.

L'idée étant tout de même d'avoir une base de données, nous allons voir comment convertir ces fichiers en une base de donnée MySQL.

Conversion en SQL

Les données fournie par l'IMDb sont un peu dégradées. Par exemple il peut y avoir des listes de valeurs dans un champ. Il n'est donc pas trivial de convertir les fichiers tsv en SQL. Je vous porpose donc ce script python qui crée une base de donnée complète à partir des fichiers fournis par l'IMDb. La base de donnée n'est pas parfaite mais la plupart des choses améliorables simplement ont été améliorées.

Utilisation du script

Le script a seulement besoin des 7 fichiers tsv de l'IMDb :

name.basics.tsv
title.akas.tsv
title.basics.tsv
title.crew.tsv
title.episode.tsv
title.principals.tsv
title.ratings.tsv

Ils doivent être dans le même dossier.

Il suffit alors de lancer la commande suivante :

python3 imdb_to_mysql.py

L'éxécution peut prendre plusieurs minutes mais le script affiche son avancement.

Le script produit les 12 fichiers SQL suivants :

name_basics.sql
name_knownForTitles.sql
name_professions.sql
work_akas.sql
work_basics.sql
work_director.sql
work_episode.sql
work_genres.sql
work_principals.sql
work_ratings.sql
work_types.sql
work_writer.sql

Chaque fichier correspond à une table.

Importation dans MySQL

Vous devez ensuite vous connecter à votre serveur MySQL et créer par exemple une base de donnée imdb :

mysql> CREATE DATABASE imdb;

Puis il faut utiliser cette base :

mysql> USE imdb;

Fichier par fichier

Vous pouvez maintenant importer les fichiers un à un grace à la commande SOURCE :

mysql> SOURCE fichier.sql;

L'importation peut durer plusieurs dizaines de minutes par fichier. Vous pouvez choisir d'importer seulement certains fichiers pour gagner du temps.

Tous les fichiers

Pour importer tous les fichiers d'un seul coup, il est possible de les fusionner en un seul sous Linux avec la commande :

cat *.sql > imdb.sql

Ensuite, il suffit d'importer ce fichier dans MySQL :

mysql> SOURCE imdb.sql;

Cette importation peut prendre plusieurs heures si vous n'avez pas un ordinateur très puissant !

Utilisation de la base de donnée

Si vous avez importé tous les fichiers SQL, voici le schéma relationnel de la base de données de l'IMDb :

(Vous pouvez l'ouvrir dans un nouvel onglet pour l'agrandir)

Pour détailler le schéma relationnel ci-dessus, voici les descriptions de chacune des tables avec une explication succincte.

name_basics

Elle contient les noms de toutes les personnes de la base (réalisateurs, scénaristes, acteurs…).

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id_person | int unsigned | NO   | PRI | NULL    |       |
| name      | varchar(200) | YES  |     | NULL    |       |
| birthYear | smallint     | YES  |     | NULL    |       |
| deathYear | smallint     | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

name_knownForTitles

Table de liaison entre une personne et les œeuvres pour lesquelles elle est connue (4 œuvres maximum).

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id_person | int unsigned | YES  | MUL | NULL    |       |
| id_work   | int unsigned | YES  | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

name_professions

Elle associe jusqu'à trois professions à une personne.

+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field      | Type                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | Null | Key | Default | Extra |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| id_person  | int unsigned                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | YES  | MUL | NULL    |       |
| profession | enum('editorial_department','executive','production_department','art_director','camera_department','production_manager','visual_effects','choreographer','electrical_department','assistant_director','transportation_department','assistant','soundtrack','actor','editor','miscellaneous','casting_department','sound_department','manager','legal','producer','make_up_department','art_department','costume_designer','casting_director','costume_department','location_management','stunts','production_designer','animation_department','actress','writer','talent_agent','director','publicist','set_decorator','music_department','composer','cinematographer','special_effects','script_department') | YES  | MUL | NULL    |       |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+

work_akas

Elle contient les noms d'une œuvre dans différents pays ou différentes langues.

+-----------------+-------------------+------+-----+---------+-------+
| Field           | Type              | Null | Key | Default | Extra |
+-----------------+-------------------+------+-----+---------+-------+
| id_work         | int unsigned      | YES  | MUL | NULL    |       |
| ordering        | smallint unsigned | YES  |     | NULL    |       |
| title           | varchar(1000)     | YES  |     | NULL    |       |
| region          | varchar(4)        | YES  |     | NULL    |       |
| language        | varchar(3)        | YES  |     | NULL    |       |
| attributes      | varchar(200)      | YES  |     | NULL    |       |
| isOriginalTitle | tinyint           | YES  |     | NULL    |       |
+-----------------+-------------------+------+-----+---------+-------+

work_basics

C'est la table la plus importante. Elle contient toute les œuvres avec certaines caractéristiques (titre, type, durée…).

+----------------+---------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                                                      | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| id_work        | int unsigned                                                                                                              | NO   | PRI | NULL    |       |
| worktype       | enum('tvEpisode','tvMiniSeries','short','tvMovie','tvSeries','tvShort','video','videoGame','movie','tvSpecial','tvPilot') | YES  | MUL | NULL    |       |
| primaryTitle   | varchar(1000)                                                                                                             | YES  |     | NULL    |       |
| originalTitle  | varchar(1000)                                                                                                             | YES  | MUL | NULL    |       |
| isAdult        | tinyint                                                                                                                   | YES  |     | NULL    |       |
| startYear      | smallint                                                                                                                  | YES  | MUL | NULL    |       |
| endYear        | smallint                                                                                                                  | YES  |     | NULL    |       |
| runtimeMinutes | mediumint unsigned                                                                                                        | YES  | MUL | NULL    |       |
+----------------+---------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+

work_director

Elle associe une œuvre à un ou plusieurs réalisateurs.

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id_work   | int unsigned | YES  | MUL | NULL    |       |
| id_person | int unsigned | YES  | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

work_episode

Pour les séries, fait le lien entre les épisodes (id_work) et la série (id_work_parent).

+----------------+--------------------+------+-----+---------+-------+
| Field          | Type               | Null | Key | Default | Extra |
+----------------+--------------------+------+-----+---------+-------+
| id_work        | int unsigned       | NO   | PRI | NULL    |       |
| id_work_parent | int unsigned       | YES  | MUL | NULL    |       |
| seasonNumber   | smallint unsigned  | YES  |     | NULL    |       |
| episodeNumber  | mediumint unsigned | YES  |     | NULL    |       |
+----------------+--------------------+------+-----+---------+-------+

work_genres

Associe un ou plusieurs genres à une œuvre.

+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field   | Type                                                                                                                                                                                                                                                                                      | Null | Key | Default | Extra |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| id_work | int unsigned                                                                                                                                                                                                                                                                              | YES  | MUL | NULL    |       |
| genre   | enum('Romance','Talk-Show','Drama','Fantasy','Action','Sci-Fi','Animation','Thriller','Comedy','Documentary','Reality-TV','Adventure','Mystery','Film-Noir','Game-Show','Horror','Music','Family','Adult','Sport','War','Biography','History','Crime','News','Western','Musical','Short') | YES  | MUL | NULL    |       |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+

work_principals

Fait la liaison entre une œuvre et son casting. Elle donne également les personnages joués par une personne. La table est limité à 10 personnes par œuvre.

+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field      | Type                                                                                                                                                        | Null | Key | Default | Extra |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+
| id_work    | int unsigned                                                                                                                                                | YES  | MUL | NULL    |       |
| ordering   | tinyint unsigned                                                                                                                                            | YES  |     | NULL    |       |
| id_person  | int unsigned                                                                                                                                                | YES  | MUL | NULL    |       |
| category   | enum('archive_sound','editor','director','producer','self','production_designer','actress','cinematographer','actor','writer','archive_footage','composer') | YES  |     | NULL    |       |
| job        | varchar(500)                                                                                                                                                | YES  |     | NULL    |       |
| characters | varchar(1400)                                                                                                                                               | YES  |     | NULL    |       |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+-------+

work_ratings

Associe la note et le nombre de votes à chaque œuvre.

+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| id_work       | int unsigned | NO   | PRI | NULL    |       |
| averageRating | decimal(3,1) | YES  |     | NULL    |       |
| numVotes      | int unsigned | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

work_types

Associe un type à un nom donné à une œuvre dans la table work_akas.

+----------+--------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field    | Type                                                                                 | Null | Key | Default | Extra |
+----------+--------------------------------------------------------------------------------------+------+-----+---------+-------+
| id_work  | int unsigned                                                                         | YES  | MUL | NULL    |       |
| ordering | smallint unsigned                                                                    | YES  |     | NULL    |       |
| type     | enum('alternative','dvd','festival','tv','video','working','original','imdbDisplay') | YES  |     | NULL    |       |
+----------+--------------------------------------------------------------------------------------+------+-----+---------+-------+

work_writer

Associe un ou plusieurs scénaristes à une œuvre.

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id_work   | int unsigned | YES  | MUL | NULL    |       |
| id_person | int unsigned | YES  | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+