Après avoir vérifié toutes les conditions préalables, vous pouvez enfin commencer à écrire le code.
install.packages('rvest')
Placez le curseur à la fin de la ligne et appuyez sur le bouton « Run » au-dessus de l'éditeur de code. Vous verrez s'afficher dans votre console la progression de l'installation du paquet.
L'installation ne se fait qu'une seule fois, vous pouvez donc désormais commenter ou supprimer la ligne précédente :
#install.packages('rvest')
Vous devez maintenant charger (ou importer) la bibliothèque :
library(rvest)
Je vais utiliser la fonction read_html pour envoyer une requête GET au site web cible, ce qui permettra de télécharger le document HTML nécessaire. De cette façon, je vais télécharger le document HTML nécessaire :
book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")
Le résultat est désormais stocké dans la variable book_html, que vous pouvez également consulter en tapant simplement dans la console :
Si vous avez besoin à tout moment de consulter la documentation officielle d'une fonction que vous souhaitez utiliser, tapez dans la console :
help(function_name)
RStudio ouvrira un serveur HTTP avec un lien direct vers la documentation. Pour read_html, le résultat sera :
Pour obtenir la liste des avis, j'utiliserai la fonction html_elements. Elle recevra en entrée le sélecteur CSS que j'ai trouvé précédemment :
reviews <- book_html %>% html_elements('div.review')
Le résultat sera une liste de nœuds XML, que je vais parcourir pour obtenir la date et la note de chaque élément individuel :
Les programmeurs R utilisent l'opérateur pipe « %>% » pour rendre le codage plus polyvalent. Son rôle est de passer la valeur de l'opérande de gauche comme argument à l'opérande de droite.
Vous pouvez enchaîner les opérandes (comme vous le verrez plus loin dans ce guide), ce qui peut vous aider à réduire considérablement le nombre de variables locales. La ligne de code précédente écrite sans l'opérateur pipe ressemblerait à ceci :
reviews <- html_elements(book_html, 'div.review')
Pour collecter les données, je vais initialiser deux vecteurs en dehors de la boucle. En jetant un coup d’œil rapide au site web, je peux garantir que les deux vecteurs auront la même longueur.
dates <- vector()
ratings <- vector()
À présent, tout en parcourant la liste des avis, je recherche deux valeurs : la date et la note. Comme vous l'avez vu précédemment, la date est un élément anchor qui possède la classe reviewDate.
La note est un élément span de la classe staticStars, et elle contient cinq éléments span pour chaque étoile. Si l'utilisateur a attribué une étoile, l'élément span portera le nom de classe p10, tandis que les autres porteront le nom de classe p0.
Le code ressemblera à ceci :
for (review in reviews) {
review_date = review %>% html_element('a.reviewDate') %>% html_text()
dates <- c(dates, review_date)
review_rating_element = review %>% html_element('span.staticStars')
valid_stars = review_rating_element %>% html_elements('span.p10')
review_rating = length(valid_stars)
ratings <- c(ratings, review_rating)
}
Notez la fonction html_element ; ce n'est pas une faute de frappe. Vous pouvez utiliser html_elements lorsque vous souhaitez extraire une liste de nœuds XML et html_element pour un seul nœud.
Dans ce cas, j'ai appliqué cette dernière à une petite partie du document HTML (un avis). J'ai également utilisé la fonction html_text pour m'aider à récupérer le contenu textuel de l'élément que j'ai trouvé.
Enfin, je vais fusionner les deux vecteurs dans un seul data frame afin de centraliser les données :
result = data.frame(date = dates, rating = ratings)
Et le résultat final ressemblera à ceci :