À la découverte de {rvest}

don't mind me just using rvest package
Auteur : Colin Fay
Tags : Actualités, Ressources
Date :

Poursuite de nos bonnes résolutions prises à Bruxelles, avec un parcours en bonne et due forme du package de webscraping rvest.

Commençons par le commencement

Eh oui, il ne faut jamais oublier que la première étape est toujours l’installation. Car rvest ne vient pas nativement avec R, puisqu’il s’agit d’un package additionnel développé par (on vous le donne dans le mille) Hadley Wickham.

[pastacode lang=”R” manual=”%23%20Pour%20la%20version%20stable%20%0Ainstall.packages(%22rvest%22)%0A%23%20et%20pour%20la%20version%20en%20d%C3%A9veloppement%20%3A%20%0Adevtools%3A%3Ainstall_github(%22hadley%2Frvest%22)” message=”” highlight=”” provider=”manual”/]

rvest, pour quoi faire ?

Très bonne question, lecteur. rvest est un package qui vous permet de parser (autrement dit de parcourir et d’aller chercher) le contenu d’une page web, pour le rendre exploitable par R. Un exemple ? Créer une liste depuis une page Wikipédia, récupérer un texte sur une page, transformer un tableau html en data.frame… bref, les possibilités sont nombreuses.

Bon, mettons directement les mains dans le cambouis : comment créer un vecteur avec une chaîne de caractères contenant un texte brut, celui de The Art of War de Tsun Zu, disponible sur le projet Gutenberg ?

Une méthode un peu… bourrin

On pourrait commencer par une méthode old school, en {base}.

[pastacode lang=”R” manual=”text_base%20%3C-%20readLines(%22http%3A%2F%2Fwww.gutenberg.org%2Fcache%2Fepub%2F132%2Fpg132.html%22)” message=”” highlight=”” provider=”manual”/]

Nous voilà avec un joli petit vecteur de 7209 éléments contenant tout le détail html de la page, c’est-à-dire accompagné de son header, et tutti quanti. (si vous avez besoin de vous rafraîchir la mémoire sur le squelette d’une page web, rendez-vous ici). Autant dire, un paquet d’éléments pas vraiment utiles dans notre cas.

Première étape donc, sélectionner le contenu entre les deux balises <body>.

[pastacode lang=”R” manual=”begin%20%3C-%20grep(%22%3Cbody%3E%22%2C%20text_base)%20%2B%201%0Aend%20%3C-%20grep(%22%3C%2Fbody%3E%22%2C%20text_base)%20-%201%0Atext_base%20%3C-%20text_base%5B%20begin%20%3A%20end%5D” message=”” highlight=”” provider=”manual”/]

