Retour au blog
Guides
Raluca Penciuc19 octobre 20229 minutes de lecture

Comment le web scraping sous R rend la science des données passionnante

Comment le web scraping sous R rend la science des données passionnante

Introduction à R

R est le pendant open source du langage de programmation S, combiné à la sémantique de Scheme. Il a fait son apparition au milieu de l'année 1993, est devenu open source en 1995 et a connu sa première version bêta stable en 2000.

Cartoon meme comparing R and S Scheme with caption text expressing confusion

Ross Ihaka et Robert Gentleman ont conçu R dans le but de « transformer rapidement et fidèlement des idées en logiciels ».

R est un langage de programmation fonctionnel bien connu des scientifiques des données. Ses cas d'utilisation les plus courants sont :

  • la banque ;
  • la finance ;
  • le commerce électronique ;
  • l'apprentissage automatique ;
  • tout autre secteur utilisant de grandes quantités de données.

Comparé à SAS et SPSS, R est l'outil d'analyse le plus utilisé au monde. Sa communauté active et solidaire compte près de 2 millions d'utilisateurs.

Si l'on examine certaines des entreprises qui intègrent R dans leurs activités et la manière dont elles procèdent, on constate :

  • Facebook : pour mettre à jour le statut et le graphe de son réseau social ;
  • Google : pour prévoir l'activité économique et améliorer l'efficacité de la publicité en ligne ;
  • Foursquare : pour son moteur de recommandations ;
  • Trulia : pour prévoir les prix de l'immobilier et les taux de criminalité locaux.

Pourtant, par rapport à d'autres langages, R est en concurrence constante avec Python. Les deux proposent des outils de web scraping et disposent de communautés actives.

Les différences apparaissent lorsque l'on examine le public cible. Python dispose d'une syntaxe très facile à apprendre et de nombreuses fonctionnalités de haut niveau. Cela le rend plus attrayant pour les débutants et les utilisateurs non techniciens.

R peut sembler un peu intimidant au premier abord, mais il est davantage axé sur l'analyse statistique. Il offre un ensemble plus large d'outils intégrés d'analyse et de visualisation des données. Il peut donc constituer un meilleur choix pour les projets impliquant le traitement de grandes quantités de données, comme le web scraping.

À propos de rvest

Rvest fait partie des paquets les plus populaires utilisés pour le web scraping en R. Il offre des fonctionnalités de parsing puissantes, mais simples. BeautifulSoup de Python lui a servi de source d’inspiration et il fait partie de la collection tidyverse.

Intéressant, mais pourquoi utiliser rvest alors que R dispose de bibliothèques natives qui font le même travail ? La première bonne raison est que rvest est un wrapper pour les paquets httr et xml2. Cela signifie qu’il gère à la fois la requête GET et l’analyse HTML.

Vous utilisez donc une seule bibliothèque au lieu de deux, et votre code sera beaucoup plus propre et plus court. De plus, rvest peut également recevoir une chaîne de caractères en entrée et gérer l'analyse XML ainsi que le téléchargement de fichiers.

Il faut toutefois tenir compte du fait que les sites web ont de plus en plus de contenu généré dynamiquement. Les raisons sont diverses : performances, expérience utilisateur, et bien d’autres encore. Rvest ne peut pas gérer l’exécution de JavaScript, c’est donc là que vous devrez chercher une alternative.

Scraping avec R

Bon, assez de théorie. Voyons comment R se comporte dans un cas d'utilisation concret. Pour ce tutoriel, j'ai choisi la page Goodreads d'un livre très célèbre : 1984 de George Orwell. Vous pouvez trouver le site web ici : https://www.goodreads.com/book/show/61439040-1984.

Je souhaite voir comment la popularité de ce livre a évolué au fil des ans. Pour l'estimer, je vais extraire la liste des avis et récupérer la date et la note de chaque avis. Pour finir, j'enregistrerai les données dans un fichier externe qui pourra ensuite être traité par d'autres programmes.

Configurer l'environnement

Mais avant tout, vous devez vous assurer que vous disposez de tout ce dont vous avez besoin pour écrire le code.

CRAN page showing download links to install R for Linux, macOS, and Windows

En ce qui concerne l'IDE, vous avez deux options :

  • installer un plugin R pour Visual Studio Code ;
  • télécharger RStudio, conçu pour faciliter le codage en R.

Dans ce tutoriel, j'utiliserai cette dernière option. Vous pouvez le télécharger ici : https://www.rstudio.com/products/rstudio/download/.

RStudio pricing comparison table highlighting that RStudio Desktop is free to download

La version gratuite de RStudio Desktop suffit pour vous familiariser avec les bases. Comme précédemment, suivez les instructions d'installation.

