Comment le Web Scraping en R rend la science des données amusante

Raluca Penciuc le 19 octobre 2022

Au fur et à mesure que le web évolue, de plus en plus de données sont générées de manière dynamique. Il est donc plus difficile de les extraire à l'aide d'une API. Le web scraping en R vient aider les data scientists, dont les projets nécessitent d'énormes quantités de données.

Heureusement, les langages de programmation ont également évolué pour gérer ces situations. Un exemple populaire de ce type de langage est R, conçu pour mieux gérer les tâches à fort volume.

Dans ce tutoriel, je vais passer en revue les principes de base en parlant de l'utilité réelle de R. Je vais également décrire l'un des packages les plus populaires utilisés pour le web scraping avec R, rvest. Je décrirai également l'un des packages les plus populaires utilisés dans le web scraping avec R, rvest. Ensuite, j'illustrerai comment R fonctionne en matière d'extraction des données d'un site web.

Introduction à R

R est la version open-source du langage de programmation S, combiné avec la sémantique de Scheme. Il est apparu pour la première fois au milieu de l'année 1993, est devenu open-source en 1995 et a eu sa première version bêta stable en 2000.

blog-image

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

R est un langage de programmation fonctionnel bien connu des data scientists. Les cas d'utilisation les plus populaires sont les suivants :

  • bancaire ;
  • finances ;
  • le commerce électronique ;
  • l'apprentissage automatique ;
  • tout autre secteur qui utilise 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 nous examinons certaines des entreprises qui intègrent la recherche et le développement dans leurs activités et la manière dont elles le font, nous constatons ce qui suit : :

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

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

Les différences apparaissent lorsque l'on examine le public cible. Python a 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 techniques.

R peut sembler un peu intimidant au premier abord, mais il est davantage axé sur l'analyse statistique. Il offre un plus grand nombre d'outils intégrés d'analyse et de visualisation des données. Il peut donc s'avérer une meilleure option pour les projets dans lesquels vous manipulez de grandes quantités de données, comme le web scraping.

À propos de rvest

Rvest est l'un des packages les plus populaires utilisés pour le web scraping en R. Il offre des fonctionnalités de parsing puissantes mais simples. BeautifulSoup de Python est une source d'inspiration et fait partie de la collection tidyverse.

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

Ainsi, vous utilisez 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 en entrée et gérer l'analyse XML et le téléchargement de fichiers.

Pourtant, nous devrions considérer que les sites web ont plus de contenu généré dynamiquement. Les raisons sont diverses : performance, expérience utilisateur, et bien d'autres. Rvest ne peut pas gérer l'exécution de JavaScript, c'est donc là qu'il faut chercher une alternative.

Le scraping avec R

Bon, assez de théorie. Voyons comment R se comporte dans un cas d'utilisation réel. 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 veux voir comment la popularité de ce livre a évolué au fil des ans. Pour ce faire, je vais parcourir la liste des critiques et extraire la date et la note de chaque critique. Enfin, je sauvegarderai les données dans un fichier externe qui pourra être traité ultérieurement par d'autres programmes.

Mise en place de l'environnement

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

blog-image

En ce qui concerne l'IDE, deux options s'offrent à vous :

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

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

blog-image

La version gratuite de RStudio Desktop est suffisante pour vous permettre de 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

Maintenant, avant d'extraire les données, vous devez reconnaître les données que vous voulez. Rvest gère à la fois les sélecteurs CSS et XPath, alors choisissez ce qui vous convient le mieux. 

Si vous envisagez de vous lancer dans des projets de scraping plus complexes, je vous recommande d'avoir des connaissances de base en HTML et en CSS. Voici un bon terrain de jeu pour commencer.

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

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

Naviguez jusqu'à l'URL cible dans votre navigateur et descendez jusqu'à la section "Community Reviews". Cliquez ensuite avec le bouton droit de la souris et choisissez "Inspecter" pour ouvrir les outils de développement.

blog-image

Le conteneur avec l'identifiant "other_reviews" est celui sur lequel je vais me concentrer. Utilisez maintenant le bouton "Inspecter" pour trouver le sélecteur CSS de la date et de l'évaluation d'un avis.

blog-image

