Skip to content

[Traduction] Scraper Google Scholar avec R et le package rvest

18/01/2016

Ce billet est la traduction de celui-ci, , avec l’aimable autorisation de son auteur Fisseha Berhane (que je remercie, pour le billet et pour l’autorisation).
Il m’est arrivé de rajouter quelques commentaires [entre crochets].
A noter aussi le package scholar , spécialement conçu pour manipuler les données de Google Scholar.

Je vais expliquer dans ce billet comment scraper Google Scholar. Nous allons plus particulièrement utiliser le package R 'rvest' pour scraper le compte GS de mon directeur de thèse. Nous allons récupérer la liste de ses co-auteurs, combien de fois ils sont cités et leurs affiliations.

« rvest, inspiré par des librairies comme Beautiful Soup, facilite le scraping (ou le moissonnage) de données issuées de pages web HTML », indique Hadley Wickham sur le blog RStudio [RStudio est une surcouche graphique pour rendre le logiciel de stats R plus ergonomique, dans la mesure où c’est possible]. Comme rvest est conçu pour fonctionner avec magrittr, il est possible d’élaborer des opérations complexes comme des pipelines [chaînes de transformation] élégants composés de bouts de code simples et faciles à comprendre.

Packages à charger : il faut aussi récupérer ggplot2 pour générer les graphiques

library(rvest)
library(ggplot2)

Combien de fois ses articles ont-ils été cités ?

On va utiliser SelectorGadget [bookmarklet ou extension] pour déterminer quelle est la classe CSS permettant de récupérer la colonne « cited by ». [On peut aussi faire un clic droit sur une des valeurs de la colonne « Cited by », puis cliquer dans le menu contextuel sur « Examiner l’élément » et constater que les valeurs sont dans une balise <a class="gsc_a_ac"/>, toutes à l’intérieur d’un tableau ayant pour identifiant  gsc_a_b]

page <- read_html("https://scholar.google.com/citations?user=sTR9SIQAAAAJ&hl=en&oi=ao")

[Cela stocke le contenu de cette page dans la variable page.]

On spécifie le sélecteur CSS [gsc_a_ac] avec html_nodes() et on extrait le texte avec html_text(). Enfin, on convertit la chaîne de caractères pour indiquer que c’est un nombre avec as.numeric().

citations <- page %>% html_nodes ("#gsc_a_b .gsc_a_c") %>% html_text()%>%as.numeric()

La variable citations contient donc la liste des valeurs de la colonne « Cited by » :

citations 
148 96 79 64 57 57 57 55 52 50 48 37 34 33 30 28 26 25 23 22 

Créons un histogramme avec le nombre des citations :

barplot(citations, main="How many times has each paper been cited?", ylab='Number of citations', col="skyblue", xlab="")

Voici le graphique :

Co-auteurs, avec leurs affiliations et le nombre de fois où ils ont été cités

Mon directeur de thèse Ben Zaitchik est un chercheur vraiment avis. Non seulement il a toute l’habileté nécessaire pour constituer un réseau et collaborer avec d’autres chercheurs, mais il fait aussi preuve d’intelligence et de patience. Voyons donc à présent ses co-auteurs, leurs affiliations et le nombre de fois où ils ont été cités :

D’abord, comme tout à l’heure, on va utiliser SelectorGadget pour identifier le sélecteur CSS correspondant aux co-auteurs. [On trouve donc que leur nom est contenu dans un lien hypertexte <a>, à l’intérieur d’une balise <h3 class="gsc_1usr_name"> (titre de niveau 3).

  1. On stocke le contenu de la page web contenant cette liste dans une variable page
  2. On crée une variable Coauthors qui extrait de la variable page les chaînes de caractères définis grâce au sélecteur CSS
  3. On convertit cette variable en data.frame (objet qui correspond grosso modo à un tableau, dans R)]
page <- read_html("https://scholar.google.com/citations?view_op=list_colleagues&hl=fr&user=sTR9SIQAAAAJ")
Coauthors = page%>% html_nodes(css=".gsc_1usr_name a") %>% html_text()
Coauthors = as.data.frame(Coauthors)
names(Coauthors)='Coauthors'

Explorons maintenant cette liste de co-auteurs.
[La fonction head() permet de n’afficher que les premiers résultats d’une liste ou d’un data.frame. La fonction dim() donne les dimensions (ici, le nombre de lignes et le nombre de colonnes) du data.frame.]

head(Coauthors) 
                  Coauthors
1               Jason Evans
2             Mutlu Ozdogan
3            Rasmus Houborg
4          M. Tugrul Yilmaz
5 Joseph A. Santanello, Jr.
6              Seth Guikema

dim(Coauthors) 
[1] 27  1

Bref, à l’heure actuelle il a publié avec 27 autres chercheurs.

Combien de fois ses co-auteurs ont-ils été cités ?

