Extraire des données d’une page web avec R – 1 – Les Tableaux

Internet est une source inépuisable d’information et de données. Malheureusement, la plupart du temps, les données ne sont pas contenues dans un fichier que vous pouvez utiliser directement pour faire de l’analyse statistique, mais elles sont directement incrustées dans une page web.

Lorsque le volume de données n’est pas trop important, il est possible de créer un fichier et d’y recopier “à la main” (ie. à grand renfort de copier-coller) les données présentes sur la page web. Mais si la quantité de données est trop importante où si celles-ci sont disséminées sur un grand nombre de pages, cette méthode n’est pas pertinente.

Ce petit tutoriel a pour ambition d’expliquer comment extraire de telles données à l’aide du logiciel R et de montrer quelques opérations courantes de traitement des données pour les rendre exploitables.

Le tutoriel est composé de trois parties :

  1. Données sous forme de tableau
  2. Données structurées
  3. Données sur plusieurs pages

Tout ce qui suit nécessite le package “XML”. Si vous ne l’avez pas installé, vous pouvez le faire avec la commande suivante :

Données sous forme de tableau

Lorsque les données sont incluses dans une page web sous forme de tableau, il est très simple de les extraire. Il suffit pour cela d’utiliser la fonction “readHTMLTable”. Cette fonction prend en argument une url et renvoie une liste contenant tous les tableaux présents sur la page indiquée. Il faut noter que des tableaux invisibles sont souvent utilisés pour gérer la mise en forme d’une page web. Cette fonction renvoie donc souvent plus de tableaux que vous n’en voyez sur la page. Parfois même, les tableaux sont imbriqués les uns dans les autres, ce qui peut donner des résultats bizarres.

Imaginons par exemple que nous voulons récupérer le classement de la compétition dont j’ai parlé ici. Le classement est disponible à l’adresse suivante : http://www.kaggle.com/c/RTA/Leaderboard

capture d'écran du classement que l'on voudrait extraire

Pour récupérer ce classement, on utilise la commande suivante :

library(XML)

cla <- readHTMLTable("http://www.kaggle.com/c/RTA/Leaderboard",
                     stringsAsFactors = FALSE)

Le deuxième argument est optionnel et indique à R qu’il doit traiter les textes tels quels et non comme des facteurs.

On vérifie combien de tableaux ont été récupérés à l’aide de la commande :

length(cla)

Ici, il n’y a qu’un seul tableau (ouf !). S’il y en avait plusieurs, une manière efficace de déterminer lequel nous intéresse consiste à regarder les dimensions de chaque tableau à l’aide de la commande :

lapply(cla, dim)

Pour récupérer un tableau en particulier :

cla <- cla[[1]]

Maintenant, regardons les premières lignes du tableau avec la fonction “head” :

head(cla)

R renvoie le résultat suivant :

  #
1 1
2 2
3 3
4 4
5 5
6 6
                                                                                                                                       Team Name
1 Team Irazu\r\n                      * \r\n              \r\n              Jose P. Gonzalez-Brenes\r\n                      Guido Matias Cortes
2                                                                                      Mooma\r\n              \r\n              Sergey Yurgenson
3                                                                                   SuperCow\r\n              \r\n              Alisson Azzolini
4                                                                                         zkolter\r\n              \r\n              Zico Kolter
5                                                                              Apache\r\n              \r\n              Andre Ricardo Goncalves
6                                                                                    Hipoteza\r\n              \r\n              Marcin Pionnier
       RMSE Entries                        Best Submission
1 191.47400      25 5:42 pm, Saturday 12 February 2011 UTC
2 191.83600     134   6:25 pm, Tuesday 8 February 2011 UTC
3 192.23199      16   3:58 pm, Friday 11 February 2011 UTC
4 193.21300       4 10:10 pm, Wednesday 5 January 2011 UTC
5 193.44000       4 1:21 pm, Thursday 10 February 2011 UTC
6 193.56300      49   8:30 pm, Sunday 13 February 2011 UTC

Le contenu de la deuxième colonne est un peu bizarre. En fait, elle contient non seulement le nom de chaque équipe, mais aussi le nom de chaque membre de l’équipe. Grâce à cette information, on pourrait connaitre la taille de chaque équipe. Dans la section suivante, nous présentons quelques opérations de manipulation des chaînes de caractères.