Vous pouvez donc constater ce qui suit :

  • chaque avis individuel est un conteneur div avec la classe "avis" ;
  • la date de l'examen est un élément à ancre unique de la classe "reviewDate" ;
  • l'évaluation de l'avis est un élément span de la classe "staticStars". Il a cinq éléments span comme enfants, le nombre d'étoiles qu'un utilisateur peut définir. Nous allons examiner les éléments colorés, qui ont la classe "p10".

Extraire les commentaires

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 dans votre console la progression de l'installation du paquet.

L'installation n'a lieu qu'une fois, vous pouvez donc commenter ou supprimer la ligne précédente :

#install.packages('rvest')

Vous devez maintenant charger (ou importer) la bibliothèque :

bibliothèque(rvest)

J'utiliserai la fonction read_html pour envoyer une requête GET au site web cible, qui téléchargera le document HTML nécessaire. De cette manière, je téléchargerai le document HTML nécessaire :

book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")

Le résultat est maintenant stocké dans la variable book_html, que vous pouvez également voir en tapant simplement dans la console :

blog-image

Si vous avez besoin à un moment donné de consulter la documentation officielle d'une fonction que vous voulez utiliser, tapez dans la console :

help(nom_de_la_fonction) 

RStudio ouvrira un serveur HTTP avec un lien direct vers la documentation. Pour read_html, la sortie sera :

blog-image

Pour obtenir la liste des critiques, j'utiliserai la fonction html_elements. Elle recevra en entrée le sélecteur CSS que j'ai trouvé plus tôt :

reviews <- book_html %>% html_elements('div.review')

Le résultat sera une liste de nœuds XML, que j'itérerai pour obtenir la date et la note de chaque élément individuel :

blog-image

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 vous permet de réduire 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 recueillir 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()

En parcourant la liste des avis, je recherche deux valeurs : la date et l'évaluation. Comme vous l'avez vu précédemment, la date est un élément d'ancrage qui possède la classe reviewDate .

Le classement est un élément span avec la classe staticStars , et il contient cinq éléments span pour chaque étoile. Si l'utilisateur a accordé une étoile, l'élément span aura le nom de classe p10 tandis que les autres auront le nom de classe p0 .

Le code se présentera comme suit :

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 le cas présent, j'ai appliqué cette dernière à une petite section du document HTML (une critique). J'ai également utilisé la fonction html_text pour m'aider à obtenir le contenu textuel de l'élément que j'ai trouvé. 

Enfin, je fusionnerai les deux vecteurs dans un seul cadre de données afin de centraliser les données :

result = data.frame(date = dates, rating = ratings)

Le résultat final sera le suivant :

blog-image

Sauvegarde des résultats

Nous savons tous que le scraping est inutile si les résultats ne sont pas stockés quelque part. En R, écrire dans un CSV n'est rien de plus que :

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 il 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 cadre de données (ce qui est déjà le cas), sinon il 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.

Il va sans dire 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 d'évaluations. Que s'est-il passé ? Eh bien, la pagination.

En outre, 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. Au lieu de cela, un navigateur automatisé peut aider à imiter le comportement du clic pour charger le reste de la liste. RSelenium est un exemple d'une telle bibliothèque, mais je laisserai ce sujet comme un exercice de suivi.

Conclusion

J'espère que ce tutoriel vous a donné une base solide pour commencer à faire du web scraping avec R. Maintenant vous pouvez prendre une décision plus facile sur la pile technologique de votre prochain projet.

Cependant, veuillez noter que cet article n'a pas couvert les nombreux défis du web scraping. Vous les trouverez plus en détail dans ce guide explicite.

Nouvelles et mises à jour

Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

vignette
GuidesComment récupérer les données des produits Amazon : Un guide complet des meilleures pratiques et des outils

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.

Suciu Dan
avatar de l'auteur
Suciu Dan
15 minutes de lecture
vignette
GuidesLe guide ultime de la recherche d'emploi en ligne, ses avantages et ses inconvénients

La définition et l'utilisation du "job scraping" en ligne. Les avantages et les inconvénients du "job scraping", ainsi que les stratégies et les risques potentiels.

Suciu Dan
avatar de l'auteur
Suciu Dan
8 minutes de lecture
vignette
GuidesApprendre à contourner la détection de Cloudflare avec le meilleur navigateur Selenium

Apprenez quel est le meilleur navigateur pour contourner les systèmes de détection de Cloudflare lorsque vous faites du web scraping avec Selenium.

Mihnea-Octavian Manolache
avatar de l'auteur
Mihnea-Octavian Manolache
9 minutes de lecture