Visualiser les lieux de tournage des films Français
À l'occasion d'un projet de plusieurs semaines à la Wild Code School, j'ai été amené à travailler sur les datasets libes de l'Internet Movie Database. Ceux-ci sont nombreux et contiennent des quantités massives d'informations sur plus de 8 millions de films et séries. Cependant, ils ne sont pas complets. Comme je suis fasciné par la géomatique et les données géographiques, j'ai instantanément cherché si les lieux de tournages des différents films étaient présents dans les datasets. À ma déception, ce n'était pas le cas, bien qu'ils soient présents sur les pages des films sur l'IMDB. Qu’à cela ne tienne, c’était l’occasion rêvée pour moi de mettre à profit mes compétences en web scraping.
D'abord, j'ai dû prendre une décision sur les jeux de données à utiliser. Pas question de scraper les lieux de tournages de tous les films du monde, j'ai décidé d'utiliser uniquement les films Français. Ceux ci sont définis par une variable primary_language sur l'IMDB, mais à nouveau, ils ne sont pas présents en tant que tels sur les datasets fournis.
Acquérir les données d'IMDB
Comme il est cependant possible d'accéder à ces données avec une requète sur l'url: https://www.imdb.com/search/title/?title_type=feature&primary_language=fr. Une fois cette url atteinte, on peut scraper les IDs des films avec un peu de python et beautifulsoup.
for i in range(1,17000,50):
url = 'https://www.imdb.com/search/title/?title_type=feature&primary_language=fr&view=simple&start='+str(i)+'&ref_=adv_prv'
req = requests.get(url)
soup = BeautifulSoup(req.text,"html.parser")
filmsFrancais = soup.find_all('div', attrs={'class':'lister-item mode-simple'})
for a in range(len(filmsFrancais)):
try:
liste.append(filmsFrancais[a].find('input', {'name': 'tconst'}).get('value'))
except:
pass
Ce qui nous permet (quelques minutes plus tard) d'obtenir une liste des IDs de tous les films dont la langue principale est le Français.
Une fois cette liste obtenue, il est à nouveau question de scraping, cette fois ci sur les lieux de tournage. Il est possible d'accéder à une url qui les liste, avec le lien 'https://www.imdb.com/title/X/locations?ref_=tt_dt_loc', où X est l'identifiant primaire du film dans les bases de données de l'IMDB:
for x in tconstFr:
url = 'https://www.imdb.com/title/'+x+'/locations?ref_=tt_dt_loc'
req = requests.get(url)
soup = BeautifulSoup(req.text,"html.parser")
lieuxDeTournage = soup.find_all('dt')
for a in range(len(lieuxDeTournage)):
liste.extend([x, lieuxDeTournage[a].find('a').contents[0]])
print(x, lieuxDeTournage[a].find('a').contents[0])
Quelques heures plus tard, et après un nettoyage avec pandas plus tard, et j'ai enfin obtenu un beau data frame des lieux de tournages de mes films:
| IDMovie | lieuxDeTournage |
|---|---|
| tt2420886 | Musée des Arts Forains, 53 avenue des terroirs de France, Paris 12, Paris, France |
| tt2420886 | Saint-Germain-des-Prés, Paris 6, Paris, France |
| tt2420886 | Brasserie La Café Gourmand, 192 avenue de France, Paris 13, Paris, France |
| tt2420886 | Eiffel Tower, Paris, France |
| tt2420886 | Arc de Triomphe, Paris 8, Paris, France |
| tt2420886 | Bistrot-restaurant le Saint-Médard, 53 rue Censier, Paris 5, Paris, France |
| tt2420886 | Orly Airport, Orly, Val-de-Marne, France |
| tt2420886 | Aéroport Mohammed V, Nouasseur, Casablanca, Morocco |
| tt2420886 | Avenue Bosquet, Paris 7, Paris, France |
Géocoder les données
Une fois les données acquises, je vais essayer de les géocoder afin de les visualiser sur une carte. C'est à dire extraire leur latitude et longitude. Les outils et les méthodes pour accéder à ces données sont très nombreux, mais comme j'aime python, je vais l'utiliser.
Personellement, j'aime la bibliothèque geopy, qui, avec nominatim, permet d'accéder aux mêmes coordonnées dont se sert OpenStreetMap.
Le programme suivant me permet d'itérer dans mon tableau précédent et d'en extraire les latitudes et les longitudes :
for i in range(len(df)):
try:
location = geolocator.geocode(df['filmingLocation'][i])
liste.append([df['movieID'][i],location.latitude, location.longitude])
print(i, location.latitude, location.longitude)
except:
pass
Après plusieurs heures, on obtient à nouveau un beau dataframe des coordonnées géographiques:
| id | latitude | Longitude |
|---|---|---|
| 1 | 49.1487735 | 1.9853209 |
| 2 | 48.5926703 | -0.6459187 |
| 3 | 48.85247925 | 2.278670697861209 |
| 4 | 48.8549055 | 2.2884924 |
| 5 | 48.862381049999996 | 2.2042805462608994 |
Visualiser les données de manière interactive
Pour visualiser les données de manière interactive, j'ai utilisé leaflet.js, une librairie javascript open-source qui permet de faire des cartes interactives. J'aime beaucoup cette librairie pour sa facilité d'utilisation et la possibilité d'utiliser les fonds de carte Stamen Tiles, que j'apprécie particulièrement.
Quelques fonctions javascript, et le tour était joué:
