Jean David

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é: