api spécialisées : velib, …
<!DOCTYPE html>
<head><meta charset="utf-8"></head>
<body>
<section style="padding-top:6em;text-align:center">
<h1 class="purple"> Scrapping </h1>
<h4 class="purple">Extraire des informations spécifiques</h4>
<h4 class="purple">d'une ou plusieurs pages web</h4>
<h4 class="purple">en vu de constituer un jeu de données</h4>
</section>
</body>
</html>
library(RCurl)
# récupérer la page
res = getURL("http://www...")
# parse du html
resp = htmlTreeParse(res,useInternal=T)
# fonction de haut niveau pour récupérer les tableaux
rest = readHTMLTable(resp)
# récupérer un noeud désiré (xpath)
node = getNodeSet(resp, '//nav/ul/')
Syntaxe pour se promener dans l’abre dom et en extraire des partie (noeuds, attributs, …), plus détails sur w3schools.
Expression | Description |
---|---|
nodename | Selects all nodes with the name “nodename” |
/ | Selects from the root node |
// | Selects nodes in the document from the current node that match the selection |
. | Selects the current node |
.. | Selects the parent of the current node |
@ | Selects attributes |
Syntaxe pour se promener dans l’abre dom et en extraire des partie (noeuds, attributs, …), plus détails sur w3schools.
Expression | Description |
---|---|
/bookstore/book[1] | Selects the first book element that is the child of the bookstore element. |
//title[@lang] | Selects all the title elements that have an attribute named |
//title[@lang='en'] | Selects all the title elements that have an attribute named lang with a value of ‘en’ |
/bookstore/book[price>35.00] | Selects all the book elements of the bookstore element that have a price > 35.00 |
## Loading required package: bitops
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Ecrire un script R permettant de scrapper le nombre de question publier sur les sites ayant les tags : ‘python’,‘julia-lang’,‘r’,‘sas’,‘matlab’,‘ggplot2’ et ‘d3.js’. Réaliser un graphique à partir de ces données.
# definition des termes à scrapper
languages=c('python','r','sas','matlab','ggplot2')
# initialisation de la table
stackOF=data.frame(lang=languages,questions=NA)
# boucle sur les termes
for(i in 1:length(languages)){
# récupérer la page
base = "https://stackoverflow.com/questions/tagged/"
res = getURL(paste(base,stackOF[i,'lang'],sep=''))
# la parser et récupérer le noeud désiré (xpath)
resp = htmlTreeParse(res,useInternal=T)
ns1 = getNodeSet(resp, "//*[@id='mainbar']/div[4]/div/div[1]")
# récupérer la valeure et la nettoyer
val = xmlValue(ns1[[1]])
valclean = gsub("questions","",val);
valclean = gsub("[ ,\n,\r]","",valclean)
stackOF[i,'questions'] = as.numeric(valclean)
}
# faire un graphique
stackOF=stackOF[order(stackOF$questions,decreasing=T),]
Ecrire un script R permettant de scrapper le nombre d’annonce de particulier du site dans la catégorie “Jardinage” en région centre.
Récupérer les dix dernières années de résultats du championnat de france
# le remettre légèrement en forme
rest = rest[!is.na(rest[,2]),1:4]
names(rest) = c('locaux', 'visiteur','resultat','affluence')
rest$locaux=factor(as.character(rest$locaux),
levels=unique(rest$locaux))
rest$affluence=as.numeric(as.character(rest$affluence))
rest$visiteurs=factor(as.character(rest$visiteur),
levels=unique(rest$locaux))
resm=matrix(unlist(strsplit(as.character(rest$resultat),'-')),2)
rest$resultat.locaux=as.numeric(resm[1,])
rest$resultat.visiteurs=as.numeric(resm[2,])
# remise en forme et calcul des totaux de buts marqués / encaissés
resdom = rest %>% group_by(locaux) %>%
summarise(Abutdom=sum(resultat.locaux),
Dbutdom=sum(resultat.visiteurs),
affdom=mean(affluence,na.rm=TRUE))
resext = rest %>% group_by(visiteur) %>%
summarise(Abutext=sum(resultat.visiteurs),
Dbutext=sum(resultat.locaux),
affext=mean(affluence,na.rm=TRUE))
res = resdom %>% left_join(resext,by=c("locaux"="visiteur")) %>%
mutate(D=Dbutdom+Dbutext,A=Abutdom+Abutext)
Utiliser les fichiers http://vlsstats.ifsttar.fr/data/input_Lyon.json et http://vlsstats.ifsttar.fr/data/spatiotemporalstats_Paris.json ainsi que l’api elevation-api.io pour calculer un indicateur de charge moyenne des stations Vélib’ et mettre celui-ci en relation avec l’altitude des stations.
Localisation des stations
# récupérer la liste des stations et la mettre en forme
url="http://vlsstats.ifsttar.fr/data/input_Lyon.json"
stationsList=fromJSON(file=url)
data=sapply(stationsList,function(x){
c(x$number,x$name,x$address,
x$bike_stands,x$position$lat,x$position$lng)
})
stations=data.frame(id=as.numeric(data[1,]),name=data[2,],
adresse=data[3,], nbdocks=as.numeric(data[4,]),
lat=as.numeric(data[5,]),long=as.numeric(data[6,]),alt=NA)
API elevation
chunk_size = 10
# récupérer les altitudes
base = "https://elevation-api.io/api/elevation?points="
for (i in 1:ceiling(nrow(stations)/chunk_size)){
system("sleep 0.5")
print(i)
iv = ((i-1)*chunk_size+1):min((i*chunk_size),dim(stations)[1])
latlong = paste0("(",stations[iv,'lat'],",",stations[iv,'long'],")")
query = paste(latlong,collapse=',')
url = paste(base,query,sep="")
res = fromJSON(file=url)
stations$alt[iv]=sapply(res$elevations,function(x){x$elevation})
}
# calculer l'indice de charge moyenne
url = "http://vlsstats.ifsttar.fr/data/spatiotemporalstats_Lyon.json"
stationsData = fromJSON(file=url)
res = sapply(stationsData,function(x){
c(x$'_id', mean(x$available_bikes))})
res = data.frame(t(res),row.names = NULL)
names(res) = c('id','mnbikes')
stations = stations%>% left_join(res)
FALSE Joining, by = "id"
Ecrire une fonction permettant de récupérer le nombre de fan d’un artiste en utilisant l’api deezer.
vous vous servirez de la fonction search et de la fonction artist de cette API.