page <- read_html("https://scholar.google.com/citations?view_op=list_colleagues&hl=en&user=sTR9SIQAAAAJ")
citations = page%>% html_nodes(css = ".gsc_1usr_cby")%>%html_text()

citations 
 [1] "Cited by 2231"  "Cited by 1273"  "Cited by 816"   "Cited by 395"   "Cited by 652"   "Cited by 1531" 
 [7] "Cited by 674"   "Cited by 467"   "Cited by 7967"  "Cited by 3968"  "Cited by 2603"  "Cited by 3468" 
[13] "Cited by 3175"  "Cited by 121"   "Cited by 32"    "Cited by 469"   "Cited by 50"    "Cited by 11"   
[19] "Cited by 1187"  "Cited by 1450"  "Cited by 12407" "Cited by 1939"  "Cited by 9"     "Cited by 706"  
[25] "Cited by 336"   "Cited by 186"   "Cited by 192" 

On ne va garder  dans citations que la valeur numérique indiquée après la chaîne de caractères « Cited by  » (en supprimant si nécessaire les signes de ponctuation, car certains nombres sont suivis du caractère *).

citations = gsub('Cited by','', citations)
citations <- gsub("[[:punct:]]", "", citations)

[vérifions le résultat]

citations
 [1] " 2231"  " 1273"  " 816"   " 395"   " 652"   " 1531"  " 674"   " 467"   " 7967"  " 3968"  " 2603"  " 3468"  " 3175" 
[14] " 121"   " 32"    " 469"   " 50"    " 11"    " 1187"  " 1450"  " 12407" " 1939"  " 9"     " 706"   " 336"   " 186"  
[27] " 192"  

Convertissons le contenu de cette variable en nombres puis en data.frame pour faciliter leur exploitation avec ggplot2

citations = as.numeric(citations)
citations = as.data.frame(citations)

Affiliation des co-auteurs

[Création d’une variable affiliation sur le même modèle que précédemment]

page <- read_html("https://scholar.google.com/citations?view_op=list_colleagues&hl=en&user=sTR9SIQAAAAJ")
affilation = page %>% html_nodes(css = ".gsc_1usr_aff")%>%html_text()
affilation = as.data.frame(affilation)
names(affilation)='Affilation'

A présent, créons un data.frame qui regroupe la liste des co-auteurs, du nombre de citations et de leurs affiliations. [cbind() va mettre côte à côte les 3 variables déjà définies plus haut : Coauthors, citations et affiliation]

cauthors=cbind(Coauthors, citations, affilation)

cauthors 
                             Coauthors citations                                                                                  Affilation
1                          Jason Evans      2231                                                               University of New South Wales
2                        Mutlu Ozdogan      1273    Assistant Professor of Environmental Science and Forest Ecology, University of Wisconsin
3                       Rasmus Houborg       816                    Research Scientist at King Abdullah University of Science and Technology
4                     M. Tugrul Yilmaz       395 Assistant Professor, Civil Engineering Department, Middle East Technical University, Turkey
5            Joseph A. Santanello, Jr.       652                                                  NASA-GSFC Hydrological Sciences Laboratory
.....

Retrions les co-auteurs sur le critère du nombre de citations

Ceci afin de produire un graphique par ordre décroissant :

cauthors$Coauthors <- factor(cauthors$Coauthors, levels = cauthors$Coauthors[order(cauthors$citations, decreasing=F)])

ggplot(cauthors,aes(Coauthors,citations))+geom_bar(stat="identity", fill="#ff8c1a",size=5)+
theme(axis.title.y   = element_blank())+ylab("# of citations")+
theme(plot.title=element_text(size = 18,colour="blue"), axis.text.y = element_text(colour="grey20",size=12))+
              ggtitle('Citations of his coauthors')+coord_flip()

Voilà le résultat

Il a publié avec des scientifiques qui ont été cités plus de 12.000 fois, et avec des étudiants comme moi qui démarrent.

En résumé

Dans ce billet, nous avons vu comment scraper Google Scholar. Nous avons scrapé la page concernant mon directeur de thèse et récupéré des données concernant les citations de ses articles et ses co-auteurs avec leurs affiliations et le nombre de fois où eux-mêmes ont été cités.

Comme nous l’avons vu dans ce billet, il est très simple de scraper le contenu d’une page HTML en utilisant le package R rvest. Il est aussi important de noter que SelectorGadget est très pratique pour identifier le sélecteur CSS qui correspond aux données qui nous intéressent.

Mise à jour : Mon directeur de thèse m’a signalé qu’il n’y a dans Google Scholar qu’une minorité de ses co-auteurs. Certains scientifiques qui ont publié avec lui et que mon directeur se serait attendu à voir être le plus cités n’apparaissent pas. En outre, les résultats pour certains de ceux qui apparaissent sont incohérents (par exemple, des seniors qui ont plus de publications, ont d’après Google Scholar moins de citations que leurs cadets). Bref, les données de Google Scholar doivent être utilisées avec précaution.

Advertisements
%d blogueurs aiment cette page :