L’objectif de ce tutoriel est de créer une liste des outils (essentiellement packages R) développés par un groupe de personnes à partir de leurs adresses email ou identifiants en récupérant les informations automatiquement par requêtage web.
Le web scraping (parfois appelé harvesting) est une technique d’extraction du contenu de sites Web, via un script ou un programme, dans le but de le transformer pour permettre son utilisation dans un autre contexte. (source : https://fr.wikipedia.org/wiki/Web_scraping)
Le package {{httr}}
permet de travailler avec des URLs
et HTTP (https://httr.r-lib.org/). Il permet d’écrire des
requêtes web avec la fonction GET()
et retourne un objet
json à inspecter et retravailler. Il peut être utiliser en lien avec le
package {{curl}}
(https://jeroen.cran.dev/curl/) et
{{jsonlite}}
(https://cran.r-project.org/web/packages/jsonlite/). Ce
dernier est utile pour manipuler les objets liste json souvent
complexes.
Le text mining consiste à structurer du texte pour en sortir du
contenu. Des techniques sont implémentées sous R dans le package
{{tidytext}}
.
Notre objectif est d’établir une liste de packages R développés par un groupe de personnes défini à partir de dépôts R ou git.
Pour les packages Bioconductor, on utilisera le package
{{BiocPkgTools}}
et pour ceux du CRAN la fonction
tools::CRAN_package_db()
:
<- c("andrea.rau@inrae.fr",
emails_int "nathalie.vialaneix@inrae.fr")
# browse CRAN
<- tools::CRAN_package_db()
cran_db <- purrr::map (emails_int, function(x) grep(x, cran_db$`Authors@R`))
cran_int <- cran_db[unique(unlist(cran_int)),] pkgs_cran
On peut ainsi récupérer la liste des packages et les métadonnées associées des auteurs pour lesquels nous avons mentionné le courriel, quelque soit leur rôle.
<- BiocPkgTools::biocPkgList()
bpi <- purrr::map (emails_int, function(x) grep(x, bpi$`Maintainer`))
bpi_int <- bpi[unique(unlist(bpi_int)),] pkgs_bioc
Pour Bioconductor, on ne peut récupérer que les packages pour lesquels l’adresse email du mainteneur fait partie de la liste d’emails recherchées.
Autres dépôts :
= "http://www.omegahat.net/R" repos
<- httr::GET("https://ropensci.org/packages/all/")
rop http_type(rop)
<- httr::content(rop, "text") rop_content
L’objectif est de récupérer pour un utilisateur donné la liste de ses dépots github (publics) puis de faire un tri sur ceux écrits en langage R.
On utilise pour cela l’ API github permettant d’écrire des requêtes web: https://docs.github.com/en/rest.
Petit défaut, la requête web demande de connaitre l’identifiant github moins pratique que l’adresse email plus standardisée.
# recuperation des repositories (publics) github d'un utilisateur
<- httr::GET("https://api.github.com/users/andreamrau/repos")
ghrepos
# type de l'objet récupéré: une liste json
::http_type(ghrepos) httr
## [1] "application/json"
# status de la requête (réussi ou pas)
::http_status(ghrepos) httr
## $category
## [1] "Success"
##
## $reason
## [1] "OK"
##
## $message
## [1] "Success: (200) OK"
# nombre de repos récupérés
<-length(httr::content(ghrepos))
lg_repo lg_repo
## [1] 29
# nom de chaque repo + langage utilisé
for (i in seq(1,lg_repo)){
print(httr::content(ghrepos)[[i]]$name)
print(httr::content(ghrepos)[[i]]$language)
}
## [1] "2022_DIGIT-BIO_workshop"
## [1] "R"
## [1] "andrea"
## [1] "HTML"
## [1] "andreamrau.github.io"
## [1] "HTML"
## [1] "bayesR"
## NULL
## [1] "BayesR_Simulations"
## NULL
## [1] "blogdown_source"
## [1] "HTML"
## [1] "clustree"
## [1] "R"
## [1] "COOLKIT"
## NULL
## [1] "coseq"
## [1] "R"
## [1] "CV"
## [1] "TeX"
## [1] "ebdbNet"
## [1] "C"
## [1] "EDGE-in-TCGA"
## [1] "R"
## [1] "FirebrowseR"
## [1] "R"
## [1] "GBNcausal"
## [1] "R"
## [1] "HTSCluster"
## [1] "R"
## [1] "HTSFilter"
## [1] "R"
## [1] "maskmeans"
## [1] "R"
## [1] "miscR"
## [1] "R"
## [1] "OpticRegen_2019"
## [1] "R"
## [1] "padma"
## [1] "R"
## [1] "RIFplus"
## [1] "Fortran"
## [1] "RMFRJLA_2019"
## [1] "R"
## [1] "rnaseq_tutorial"
## [1] "R"
## [1] "rosetta"
## [1] "R"
## [1] "rpkg-min"
## [1] "R"
## [1] "rpl"
## [1] "R"
## [1] "shinyGEO"
## [1] "CSS"
## [1] "tidyqtldb"
## [1] "R"
## [1] "tp-rgcca"
## [1] "TeX"
# Possibilité de faire un tri sur les dépots contenant du R et de récupérer
# la description et d'autres informations
# Exemple sur 1 depot contenant du R, recherche du fichier DESCRIPTION
# Si on trouve ce fichier dans un depot contenant du langage R,
# c'est que c'est un package (à automatiser)
<-httr::GET("https://api.github.com/repos/andreamrau/padma/contents/")
onerepo
grep("DESCRIPTION",httr::content(onerepo))
## [1] 2
A noter que Ropensci impose que les packages déposés chez eux, un fois approuvés, aient un depot sur leur profil github. Il est donc possible de parcourir, par une requête web, tous les fichiers DESCRIPTION des depots github de Ropensci à la recherche des emails utilisateurs:
# Récupérer les noms des depots github de ropensci
<- httr::GET("https://api.github.com/users/ropensci/repos")
ghrepos # créer un vecteur contenant les noms de tous les depots
<-list()
opnamefor (i in seq(1,length(httr::content(ghrepos)))){
<-httr::content(ghrepos)[[i]]$name
opname[[i]]
}
# Rechercher un pattern dans chaque fichier DESCRIPTION
# utiliser grep()
# parcourir le vecteur des noms de depots
# + GET() sur le contenu des fichiers DESCRIPTION
#test<-GET(paste0("https://raw.githubusercontent.com/ropensci/",
# opname[[3]],
# "/master/DESCRIPTION")
<-purrr::map(opname,function(x)
ldesccontent(
GET(paste0("https://raw.githubusercontent.com/ropensci/",
x,"/master/DESCRIPTION"))))
<- c("andrea.rau@inrae.fr",
emails_int "nathalie.vialaneix@inrae.fr",
"camille.piponiot@gmail.com")
<- purrr::map (emails_int, function(x) grep(x, ldesc)) resgrep
Avec l’instance gitlab de la forgemia, c’est un peu plus compliqué. Il faudrait créer un token d’authentification pour pouvoir faire des requêtes sur l’API gitlab.
La démarche est néanmoins la même: https://docs.gitlab.com/ee/api/api_resources.html
Le préfixe des requêtes est
https://forgemia.inra.fr/api/v4/
.