7 Web Scraping

library(rvest)
library(tidyverse)
library(kableExtra)
library(formattable)

Dans cette partie nous allons extraire les données du site web Allociné. Pour cela, nous nous intéressons plus particulièrement aux films les mieux notés par les membres Allociné.
Nous allons ainsi récupéré pour chaque film:
- le titre
- la durée
- le genre
- le réalisateur
- les acteurs
- la note moyenne atribuée par la presse
- la note moyenne attribuée par les spectateurs
- le synopsis

7.1 Chargement de la première page

pageweb <- read_html('http://www.allocine.fr/film/meilleurs/')

7.2 Nom du film

nom <- pageweb %>% 
  html_nodes('.meta-title-link') %>% 
  html_text()

nom %>%
  kable("html", escape = FALSE,
        caption = "Nom du film") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.1: Nom du film
x
Forrest Gump
La Ligne verte
Coco
Your Name
La Liste de Schindler
12 hommes en colère
Le Parrain
Django Unchained
The Dark Knight, Le Chevalier Noir
Gran Torino

7.3 Duree

duree <- pageweb %>% 
  html_nodes('.meta-body-info') %>% 
  html_text() 

duree
##  [1] "\n                \n                \n                                                    2h 20min\n                                \n                                    /\n                \n                                                                                                                                                Comédie dramatique,\n                                                                                                                                                Romance\n                                            "
##  [2] "\n                \n                \n                                                    3h 09min\n                                \n                                    /\n                \n                                                                                                                                                Policier,\n                                                                                                                                                Fantastique\n                                            "      
##  [3] "\n                \n                \n                                                    1h 45min\n                                \n                                    /\n                \n                                                                                                                                                Animation,\n                                                                                                                                                Fantastique\n                                            "     
##  [4] "\n                \n                \n                                                    1h 50min\n                                \n                                    /\n                \n                                                                                                                                                Animation,\n                                                                                                                                                Fantastique\n                                            "     
##  [5] "\n                \n                \n                                                    3h 15min\n                                \n                                    /\n                \n                                                                                                                                                Historique,\n                                                                                                                                                Guerre\n                                            "         
##  [6] "\n                \n                \n                                                    1h 35min\n                                \n                                    /\n                \n                                                                                                                                                Drame\n                                            "                                                                                                                                                                       
##  [7] "\n                \n                \n                                                    2h 55min\n                                \n                                    /\n                \n                                                                                                                                                Policier,\n                                                                                                                                                Drame\n                                            "            
##  [8] "\n                \n                \n                                                    2h 44min\n                                \n                                    /\n                \n                                                                                                                                                Western\n                                            "                                                                                                                                                                     
##  [9] "\n                \n                \n                                                    2h 27min\n                                \n                                    /\n                \n                                                                                                                                                Action,\n                                                                                                                                                Thriller\n                                            "           
## [10] "\n                \n                \n                                                    1h 51min\n                                \n                                    /\n                \n                                                                                                                                                Drame,\n                                                                                                                                                Thriller\n                                            "
duree <- gsub("\n","", duree) %>% 
  str_trim() %>% 
  str_sub(1,5)

duree %>%
  kable("html", escape = FALSE,
        caption = "Durée") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.2: Durée
x
2h 20
3h 09
1h 45
1h 50
3h 15
1h 35
2h 55
2h 44
2h 27
1h 51

Nous transformons la variable durée en numeric qui sera ensuite convertie en minute.

duree <- as.numeric(str_sub(duree,1,1)) * 60 + 
  as.numeric(str_sub(duree, 4,5))

duree %>%
  kable("html", escape = FALSE,
        caption = "Durée") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.3: Durée
x
140
189
105
110
195
95
175
164
147
111

7.4 Genre

La class .xXx est une class utilisée pour faire référence aux genres des films mais aussi à d’autres éléments qui n’entrent pas dans cet étude. Pour minimiser le nombre d’éléments, on précise que les genres des films ont comme parent la class .meta-body-info

genr <- pageweb %>% 
  html_nodes('.meta-body-info, .xXx') %>% 
  html_text()