Ouvrez RStudio et créez un nouveau répertoire vide. Je vais écrire le code dans un nouveau fichier nommé « goodreads-rvest.r ».

Présentation du navigateur

Avant d'extraire les données, vous devez déterminer quelles données vous souhaitez. Rvest prend en charge à la fois les sélecteurs CSS et XPath, alors choisissez votre méthode. 

Si vous prévoyez de vous lancer dans des projets de scraping plus complexes, je vous recommande d'acquérir des connaissances de base en HTML et CSS. Voici un bon terrain d'entraînement pour commencer.

Si vous n’êtes pas familier avec le HTML, il existe également des options non techniques. Par exemple, Chrome propose l’extension de navigateur SelectorGadget. Elle vous permet de cliquer n’importe où sur la page et vous indique le sélecteur CSS permettant d’extraire les données.

Mais tous les sites web ne sont pas aussi simples que Goodreads. Je vais choisir de récupérer les données à l'aide de sélecteurs CSS trouvés en inspectant manuellement le code HTML.

Accédez à l'URL cible dans votre navigateur et faites défiler vers le bas jusqu'à la section « Community Reviews ». Cliquez ensuite avec le bouton droit de la souris dessus et sélectionnez « Inspecter » pour ouvrir les outils de développement.

Goodreads book page with browser developer tools inspecting the community reviews section

Je vais me concentrer sur le conteneur dont l'identifiant est « other_reviews ». Utilisez maintenant le bouton « Inspecter » pour trouver le sélecteur CSS correspondant à la date et à la note d'un avis.

Goodreads review page with developer tools highlighting the review date and star rating elements

Vous pouvez donc remarquer ce qui suit :

  • chaque avis individuel est un conteneur div avec la classe « review » ;
  • la date de l'avis est un élément d'ancrage unique avec la classe « reviewDate » ;
  • la note de l'avis est un élément span avec la classe « staticStars ». Il comporte cinq éléments span en tant qu'enfants, correspondant au nombre d'étoiles qu'un utilisateur peut attribuer. Nous allons nous intéresser aux éléments colorés, qui ont la classe « p10 ».

Extraction des avis

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 :

RStudio console output showing an HTML document object printed after fetching a page

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 :

RStudio Help pane showing documentation for read_html and read_xml functions

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 :

RStudio console output showing a list of scraped review nodes from an HTML document

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 :

R console output showing a table of review dates and numeric ratings

Enregistrement des résultats

Nous savons tous que le scraping ne sert à rien si l'on ne stocke pas les résultats quelque part. En R, pour écrire dans un fichier CSV, il suffit de :

write.csv(result, "reviews.csv")

Le résultat doit être une matrice ou un cadre de données (ce qui est déjà le cas), sinon, le programme tente une conversion. Exécutez le code et vérifiez le répertoire du projet. Vous verrez que vous pouvez ouvrir le tableau précédent dans un éditeur de texte, un document Excel, etc.

Le résultat doit être une matrice ou un data frame (ce qui est déjà le cas), sinon, une conversion sera tentée. Exécutez le code et vérifiez le répertoire du projet. Vous verrez que vous pouvez ouvrir le tableau précédent dans un éditeur de texte, un fichier Excel, etc.

Inutile de préciser que notre liste de données ne comporte que 30 entrées. Le site web affiche plus de 90 000 avis et plus de 3 millions de notes. Que s'est-il donc passé ? Eh bien, la pagination.

De plus, retournez dans votre navigateur et cliquez sur la deuxième page. Vous remarquerez que la liste change, mais pas l'URL. Cela signifie qu'ils utilisent un état pour charger dynamiquement une autre section de la liste.

Dans ces situations, rvest peut ne pas être utile. À la place, un navigateur automatisé peut aider à imiter le comportement de clic pour charger le reste de la liste. RSelenium est un exemple de bibliothèque de ce type, mais je laisserai ce sujet pour un exercice complémentaire.

Conclusion

J'espère que ce tutoriel vous a fourni une base solide pour le web scraping avec R. Vous pouvez désormais prendre plus facilement une décision concernant la pile technologique de votre prochain projet.

Notez toutefois que cet article n'a pas abordé tous les défis du web scraping. Vous trouverez des explications plus détaillées sur ces concepts dans ce guide explicatif.

À propos de l'auteur
Raluca Penciuc, Développeur full-stack @ WebScrapingAPI
Raluca PenciucDéveloppeur full-stack

Raluca Penciuc est développeuse Full Stack chez WebScrapingAPI ; elle conçoit des robots de collecte de données, améliore les techniques de contournement et recherche des moyens fiables de réduire le risque de détection sur les sites cibles.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.