Par ailleurs, la dernière colonne contient des dates et heures, mais pour R, il s’agit seulement d’une chaîne de caractères. Nous verrons donc ensuite comment convertir cette chaîne en date et heure.

Traitement de texte

Lorsqu’on importe du texte dans R, il est très fréquent que l’on ait besoin de le manipuler pour le rendre plus présentable ou bien pour en extraire certaines informations. Par exemple ici, on aimerait avoir dans la seconde colonne seulement le nom de l’équipe et l’on aimerait créer une nouvelle colonne contenant le nombre de membres de chaque équipe.

Si l’on regarde les premières lignes de la deuxième colonne on remarque qu’on a d’abord le nom de l’équipe puis un “\r\n” (cela représente un saut de ligne) puis un blanc puis un nouveau “\r\n” puis le nom du premier membre puis “\r\n” puis le nom du second membre, etc. Pour la première équipe, on a en plus une étoile qui indique que l’équipe a remporté de l’argent.

Pour connaitre le nombre de membres, on utilise la fonction strsplit(x, split) : cette fonction découpe un texte, le découpage se faisant à chaque endroit où se trouve la chaîne de caractère “split”. Dans notre cas, cela donne :

team <- strsplit(cla[ ,2], "\r\n")

Le résultat est une liste avec autant d’éléments que de lignes dans le tableau. Chaque élément est une liste dont le premier élément est le nom de l’équipe, le suivant un blanc, les autres les noms des membres de l’équipe.

Pour connaitre la taille de chaque équipe, il suffit de calculer la longueur de chaque élément puis de lui retrancher 2 (3 pour la première équipe)

membres <- sapply(team, length)
membres <- membres - 2
membres[1] <- membres[1] - 1
head(membres)

[1] 2 1 1 1 1 1

Pour extraire le nom de l’équipe, on prend le premier élément de chaque liste :

equipe <- sapply(team, function(x) x[1])
head(equipe)

[1] "Team Irazu" "Mooma"    "SuperCow"   "zkolter"    "Apache"   "Hipoteza"

Il existe de nombreuses autres fonctions pour manipuler les textes. Voici les principales :

Conversions

Sous R, toutes les conversions se font à l’aide de commandes de type “as.nouvelle_classe”. Par exemple si l’on veut transformer un nombre en texte, on utilise la fonction “as.character”. Au contraire, si l’on veut transformer un texte en nombre, on utilise “as.numeric”, etc.

Ici, on aimerait transformer un texte en date/heure. Pour cela on utilise la fonction as.POSIXlt (POSIXlt est le format de données utilisé par R pour les dates et heures). Cette fonction nécessite un deuxième argument qui décrit comment sont représentées les dates et les heures dans la chaîne de caractère : par exemple, ici on a d’abord un nombre entre 1 et 12 représentant les heures, puis on a deux points, puis un nombre entre 0 et 59 représentant les minutes, puis un espace, puis etc. Pour savoir comment on traduit tout ça en R, tapez la ligne suivante dans la console R et lisez le fichier d’aide :

?strptime

Dans notre cas, le code à utiliser est :

date <- as.POSIXlt(cla[,5], format="%I:%M %p, %A %d %B %Y UTC")
head(date)

[1] "2011-02-12 17:42:00" "2011-02-08 18:25:00" "2011-02-11 15:58:00"
[4] "2011-01-05 22:10:00" "2011-02-10 13:21:00" "2011-02-13 20:30:00"

ATTENTION : si votre logiciel R est en français, alors celui-ci s’attend à lire les noms de jour et de mois en français. Il faut donc préciser qu’ils sont écrits en anglais :

# Sous linux et mac
Sys.setlocale(category="LC_TIME", "en_US")

# Sous windows
Sys.setlocale(category="LC_TIME", "us") # à confirmer

Cette fois, la fonction précédente devrait fonctionner correctement. La nouvelle variable peut par exemple servir d’axe des abscisses dans un graphique pour représenter l’évolution d’une variable. Vous pouvez aussi mesurer la différence de temps entre deux dates ou bien rajouter ou retrancher une certaine durée.

Cette entrée a été publiée dans R. Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>