genr
##  [1] "\n                \n                \n                                                    2h 20min\n                                \n                                    /\n                \n                                                                                                                                                Comédie dramatique,\n                                                                                                                                                Romance\n                                            "
##  [2] "\n                \n                \n                                                    3h 09min\n                                \n                                    /\n                \n                                                                                                                                                Policier,\n                                                                                                                                                Fantastique\n                                            "      
##  [3] "\n                \n                \n                                                    1h 45min\n                                \n                                    /\n                \n                                                                                                                                                Animation,\n                                                                                                                                                Fantastique\n                                            "     
##  [4] "\n                \n                \n                                                    1h 50min\n                                \n                                    /\n                \n                                                                                                                                                Animation,\n                                                                                                                                                Fantastique\n                                            "     
##  [5] "\n                \n                \n                                                    3h 15min\n                                \n                                    /\n                \n                                                                                                                                                Historique,\n                                                                                                                                                Guerre\n                                            "         
##  [6] "\n                \n                \n                                                    1h 35min\n                                \n                                    /\n                \n                                                                                                                                                Drame\n                                            "                                                                                                                                                                       
##  [7] "\n                \n                \n                                                    2h 55min\n                                \n                                    /\n                \n                                                                                                                                                Policier,\n                                                                                                                                                Drame\n                                            "            
##  [8] "\n                \n                \n                                                    2h 44min\n                                \n                                    /\n                \n                                                                                                                                                Western\n                                            "                                                                                                                                                                     
##  [9] "\n                \n                \n                                                    2h 27min\n                                \n                                    /\n                \n                                                                                                                                                Action,\n                                                                                                                                                Thriller\n                                            "           
## [10] "\n                \n                \n                                                    1h 51min\n                                \n                                    /\n                \n                                                                                                                                                Drame,\n                                                                                                                                                Thriller\n                                            "
genrs <- gsub("\n","", genr) %>% 
  str_trim() %>% 
  str_split("/", simplify = TRUE)

genrs %>%
  kable("html", escape = FALSE,
        caption = "Genre") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.4: Genre
2h 20min Comédie dramatique, Romance
3h 09min Policier, Fantastique
1h 45min Animation, Fantastique
1h 50min Animation, Fantastique
3h 15min Historique, Guerre
1h 35min Drame
2h 55min Policier, Drame
2h 44min Western
2h 27min Action, Thriller
1h 51min Drame, Thriller
genres <- genrs[,2] %>% 
  str_trim()

dfgenres <-  as.data.frame(x=genres) %>% 
  separate(genres,c("genre","genre1"))
  

genre <- dfgenres[,1] %>% 
  as.factor()

genre %>%
  kable("html", escape = FALSE, 
        caption = "Genre") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.5: Genre
x
Comédie
Policier
Animation
Animation
Historique
Drame
Policier
Western
Action
Drame

7.5 Realisateur

realisator <- pageweb %>% 
  html_nodes('.blue-link') %>% 
  html_text() %>% 
  as.factor()

realisator %>%
  kable("html", escape = FALSE,
        caption = "Réalisator") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.6: Réalisator
x
Robert Zemeckis
Tom Hanks
Gary Sinise
Robin Wright
Frank Darabont
Tom Hanks
Michael Clarke Duncan
David Morse
Adrian Molina
Lee Unkrich
Andrea Santamaria
Benjamin Bratt
Ary Abittan
Makoto Shinkai
Ryûnosuke Kamiki
Mone Kamishiraishi
Masami Nagasawa
Steven Spielberg
Liam Neeson
Ben Kingsley
Ralph Fiennes
Sidney Lumet
Henry Fonda
Martin Balsam
John Fiedler
Francis Ford Coppola
Marlon Brando
Al Pacino
James Caan
Quentin Tarantino
Jamie Foxx
Christoph Waltz
Leonardo DiCaprio
Christopher Nolan
Christian Bale
Heath Ledger
Aaron Eckhart
Clint Eastwood
Clint Eastwood
Bee Vang
Ahney Her

Allociné utilise la même class .blue-link pour identifier les réalisateurs et les 3 acteurs principaux (ou du moins les plus célèbres dans le film).
Pour ne choisir que les réalisateurs, on va prendre les lignes de raison + 4.

# On enlève cette ligne du fait qu'il y'ait déjà un autre réalisateur sur ce film
realisator <- realisator[-which(realisator=="Lee Unkrich")]


realisateur <- realisator[seq(1, length(realisator), by = 4)]
realisateur%>%
  kable("html", escape = FALSE, 
        caption = "Réalisateur") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.7: Réalisateur
x
Robert Zemeckis
Frank Darabont
Adrian Molina
Makoto Shinkai
Steven Spielberg
Sidney Lumet
Francis Ford Coppola
Quentin Tarantino
Christopher Nolan
Clint Eastwood

