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 | |
+-----------+--------------+------+-----+---------+-------+