Nouvelle étape : le corps. Maintenant, il va falloir se débarrasser de toutes les balises html de notre vecteur. Vous êtes bons en regex ? Parce que là, il va falloir supprimer tous les éléments contenus entre < et`>. Bon, il faut avouer que cette regex est plutôt facile :

[pastacode lang=”R” manual=”text_base%20%3C-%20gsub(%22%3C.*%3E%22%2C%20%22%22%2C%20text_base)” message=”” highlight=”” provider=”manual”/]

Puis, adieu éléments vides :

[pastacode lang=”R” manual=”text_base%20%3C-%20text_base%5Bnchar(text_base)%20%3E%200%5D%0A” message=”” highlight=”” provider=”manual”/]

Et collons le tout dans un seul vecteur :

[pastacode lang=”R” manual=”text_base%20%3C-%20paste(text_base%2C%20sep%20%3D%20%22%22%2C%20collapse%20%3D%20%22%22)” message=”” highlight=”” provider=”manual”/]

Avouons que nous n’avons pas choisi l’exemple le plus compliqué du lot. Notre page html était très simple : elle ne contenait que du texte, et nous voulions tout récupérer. Imaginez maintenant refaire la même avec une page Wikipédia dans laquelle on ne veut récupérer qu’un seul paragraphe…

Nous vous entendons d’ici : “Ça ne serait pas plus simple si nous pouvions faire cela en deux lignes de code ?” Eh bien si, justement, c’est à ça que sert {rvest} !

Avec rvest

[pastacode lang=”R” manual=”library(rvest)%0Alibrary(tidyverse)%0Atext_rvest%20%3C-%20read_html(%22http%3A%2F%2Fwww.gutenberg.org%2Fcache%2Fepub%2F132%2Fpg132.html%22)%20%25%3E%25%0Ahtml_text()” message=”” highlight=”” provider=”manual”/]

Eh oui, c’est aussi rapide que ça !

rvest et le HTML/CSS

La première étape, donc, est de lire une page html dans votre session R avec la fonction read_html. Par exemple, la page Wikipedia de la distance de Levenshtein.

[pastacode lang=”R” manual=”dist_lev%20%3C-%20read_html(%22https%3A%2F%2Ffr.wikipedia.org%2Fwiki%2FDistance_de_Levenshtein%22)%0A” message=”” highlight=”” provider=”manual”/]

Ensuite, vous pourriez être tenté de tout envoyer dans un html_text(). Mauvaise idée : il nous faut d’abord sélectionner le ou les noeud(s) CSS que nous allons extraire du DOM. “CS quoi ? DOM qui ?” Bien, petite digression sur le HTML/CSS.

un DOM

DOM est la contraction de Document Object Model. Il s’agit de la représentation sous forme d’arbre de la structure d’une page web, et chaque point de cet arbre est appelé un noeud.

id et class

Si vous avez séché vos cours de CSS, petit rappel sur ce qu’est une balise id vs une balise class.

  • D’abord, leur point commun : les deux se placent au sein d’une balise (par exemple : <p id=”plop”></p>). Ces éléments réfèrent à des définitions CSS. Par exemple, ici la définition CSS .plop sera appliqué à ce qui se trouve entre ces deux balises.

  • Leurs différences : l’id fait référence à un élément unique dans le DOM, la classe peut être reprise dans plusieurs balises.

  • Côté CSS, l’id s’écrit avec un #, la classe avec un .

  • Dans le CSS, Vous pouvez faire référence à “tous les paragraphes (balises p) d’une classe ploum” avec p.ploum.

</digression off>

Parcourir un DOM avec rvest

Pour extraire du texte

C’est sur ces différents éléments que va s’appuyer rvest pour aller chercher des éléments dans votre page web. Par exemple, on pourrait vouloir la liste des titres de niveau 2.

[pastacode lang=”R” manual=”dist_lev%20%25%3E%25%0A%20%20html_nodes(%22h2%22)%20%25%3E%25%0A%20%20html_text()%20%0A%0A%5B1%5D%20%22Sommaire%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B2%5D%20%22D%C3%A9finition%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B3%5D%20%22Exemples%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B4%5D%20%22Algorithme%20de%20Levenshtein%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B5%5D%20%22Exemple%20de%20d%C3%A9roulement%20de%20l’algorithme%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%0A%5B6%5D%20%22G%C3%A9n%C3%A9ralisation%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B7%5D%20%22Notes%20et%20r%C3%A9f%C3%A9rences%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B8%5D%20%22Voir%20aussi%5Bmodifier%20%7C%20modifier%20le%20code%5D%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B9%5D%20%22Menu%20de%20navigation%22%20%20%20%20″ message=”” highlight=”” provider=”manual”/]

Voire, tout simplement, le texte du cinquième élément de la partie Notes et Références :

[pastacode lang=”R” manual=”dist_lev%20%25%3E%25%0A%20%20html_node(%22%23cite_note-5%20.reference-text%22)%20%25%3E%25%0A%20%20html_text()%0A%5B1%5D%20%22An%20O(NP)%20Sequence%20Comparison%20Algorithm%20Sun%20Wu%2C%20Udi%20Manber%20%26%20Gene%20Myers.%22″ message=”” highlight=”” provider=”manual”/]

Vous faites les gros yeux ? Il y a de quoi, et on va vous dire pourquoi : on a sauté une étape ici — comment trouver l’élément "#cite_note-5 .reference-text" ? Pour cela, suivez la recommandation officielle, et installez SelectorGadget, un add-in Chrome pour retrouver le chemin d’un élément dans un DOM en cliquant dessus.

À noter que, si vous êtes un peu plus pointilleux (ou ne souhaitez pas installer de nouvel addin sur votre navigateur), vous pouvez également utiliser le XPATH de votre page HTML. Pour ça, direction votre navigateur (ici toujours Google Chrome). Sur la page, faites un clic droit sur la partie qui vous intéresse, et choisissez Inspecter. La console de développement s’ouvre, et il suffit de choisir l’élément en question dans le code HTML qui s’affiche, puis clic droit > Copy > Copy XPATH.

[pastacode lang=”R” manual=”dist_lev%20%25%3E%25%0A%20%20html_node(xpath%20%3D%20’%2F%2F*%5B%40id%3D%22cite_note-5%22%5D%2Fspan%5B2%5D’)%20%25%3E%25%0A%20%20html_text()%0A%5B1%5D%20%22An%20O(NP)%20Sequence%20Comparison%20Algorithm%20Sun%20Wu%2C%20Udi%20Manber%20%26%20Gene%20Myers.%22″ message=”” highlight=”” provider=”manual”/]

spath selector

En passant, vous noterez l’utilisation de html_node et html_nodes, renvoyant respectivement le premier élément du DOM, et tous les éléments du DOM. Les mêmes variantes existent pour html_attr et html_table.

Extraire un tableau

La page Wikipedia que nous avons contient des tableaux. Vous savez, ces trucs rédigés en html comme ça :

[pastacode lang=”markup” manual=”%3Ctable%3E%0A%20%20%20%3Ctr%3E%0A%20%20%20%20%20%20%3Cth%3EPr%C3%A9nom%3C%2Fth%3E%0A%20%20%20%20%20%20%3Cth%3ENom%3C%2Fth%3E%0A%20%20%20%20%20%20%3Cth%3EProfession%3C%2Fth%3E%0A%20%20%20%3C%2Ftr%3E%0A%20%20%20%3Ctr%3E%0A%20%20%20%20%20%20%3Ctd%3EColin%3C%2Ftd%3E%0A%20%20%20%20%20%20%3Ctd%3EFay%3C%2Ftd%3E%0A%20%20%20%20%20%20%3Ctd%3EData%20Analyst%3C%2Ftd%3E%0A%20%20%20%3C%2Ftr%3E%0A%3C%2Ftable%3E” message=”” highlight=”” provider=”manual”/]

Bref, une structure facilement reconnaissable, et potentiellement simple à transformer en tableau. Ça, c’est le job de html_table(), qui prend en entrée la liste des noeuds “table”, et transforme en matrice.

[pastacode lang=”R” manual=”dist_lev%20%25%3E%25%0A%20%20html_node(‘table’)%20%25%3E%25%20%0A%20%20html_table()%0A%20%20%20%20%20%20C%20H%20I%20E%20N%20S%0A1%20%20%200%201%202%203%204%205%206%0A2%20N%201%200%200%200%200%200%200%0A3%20I%202%200%200%200%200%200%200%0A4%20C%203%200%200%200%200%200%200%0A5%20H%204%200%200%200%200%200%200%0A6%20E%205%200%200%200%200%200%200″ message=”” highlight=”” provider=”manual”/]

Voilà, c’est aussi simple que ça !

Travailler avec les attributs

Interlude : tags et attributs

En html, votre balise de gauche (celle qui est entourée de &lt; &gt;) se compose de plusieurs éléments, et notamment le tag et les attributs.

  • Le tag est l’élément qui permet de distinguer la place de votre contenu dans l’arbre. Par exemple, le tag p indique un nouveau paragraphe, h1 un titre de niveau 1, etc. Les tags sont universels : n’importe quel navigateur saura lire <h1>Titre</h1>. Ce sont les attributs qui viennent personnaliser ces tags.

  • Les attributs sont l’ensemble des éléments qui vont venir enrichir votre tag. Nous avons par exemple vu les id et les class CSS. Ce sont qui vont rendre le tag moins générique, et vous permettre de personnaliser une page : <h1 class = “blueheader”>Titre</h1> n’aura de sens qu’accompagné de la feuille CSS définissant blueheader.

Scraper les tags et les attributs d’un élément du DOM

[pastacode lang=”R” manual=”dist_lev%20%25%3E%25%0A%20%20html_node(%22h1%22)%20%25%3E%25%0A%20%20html_attrs()%0A%20%20%20%20%20%20%20%20%20%20%20%20id%20%20%20%20%20%20%20%20%20%20class%20%20%20%20%20%20%20%20%20%20%20lang%20%0A%22firstHeading%22%20%22firstHeading%22%20%20%20%20%20%20%20%20%20%20%20%22fr%22%20″ message=”” highlight=”” provider=”manual”/]

[pastacode lang=”R” manual=”%23%20Anciennement%20connu%20comme%20html_tag()%0Adist_lev%20%25%3E%25%0A%20%20html_node(xpath%20%3D%20’%2F%2F*%5B%40id%3D%22mw-content-text%22%5D%2Fdiv%2Fh2%5B3%5D’)%20%25%3E%25%0A%20%20html_name()%0A%5B1%5D%20%22h2%22″ message=”” highlight=”” provider=”manual”/]

Bon, ici, ce n’est pas très informatif, il faut l’avouer, mais vous avez l’idée 🙂

Faire du webscraping avec rvest

Télécharger tous les datasets sur une page

C’est bien beau tout ça, mais ça ne se révèle pas encore très utile. Vous voulez des idées plus croustillantes ? Nous en avons sous la main : par exemple, comment télécharger tous les .csv contenus sur cette page ?

[pastacode lang=”R” manual=”library(stringr)%0Adataset_url%20%3C-%20%22https%3A%2F%2Fvincentarelbundock.github.io%2FRdatasets%2Fdatasets.html%22%0A%0Alist_dataset%20%3C-%20read_html(dataset_url)%20%25%3E%25%0A%20%20html_nodes(%22.cellinside%3Anth-child(6)%20a%22)%20%25%3E%25%0A%20%20html_attr(%22href%22)%0A%0Apurrr%3A%3Amap(.x%20%3D%20list_dataset%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20~download.file(.x%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20destfile%20%3D%20str_extract(.x%2C%20%22%5B%5B%3Aalnum%3A%5D%5D*.csv%24%22))%0A)” message=”” highlight=”” provider=”manual”/]

Et voilà !

De la page web au data frame

Essayons quelque chose d’autre. Comment créer un tableau depuis les informations contenues dans une page web ? Comment transformer un trombinoscope (comme celui de ThinKR) en data.frame ?

[pastacode lang=”R” manual=”thinkr_url%20%3C-%20read_html(%22http%3A%2F%2Fwww.thinkr.fr%2Fexpert-logiciel-r%2F%22)%0A%0A%23%20Les%20noms%20%0Athinkr_url%20%25%3E%25%0A%20%20html_nodes(%22.team-author-name%22)%20%25%3E%25%0A%20%20html_text()%0A%5B1%5D%20%22Vincent%20Guyader%22%20%22Diane%20Beldame%22%20%20%20%22Romain%20Fran%C3%A7ois%22%20%22Colin%20Fay%22%20%20%20%20%20%20%0A%0A%23%20Les%20mails%20%0Athinkr_url%20%25%3E%25%0A%20%20html_nodes(%22a.mail%22)%20%25%3E%25%0A%20%20html_attr(%22href%22)%20%25%3E%25%0A%20%20stringr%3A%3Astr_replace_all(%22mailto%3A%22%2C%20%22%22)%0A%5B1%5D%20%22vincent%40thinkr.fr%22%20%22diane%40thinkr.fr%22%20%20%20%22romain%40thinkr.fr%22%20%20%22colin%40thinkr.fr%22%20%20%0A%0A%23%20Les%20comptes%20twitter%20%0Athinkr_url%20%25%3E%25%0A%20%20html_nodes(%22a.twitter%22)%20%25%3E%25%0A%20%20html_attr(%22href%22)%0A%5B1%5D%20%22https%3A%2F%2Ftwitter.com%2Fthinkr_fr%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B2%5D%20%22https%3A%2F%2Ftwitter.com%2Fdianebeldame%22%20%20%20%20%20%20%20%20%20%20%20%0A%5B3%5D%20%22https%3A%2F%2Ftwitter.com%2Fromain_francois%3Flang%3Dfr%22%0A%5B4%5D%20%22https%3A%2F%2Ftwitter.com%2F_colinfay%22%20%20%20%20%20%20%20%0A%0A%23%20Les%20comptes%20Github%20%0Athinkr_url%20%25%3E%25%0A%20%20html_nodes(%22a.github%22)%20%25%3E%25%0A%20%20html_attr(%22href%22)%0A%5B1%5D%20%22https%3A%2F%2Fgithub.com%2FThinkRstat%2FThinkR%22%20%22https%3A%2F%2Fgithub.com%2FDianeBeldame%22%20%20%20%20%20%0A%5B3%5D%20%22https%3A%2F%2Fgithub.com%2Fromainfrancois%22%20%20%20%20%22https%3A%2F%2Fgithub.com%2Fcolinfay%22%0A%0A%23%20Et%20pour%20tout%20avoir%20dans%20un%20joli%20tableau%20%3A%0A%0Athinkr%20%3C-%20data_frame(%0A%20%20name%20%3D%20thinkr_url%20%25%3E%25%0A%20%20%20%20html_nodes(%22.team-author-name%22)%20%25%3E%25%0A%20%20%20%20html_text()%2C%0A%20%20mail%20%3D%20thinkr_url%20%25%3E%25%0A%20%20%20%20html_nodes(%22a.mail%22)%20%25%3E%25%0A%20%20%20%20html_attr(%22href%22)%20%25%3E%25%0A%20%20%20%20stringr%3A%3Astr_replace_all(%22mailto%3A%22%2C%20%22%22)%2C%20%0A%20%20twitter%20%3D%20thinkr_url%20%25%3E%25%0A%20%20%20%20html_nodes(%22a.twitter%22)%20%25%3E%25%0A%20%20%20%20html_attr(%22href%22)%2C%0A%20%20github%20%3D%20thinkr_url%20%25%3E%25%0A%20%20%20%20html_nodes(%22a.github%22)%20%25%3E%25%0A%20%20%20%20html_attr(%22href%22)%0A)” message=”” highlight=”” provider=”manual”/]

Facile n’est-il pas ?

rvest avancé

Naviguer sur une page avec rvest

Passons maintenant à une méthode plus avancée : la simulation de navigation. Vous aurez besoin de la fonction html_session, qui mîme le comportement de votre navigateur. Les fonctions complémentaires étant jump_to, simulant le “voyage” vers un lien de la page, follow_link, pour suivre un lien avec un élément css/xpath, ou directement avec le texte du lien, back(), pour un retour en arrière, et session_history, qui vous donne l’historique de la navigation.

En clair :

[pastacode lang=”R” manual=”library(httr)%0Athinkr_session%20%3C-%20html_session(%22http%3A%2F%2Fwww.thinkr.fr%2F%22)%0A%0A%23%20Avec%20les%20urls%0Athinkr_session%20%25%3E%25%20%0A%20%20jump_to(%22formation-au-logiciel-r%2F%22)%20%25%3E%25%20%0A%20%20jump_to(%22programmation-avancee-avec-r%2F%22)%20%25%3E%25%20%0A%20%20session_history()%0A%0A%20%20http%3A%2F%2Fwww.thinkr.fr%2F%0A%20%20http%3A%2F%2Fwww.thinkr.fr%2Fformation-au-logiciel-r%2F%0A-%20http%3A%2F%2Fwww.thinkr.fr%2Fformation-au-logiciel-r%2Fprogrammation-avancee-avec-r%2F%0A%20%20%0A%23%20Avec%20du%20texte%0Athinkr_session%20%25%3E%25%20%0A%20%20follow_link(%22D%C3%A9veloppement%20en%20langage%20R%22)%20%25%3E%25%20%0A%20%20follow_link(%22contactez-nous%22)%20%25%3E%25%20%0A%20%20session_history()%0A%0A%20%20http%3A%2F%2Fwww.thinkr.fr%2F%0A%20%20http%3A%2F%2Fwww.thinkr.fr%2Fdeveloppement-r%2F%0A-%20http%3A%2F%2Fwww.thinkr.fr%2Fcontact%2F%0A%0A%23%20Avec%20un%20css%0Athinkr_session%20%25%3E%25%20%0A%20%20follow_link(css%20%3D%20%22.entry-title%20a%22)%20%25%3E%25%20%0A%20%20session_history()%0A%20%20%0A%20%20http%3A%2F%2Fwww.thinkr.fr%2F%0A-%20http%3A%2F%2Fwww.thinkr.fr%2Fau-menu-du-jour-r6-partie-2%2F” message=”” highlight=”” provider=”manual”/]

Créer de la donnée en naviguant avec rvest

Voilà, combinons maintenant tout ça. Pour un petit coup de main, nous allons faire appel à httr, et créer des web crawlers ultra basiques. Le premier renvoie la liste des liens de la page, et leur statut (200/400, etc.)

[pastacode lang=”R” manual=”library(httr)%0A%0Aget_status%20%3C-%20function(url)%7B%0A%20%20return(data.frame(url%20%3D%20url%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20response_code%20%3D%20html_session(url)%20%25%3E%25%20status_code()))%0A%7D%0A%0Aget_status(%22http%3A%2F%2Fwww.thinkr.fr%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%20response_code%0A1%20http%3A%2F%2Fwww.thinkr.fr%20%20%20%20%20%20%20%20%20%20%20200%0A%0Aget_page_status%20%3C-%20function(url)%7B%0A%20%20%23%20Open%20a%20session%0A%20%20url_session%20%3C-%20%20html_session(url)%0A%20%20%0A%20%20list_url%20%3C-%20url_session%20%25%3E%25%0A%20%20%20%20html_nodes(%22a%22)%20%25%3E%25%0A%20%20%20%20html_attr(%22href%22)%0A%20%20%0A%20%20%23Remove%20anchor%0A%20%20list_url%20%3C-%20list_url%5B-grep(%22%23.*%22%2C%20list_url)%5D%0A%20%20%0A%20%20%23%20Get%20all%20the%20status%20%0A%20%20status_link%20%3C-%20purrr%3A%3Amap_df(list_url%2C%20get_status)%0A%0A%20%20return(status_link)%0A%7D%0A%0Aget_page_status(%22http%3A%2F%2Fthinkr.fr%22)%20%25%3E%25%20View” message=”” highlight=”” provider=”manual”/]

Le second de nos crawlers choisira un lien de manière aléatoire dans la page que nous lui fournirons, jusqu’à rencontrer une page indisponible qui renvoie un autre code que 200.

[pastacode lang=”R” manual=”crawler%20%3C-%20function(url)%7B%0A%20%20%0A%20%20%23%20Open%20a%20session%0A%20%20url_session%20%3C-%20%20html_session(url)%0A%20%20request_code%20%3C-%20url_session%20%25%3E%25%20status_code()%0A%20%20i%20%3C-%201%0A%20%20while(request_code%20%3D%3D%20200)%7B%0A%20%20%20%20url_list%20%3C-%20url_session%20%25%3E%25%0A%20%20%20%20%20%20html_nodes(%22a%22)%20%25%3E%25%0A%20%20%20%20%20%20html_attr(%22href%22)%0A%20%20%20%20url_session%20%3C-%20url_session%20%25%3E%25%20jump_to(sample(url_list%2C%201))%0A%20%20%20%20print(url_session%24url)%0A%20%20%20%20print(sprintf(%22Niveau%20%25s%22%2Ci))%0A%20%20%20%20i%20%3C-%20i%20%2B1%0A%20%20%20%20request_code%20%3C-%20url_session%20%25%3E%25%20status_code()%0A%20%20%7D%0A%7D%0A%0A%23%20Testons%20le%20sur%20la%20page%20Wikipedia%20des%20Web%20Crawler%0A%0Acrawler(%22https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWeb_crawler%22)” message=”” highlight=”” provider=”manual”/]

Bien sûr, notre crawler pourrait être beaucoup plus simple : httr nous renvoie une erreur dès qu’il rencontre la moindre erreur http, donc :

[pastacode lang=”R” manual=”crawler_simple%20%3C-%20function(url)%7B%0A%20%20url_session%20%3C-%20html_session(url)%0A%20%20i%20%3C-%201%0A%20%20while(TRUE)%7B%0A%20%20%20%20url_list%20%3C-%20url_session%20%25%3E%25%0A%20%20%20%20%20%20html_nodes(%22a%22)%20%25%3E%25%0A%20%20%20%20%20%20html_attr(%22href%22)%0A%20%20%20%20url_session%20%3C-%20url_session%20%25%3E%25%20jump_to(sample(url_list%2C%201))%0A%20%20%20%20print(sprintf(%22Niveau%20%25s%22%2Ci))%0A%20%20%20%20i%20%3C-%20i%20%2B1%0A%20%20%20%20print(url_session%24url)%0A%20%20%7D%0A%7D%0A%0Acrawler_simple(%22https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWeb_crawler%22)” message=”” highlight=”” provider=”manual”/]

Cliquez sur le gif pour l’ouvrir

Bien sûr, ici, le code reste simple car nous demandons à notre crawler d’imprimer à l’écran jusqu’à manquer d’air. Il faudrait procéder autrement si nous voulions conserver les données ! Mais pour ça, c’est à votre tour 😉


Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


À lire également

Nos formations Certifiantes à R sont finançables à 100% via le CPF

Nos formations disponibles via moncompteformation.gouv.fr permettent de délivrer des Certificats reconnues par l’état, enregistrées au répertoire spécifique de France Compétences. 3 niveaux de certifications existent :

Contactez-nous pour en savoir plus.