7.6 Acteurs

Le procédé est le même pour les acteurs. On va créer 3 variables acteurs à partir du vecteur crée précédemment.

acteur1 <- realisator[seq(2, length(realisator), by = 4)]
acteur2 <- realisator[seq(3, length(realisator), by = 4)]
acteur3 <- realisator[seq(4, length(realisator), by = 4)]

Acteurs <- bind_cols(Acteur1=acteur1, Acteur2=acteur2, Acteur3=acteur3) 

Acteurs %>%
  kable("html", escape = FALSE,
        caption = "Acteurs") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.8: Acteurs
Acteur1 Acteur2 Acteur3
Tom Hanks Gary Sinise Robin Wright
Tom Hanks Michael Clarke Duncan David Morse
Andrea Santamaria Benjamin Bratt Ary Abittan
Ryûnosuke Kamiki Mone Kamishiraishi Masami Nagasawa
Liam Neeson Ben Kingsley Ralph Fiennes
Henry Fonda Martin Balsam John Fiedler
Marlon Brando Al Pacino James Caan
Jamie Foxx Christoph Waltz Leonardo DiCaprio
Christian Bale Heath Ledger Aaron Eckhart
Clint Eastwood Bee Vang Ahney Her

7.7 Synopsis

synopsis <- pageweb %>% 
  html_nodes('.content-txt') %>% 
  html_text()

head(synopsis)
## [1] "\n                          Quelques décennies d'histoire américaine, des années 1940 à la fin du XXème siècle, à travers le regard et l'étrange odyssée d'un homme simple et pur, Forrest Gump.\n        \n            "                                                                                                                                                                          
## [2] "\n                          Paul Edgecomb, Gardien-chef du pénitencier de Cold Mountain en 1935, était chargé de veiller au bon déroulement des exécutions capitales. Parmi les prisonniers se trouvait un colosse du nom de John Coffey...\n        \n            "                                                                                                                               
## [3] "\n                          Depuis déjà plusieurs générations, la musique est bannie dans la famille de Miguel. Un vrai déchirement pour le jeune garçon dont le rêve ultime est de devenir un musicien aussi accompli que son idole, Ernesto de la Cruz. \n        \n            "                                                                                                                
## [4] "\n                          Mitsuha, adolescente coincée dans une famille traditionnelle, rêve de quitter ses montagnes natales pour découvrir la vie trépidante de Tokyo. Elle est loin d’imaginer pouvoir vivre l’aventure urbaine dans la peau de… Taki, un jeune lycéen vivant à Tokyo, occupé entre son petit boulot dans un restaurant italien et ses nombreux amis.\n        \n            "
## [5] "\n                          Evocation des années de guerre d'Oskar Schindler, industriel autrichien rentré à Cracovie en 1939 avec les troupes allemandes. Il va, tout au long de la guerre, protéger des juifs en les faisant travailler dans sa fabrique.\n        \n            "                                                                                                               
## [6] "\n                          Lors d'un procès, un juré émet l'hypothèse que l'homme qu'il doit juger n'est peut-être pas coupable. Il va tenter de convaincre les onze autres jurés.\n        \n            "
synopsis <- gsub("\n","", synopsis) %>% 
  str_trim()

head(synopsis) %>%
  kable("html", escape = FALSE,
        caption = "Synopsis") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.9: Synopsis
x
Quelques décennies d’histoire américaine, des années 1940 à la fin du XXème siècle, à travers le regard et l’étrange odyssée d’un homme simple et pur, Forrest Gump.
Paul Edgecomb, Gardien-chef du pénitencier de Cold Mountain en 1935, était chargé de veiller au bon déroulement des exécutions capitales. Parmi les prisonniers se trouvait un colosse du nom de John Coffey…
Depuis déjà plusieurs générations, la musique est bannie dans la famille de Miguel. Un vrai déchirement pour le jeune garçon dont le rêve ultime est de devenir un musicien aussi accompli que son idole, Ernesto de la Cruz.
Mitsuha, adolescente coincée dans une famille traditionnelle, rêve de quitter ses montagnes natales pour découvrir la vie trépidante de Tokyo. Elle est loin d’imaginer pouvoir vivre l’aventure urbaine dans la peau de… Taki, un jeune lycéen vivant à Tokyo, occupé entre son petit boulot dans un restaurant italien et ses nombreux amis.
Evocation des années de guerre d’Oskar Schindler, industriel autrichien rentré à Cracovie en 1939 avec les troupes allemandes. Il va, tout au long de la guerre, protéger des juifs en les faisant travailler dans sa fabrique.
Lors d’un procès, un juré émet l’hypothèse que l’homme qu’il doit juger n’est peut-être pas coupable. Il va tenter de convaincre les onze autres jurés.

