Tendances Youtube

L’objectif est de récupérer la liste des tendances de Youtube qui se trouvent dans la page à l’aide du package rvest et de la sélection par balises.

Chargement du fichier HTML

On commence par charger le package rvest et lire le fichier html en le désignant par son url.

library(rvest)
## Loading required package: xml2
# Lecture de la page
youtube <-read_html("https://www.youtube.com/feed/trending")

Récolte d’une information

Pour récupérer un élément, il faut connaître la balise; certaines sont connues à l’avance, d’autres doivent être repérées dans la page.

Balise connue

Le titre de la page correspond à la balise “title”; pour récupérer cette balise on utilise la fonction html_node.

Balise_titre <- html_node(youtube,"title") 
titre <- html_text(Balise_titre)
print(titre)
## [1] "  Tendances\n - YouTube"

Il faut ensuite filtrer le caractère spécial par les outils de traitement de chaîne.

Balise inconnue

On veut récupérer la liste des titre des vidéos. Il faut d’abord repérer la balise correspondante dans le navigateur Internet;

Utilisation du code source de la page

On peut afficher la source de la page (clic droit, code source), mais le résultat n’est praticable que si la page est simple.

Utilisation de l’inspecteur

On se place avec la souris sur le titre d’une vidéo. On lance l’inspecteur sur cet élément (clic droit, Examiner l’élément), l’inspecteur s’ouvre dans une fenêtre en surlignant la balise correspondante “a”.

Liste_Balise_a <- html_nodes(youtube,"a") 
Liste_a<-html_text(Liste_Balise_a)
print(Liste_a)

La sélection par la balise “a” est trop large. on remarque que les titres sont toujours sous une balise “h3”. On utilise le sélecteur “h3 a”

Utilisation de selectorgadget

Il s’agit d’une application java (https://selectorgadget.com/). Une fois lancée, elle examine l’élément sous la souris, le met en surbrillance avec un cadre sur lequel apparaissent les deux balises directement supérieures. Pour le titre de vidéo on obtient bien “h3 a”.

Liste_Balise_Titre <- html_nodes(youtube,"h3 a") 
Liste_Titre <- html_text(Liste_Balise_Titre)
print(Liste_Titre)

La liste contient encore des éléments ne correspondant pas au titre. Pour éviter ce problème il faut ajouter des conditions à la sélection.

Sélecteurs avancés

Les sélecteurs avancés permettent de spécifier un type de balise en ajoutant une condition sur ses attributs. Il y a deux syntaxes pour ces sélecteurs selon qu’ils portent sur des éléments CSS ou XML.

Code CSS

L’outil sélectorgadget propose un code CSS complet dans un pop-up gris de manière directement utilisable. Il suffit de coller cette expression entre double apostrophes.

Liste_Balise_Titre <- html_node(youtube,"#grid-container :nth-child(1) #dismissable #meta .style-scope") 
print(Liste_Balise_Titre)
## {xml_missing}
## <NA>

Malheureusement en raison de la perte de format xml lors des conversions des pages dynamiques ce sélecteur ne fonctionne pas.

Code XPath

L’outil sélectorgadget propose de traduire le code CSS en code Xpath plus adapté à la structure xml (Bouton Xpath).La syntaxe d’appel est différente xpath=‘chemin xpath’. Pour en savoir plus sur la syntaxe Xpath : https://www.w3schools.com/xml/xpath_syntax.asp

Liste_Balise_Titre <- html_node(youtube,xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "yt-formatted-string", " " ))]') 
print(Liste_Balise_Titre)
## {xml_missing}
## <NA>

Malheureusement, ce sélecteur ne fonctionne pas la page Youtube. En conclusion, la récolte sur Youtube nécessite sans doute d’utiliser une API dédiée proposée par Youtube. L’avantage pour Youtube est de pouvoir connaître le type d’information récoltée dans ses pages.

Récolte des températures sur météo MSN

Pour faire une démonstration de l’usage de la syntaxe des sélecteurs, nous recherchons la température courante sur le serveur météo MSN.

meteo <-read_html("https://www.msn.com/fr-fr/meteo")

Pour la température courante, Selectorgadget donne la suite de balises “div span” dans la cadre en surbrillance et le sélecteur “.current” dans la boite pop up. On concatène ces deux informations.

Balise_Temp= html_node(meteo, "div span.current") 
Text_Temp<-html_text(Balise_Temp)
print(Text_Temp)
## [1] "18"

En tapant “div span.current” dans la boîte Selectorgadget on obtient sa traduction Xpath:

meteo <-read_html("https://www.msn.com/fr-fr/meteo")
Balise_Temp= html_node(meteo, xpath='//div//span[contains(concat( " ", @class, " " ), concat( " ", "current", " " ))]') 
Text_Temp<-html_text(Balise_Temp)
print(Text_Temp)
## [1] "18"

Pour récupérer la liste des températures, Selectorgadget propose“#main :nth-child(1)”. Ce sélecteur n’est pas assez sélectif ; il faut se limiter aux balises “li p”

meteo <-read_html("https://www.msn.com/fr-fr/meteo")
Liste_Balise_Temp= html_nodes(meteo,"li p " )
Text_Temp<-html_text(Liste_Balise_Temp)
print(Text_Temp)
##  [1] "11"  "18°" "12"  "19°" "13"  "20°" "14"  "20°" "15"  "20°" "16" 
## [12] "20°" "17"  "20°" "18"  "20°" "19"  "20°" "20"  "20°" "21"  "20°"
## [23] "22"  "19°" "23"  "19°" "00"  "19°" "01"  "18°" "02"  "18°" "03" 
## [34] "18°" "04"  "18°" "05"  "18°" "06"  "18°" "07"  "18°" "08"  "18°"
## [45] "09"  "18°" "10"  "19°" "20°" "18°" "23°" "17°" "21°" "14°" "20°"
## [56] "11°" "21°" "15°" "22°" "12°" "23°" "13°" "25°" "14°" "26°" "14°"
## [67] "25°" "15°"

Pour extraire la quatrième valeur, on emploie la fonction magritt2

Balise_4 <- magrittr::extract2(Liste_Balise_Temp,4)
Text_Temp<-html_text(Balise_4)
print(Text_Temp)
## [1] "19°"