• Aucun résultat trouvé

Data Science, Séance 4 : Données sur le web + scrapping et API

N/A
N/A
Protected

Academic year: 2022

Partager "Data Science, Séance 4 : Données sur le web + scrapping et API"

Copied!
28
0
0

Texte intégral

(1)

Data Science, Séance 4 : Données sur le web + scrapping et API

Etienne Côme

21 novembre 2019

(2)

Où trouver des données sur le web

instituts publics : insee, ign, . . .

portails open-data : data.iledefrance.fr, data.gouv.fr, . . . sites collaboratifs : wikipedia (dbpedia), openstreetmap, . . . sites specialisés : météo, sports, logement, annonces, . . . réseaux sociaux : twitter, flickR, foursquare, . . .

moteur de recherche : google, yahoo, bing, . . . api spécialisées : velib, . . .

(3)

Où trouver des données sur le web

Jeux de données, déjà mis en forme instituts publics : insee, ign, . . .

portails open-data : data.iledefrance.fr, data.gouv.fr, . . . sites collaboratifs : wikipedia (dbpedia), openstreetmap

(4)

Où trouver des données sur le web

Jeux de données à mettre en forme Scrapping

sites specialisés : météo, sports, logement, annonces, . . . API

sites collaboratifs : openstreetmap, . . .

réseaux sociaux : twitter, flickR, foursquare, . . . moteur de recherche : google, yahoo, bing, . . . api spécialisées : velib, . . .

(5)

Scrapping

Extraire des informations spécifiques d’une ou plusieurs pages web

en vu de constituer un jeu de données

(6)

Scrapping, le html

(7)

Scrapping, les package RCurl et XML

RCurl (Client URL Request Library)

le web en ligne de commande : get, post, https, ftp, . . . XML

htmlTreeParse, getNodeSet :

(8)

Scrapping, les package RCurl et XML

Xpath, extraire des informations d’un arbre DOM

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

(9)

Scrapping, les package RCurl et XML

Xpath, extraire des informations d’un arbre DOM

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

(10)

Library

library(XML) library(RCurl) library(dplyr)

##

## 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

library(rjson) library(httr)

(11)

Scrapper stackoverflow.com

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.

(12)

# 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),]

(13)

date = format(Sys.time(), "%d/%m/%Y")

title=paste("Popularité sur stackOverFlow",date) barplot(stackOF$questions,

names.arg=stackOF$lang,

main=title,ylab="Nombre de questions")

(14)

Scrapper stackOverFlow

python r matlab ggplot2 sas

Popularité sur stackOverFlow 31/03/2020

Nombre de questions 02000004000006000008000001200000

(15)

Scrapper leboncoin.fr

Ecrire un script R permettant de scrapper le nombre d’annonce de particulier du site dans la catégorie “Jardinage” en région centre.

(16)

Scrapper les résultats de ligue 1

Récupérer les dix dernières années de résultats du championnat de france

(17)

Scrapper les résultats de ligue 1

# récupérer la page et la parser year = 2018

url_b ="http://www.footballstats.fr/resultat-ligue1-"

res = getURL(paste(url_b,year,".html",sep='')) resp = htmlTreeParse(res,useInternal=T)

# récupérer le bon tableau de la page rest = readHTMLTable(resp)[[2]]

(18)

Scrapper les résultats de ligue 1

# 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,])

(19)

Scrapper les résultats de ligue 1

# 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)

(20)

Scrapper les résultats de ligue 1

# faire un graphique

ti = paste("Ligue 1, Saison",year) xl = "Buts marqués"

yl = "Buts encaissés"

plot(res$A,res$D,xlab=xl,ylab=yl,col="white",main=ti) text(res$A,res$D,res$locaux,cex=res$affdom/20000)

(21)

Scrapper les résultats de ligue 1

40 60 80 100

3040506070

Ligue 1, Saison 2018

Buts marqués

Buts encaissés

MONACO

PARIS−SG LYON

METZ

MONTPELLIER TROYES

ST−ETIENNE LILLE

MARSEILLE

ANGERS NICE

RENNES NANTES

TOULOUSE CAEN

BORDEAUX

AMIENS

STRASBOURG

DIJON

GUINGAMP

(22)

API Application Programming Interface

(23)

Vélib’ et altitude des stations

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.

(24)

Vélib’ et 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)

(25)

Vélib’ et altitude des stations

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}) }

(26)

Vélib’ et altitude des stations

# 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"

stations$loading = stations$mnbikes/stations$nbdocks ti = "Effet de l'altitude sur la charge des stations"

yl = "Indicateur de charge moyenne"

xl = "Altitude (m)"

plot(stations$alt,stations$loading,xlab=xl,ylab=yl,main=ti)

(27)

Vélib’ et altitude des stations

180 200 220 240 260 280 300

0.00.20.40.60.81.01.21.4

Effet de l'altitude sur la charge des stations

Altitude (m)

Indicateur de charge moyenne

(28)

API suite

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.

Références

Documents relatifs

Les clous de girofle, pimenta dioica , sont les bourgeons séchés, non éclos, du giroflier et sont parmi les plus anciennes épices et drogues décrites dans l'histoire..

Si aucune licence API n'est appliquée mais que vous disposez déjà du fichier .lic, vous pouvez installer votre licence en cliquant sur le bouton Installer une licence, vous

2 Malgré le premier alinéa, il peut les conserver sous réfrigération pour au plus 14 jours suivant la mort de l’animal ou sous congélation pour au plus 240 jours suivant cette

display : inline ; dans le flux du texte (le bloc se comporte comme un <span> ) display : block ; en dessous dans la ligne (le bloc se comporte comme <div> ) display

Récupérer, mélanger, enrichir, filtrer, nettoyer, vérifier, formater, transformer des données.. Mettre en œuvre une méthode un modèle (ML/Stats) Arbre de décision,

support natif des valeur manquantes programation objet.. éco-système vivant : beaucoup

Faire une carte représentant le prénoms masculin le plus fréquement donnés aux enfants nés en 2005 pour l’ensemble des

● À écrire dans un fichier lieux.txt (un par ligne). Attraction Page