7.8 Note

notes <- pageweb %>% 
  html_nodes('.stareval-note') %>% 
  html_text()

notes
##  [1] "\n                2,8" "\n                4,6"
##  [3] "\n                2,9" "\n                4,6"
##  [5] "\n                4,1" "\n                4,6"
##  [7] "\n                4,0" "\n                4,6"
##  [9] "\n                4,8" "\n                4,5"
## [11] "\n                5,0" "\n                4,5"
## [13] "\n                4,6" "\n                4,5"
## [15] "\n                4,5" "\n                4,5"
## [17] "\n                4,1" "\n                4,5"
## [19] "\n                4,7" "\n                4,5"

On sépare les notes en deux catégories notes de la presse et notes des spectateurs.

Les lignes impaires sont les notes de la presse et les lignes paires celles des spectateurs

notes <- gsub("\n","", notes) %>% 
  str_trim() %>% 
  str_replace_all(",",".") %>% 
  as.numeric()

note_presse <- notes[seq(1, length(notes), by = 2)]

note_presse %>%
  kable("html", escape = FALSE,
        caption = "Notes presse") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.10: Notes presse
x
2.8
2.9
4.1
4.0
4.8
5.0
4.6
4.5
4.1
4.7
note_spectateurs <- notes[seq(2, length(notes), by = 2)]

note_spectateurs %>%
  kable("html", escape = FALSE,
        caption = "Notes spectateurs") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.11: Notes spectateurs
x
4.6
4.6
4.6
4.6
4.5
4.5
4.5
4.5
4.5
4.5

7.9 Création de notre data frame

meilleurs_films <- bind_cols(Nom = nom, Duree = duree, Genre = genre,
                    Realisateur = realisateur, 
                    Acteurs, Notes_presse = note_presse, 
                    Notes_spectateurs = note_spectateurs)

meilleurs_films %>%
  mutate(Notes_presse = color_bar("lightblue")(Notes_presse)) %>%
  mutate(Notes_spectateurs = color_bar("lightpink")(Notes_spectateurs)) %>%
  kable("html", escape = FALSE, 
        caption = "Entête des données") %>%
  kable_styling(font_size = 11,
                bootstrap_options = 
                  c("striped", "condensed", "bordered"))
Table 7.12: Entête des données
Nom Duree Genre Realisateur Acteur1 Acteur2 Acteur3 Notes_presse Notes_spectateurs
Forrest Gump 140 Comédie Robert Zemeckis Tom Hanks Gary Sinise Robin Wright 2.8 4.6
La Ligne verte 189 Policier Frank Darabont Tom Hanks Michael Clarke Duncan David Morse 2.9 4.6
Coco 105 Animation Adrian Molina Andrea Santamaria Benjamin Bratt Ary Abittan 4.1 4.6
Your Name 110 Animation Makoto Shinkai Ryûnosuke Kamiki Mone Kamishiraishi Masami Nagasawa 4.0 4.6
La Liste de Schindler 195 Historique Steven Spielberg Liam Neeson Ben Kingsley Ralph Fiennes 4.8 4.5
12 hommes en colère 95 Drame Sidney Lumet Henry Fonda Martin Balsam John Fiedler 5.0 4.5
Le Parrain 175 Policier Francis Ford Coppola Marlon Brando Al Pacino James Caan 4.6 4.5
Django Unchained 164 Western Quentin Tarantino Jamie Foxx Christoph Waltz Leonardo DiCaprio 4.5 4.5
The Dark Knight, Le Chevalier Noir 147 Action Christopher Nolan Christian Bale Heath Ledger Aaron Eckhart 4.1 4.5
Gran Torino 111 Drame Clint Eastwood Clint Eastwood Bee Vang Ahney Her 4.7 4.5

Dans cette phase initiale, on a extrait que la premère page du site. L’idéal serait d’en extraire plus (voir toutes les pages) et de faire une fonction qui permettrait d’automatiser au maximum cette tâche.