1 Introduction

Lors que vous voulez récupérer certaines données sur internet, vous pouvez faire le traditionnel copier-coller. Mais comme les textes ou les données numériques se retrouvent souvent dans le désordre, et vous devez alors faire du temps pour nettoyer. De plus, il peut y avoir une quantité importante de page à copier-coller. Pour faciliter cette étape de contruction de base de données venant d’un site internet, des techniques de web-scraping exitent pour automatiser la tâche.

R dispose de nombreux packages pour lire et analyser du code html, voici un guide pour les débutants.

2 Préliminaire

2.1 Structure d’un site web

Avant de commencer le scraping, il faut avoir quelques notions de base concernant la structure d’un site web. Pour cela, vous pouvez utiliser l’inspecteur d’un navigateur, par exemple Chrome :

  • Sur n’importe quelle page web, vous faites un clic droit, et vous cliquez sur “Inspecter”.
  • Vous verrez dans la console la structure du code html, css, etc.
  • Pour inspecter un élément spécifique, vous pourrez cliquer directement sur celui-ci et faire “inspecter”.
  • Ainsi vous verrez que les données sont bien structurées, avec les balises comme header, body, div, span, a, h1, etc.
  • Pour différencier ces balises et leur donner des fonctionnalités, vous verrez qu’elles peuvent avoir des classes, id, href, etc.

Vous pourrez essayer directement sur le site suivant, avec l’idée de récupérer les liens qui permettent d’accéder aux pages des différentes villes :

2.2 Principe du web-scraping

L’idée de base du scraping, c’est donc :

  • Je récupère l’ensemble des informations (code source) de la page web à l’aide d’un lien URL.
  • Je récupère ensuite les éléments qui m’intéressent dans les balises spécifiques. Programme principal

Avec R, les packages pour la lecture des url, le téléchargement et l’analyse du code source existent déjà :

Les tutoriels peuvent se trouver très facilement sur internet, rvest,xml, et xml 2.

3 Programme de base

3.1 Listes de points géographiques

Un exemple simple peut être de récupérer la liste des données villes sur le site de McDonald’s.

Liste des villes

Si vous allez sur le site de McDonald’s France, vous pouvez voir qu’il y a une liste des villes, on peut d’abord récupérer cette liste.

##  [1] "ain-01"                     "aisne-02"                  
##  [3] "allier-03"                  "alpes-de-haute-provence-04"
##  [5] "hautes-alpes-05"            "alpes-maritimes-06"        
##  [7] "ardeche-07"                 "ardennes-08"               
##  [9] "ariege-09"                  "aube-10"                   
## [11] "aude-11"                    "aveyron-12"                
## [13] "bouches-du-rhone-13"        "calvados-14"               
## [15] "cantal-15"                  "charente-16"               
## [17] "charente-maritime-17"       "cher-18"                   
## [19] "correze-19"                 "cote-d-or-21"              
## [21] "cotes-d-armor-22"           "creuse-23"                 
## [23] "dordogne-24"                "doubs-25"                  
## [25] "drome-26"                   "eure-27"                   
## [27] "eure-et-loir-28"            "finistere-29"              
## [29] "gard-30"                    "haute-garonne-31"          
## [31] "gers-32"                    "gironde-33"                
## [33] "herault-34"                 "ille-et-vilaine-35"        
## [35] "indre-36"                   "indre-et-loire-37"         
## [37] "isere-38"                   "jura-39"                   
## [39] "landes-40"                  "loir-et-cher-41"           
## [41] "loire-42"                   "haute-loire-43"            
## [43] "loire-atlantique-44"        "loiret-45"                 
## [45] "lot-46"                     "lot-et-garonne-47"         
## [47] "lozere-48"                  "maine-et-loire-49"         
## [49] "manche-50"                  "marne-51"                  
## [51] "haute-marne-52"             "mayenne-53"                
## [53] "meurthe-et-moselle-54"      "meuse-55"                  
## [55] "morbihan-56"                "moselle-57"                
## [57] "nievre-58"                  "nord-59"                   
## [59] "oise-60"                    "orne-61"                   
## [61] "pas-de-calais-62"           "puy-de-dome-63"            
## [63] "pyrenees-atlantiques-64"    "hautes-pyrenees-65"        
## [65] "pyrenees-orientales-66"     "bas-rhin-67"               
## [67] "haut-rhin-68"               "rhone-69"                  
## [69] "haute-saone-70"             "saone-et-loire-71"         
## [71] "sarthe-72"                  "savoie-73"                 
## [73] "haute-savoie-74"            "paris-75"                  
## [75] "seine-maritime-76"          "seine-et-marne-77"         
## [77] "yvelines-78"                "deux-sevres-79"            
## [79] "somme-80"                   "tarn-81"                   
## [81] "tarn-et-garonne-82"         "var-83"                    
## [83] "vaucluse-84"                "vendee-85"                 
## [85] "vienne-86"                  "haute-vienne-87"           
## [87] "vosges-88"                  "yonne-89"                  
## [89] "territoire-de-belfort-90"   "essonne-91"                
## [91] "hauts-de-seine-92"          "seine-st-denis-93"         
## [93] "val-de-marne-94"            "val-d-oise-95"             
## [95] "marseille_13"               "lyon_69"                   
## [97] "paris_75"

Boucle pour les adresses

Ensuite, il faut aller dans chaque ville et récupérer les adresses.

On peut enfin visualiser les adresses de tous les McDonald’s en France et faire d’autres analyses sur ces adresses

3.2 Tableau de données

L’exemple ici est le site infoclimat

## [[1]]
##    Heure Temps Température Biométéo     Pluie Humidité Pt. de rosée
## 1  00h30    NA      6.3 °C      4.6                80%       3.1 °C
## 2  00h00    NA      6.2 °C      4.9   0 mm/1h      80%         3 °C
## 3  23h30    NA      6.0 °C      4.7                78%       2.5 °C
## 4  23h00    NA      5.9 °C      4.6   0 mm/1h      76%         2 °C
## 5  22h30    NA      6.2 °C      4.1                72%       1.5 °C
## 6  22h00    NA      6.5 °C      4.8   0 mm/1h      67%       0.8 °C
## 7  21h30    NA      6.4 °C      5.2                67%       0.8 °C
## 8  21h00    NA      6.3 °C      4.2   0 mm/1h      69%       1.1 °C
## 9  20h30    NA      6.4 °C      4.3                70%       1.3 °C
## 10 20h00    NA      6.5 °C      5.3   0 mm/1h      73%         2 °C
## 11 19h30    NA      6.4 °C      3.7                74%       2.1 °C
## 12 19h00    NA      6.1 °C      3.7 0.2 mm/1h      76%       2.1 °C
## 13 18h30    NA      5.9 °C      3.1                78%       2.4 °C
## 14 18h00    NA      5.4 °C      2.3   0 mm/1h      80%       2.3 °C
## 15 17h30    NA      5.0 °C      2.0   1.2mm/h      83%       2.4 °C
## 16 17h00    NA      3.2 °C      1.5 2.8 mm/1h      89%       1.5 °C
## 17 16h30    NA      3.2 °C     -1.7    37mm/h      84%       0.7 °C
## 18 16h00    NA      9.8 °C      7.6   0 mm/1h      54%       0.9 °C
## 19 15h30    NA     10.2 °C       NA                51%       0.5 °C
## 20 15h00    NA     10.7 °C       NA   0 mm/1h      52%       1.2 °C
## 21 14h30    NA     10.3 °C       NA                54%       1.4 °C
## 22 14h00    NA     10.2 °C       NA   0 mm/1h      53%       1.1 °C
## 23 13h30    NA     10.6 °C       NA                52%       1.1 °C
## 24 13h00    NA     10.4 °C       NA   0 mm/1h      55%       1.8 °C
## 25 12h30    NA      9.8 °C      7.8                55%       1.2 °C
## 26 12h00    NA      9.2 °C      7.1 0.2 mm/1h      61%         2 °C
## 27 11h30    NA      8.6 °C      5.8                65%       2.4 °C
## 28 11h00    NA      8.5 °C      6.3   0 mm/1h      66%       2.5 °C
## 29 10h30    NA      8.3 °C      6.3                66%       2.3 °C
## 30 10h00    NA      7.9 °C      6.1   0 mm/1h      66%         2 °C
## 31 09h30    NA      7.8 °C      5.4                67%         2 °C
## 32 09h00    NA      8.0 °C      6.2 0.2 mm/1h      75%       3.8 °C
## 33 08h30    NA      8.1 °C      6.1                73%       3.5 °C
## 34 08h00    NA      8.7 °C      7.1   0 mm/1h      73%       4.1 °C
## 35 07h30    NA      9.2 °C      7.4                76%       5.2 °C
## 36 07h00    NA      9.4 °C      7.9   0 mm/1h      75%       5.2 °C
## 37 06h30    NA      9.4 °C      8.2                76%       5.4 °C
## 38 06h00    NA      9.7 °C      8.6   0 mm/1h      77%       5.9 °C
## 39 05h30    NA      9.9 °C      8.8                81%       6.8 °C
## 40 05h00    NA     10.2 °C       NA 0.2 mm/1h      85%       7.8 °C
## 41 04h30    NA     10.4 °C       NA                86%       8.2 °C
## 42 04h00    NA     10.4 °C       NA   0 mm/1h      88%       8.5 °C
## 43 03h30    NA     10.6 °C       NA                89%       8.8 °C
## 44 03h00    NA     10.7 °C       NA   0 mm/1h      88%       8.8 °C
## 45 02h30    NA     10.6 °C       NA                88%       8.7 °C
## 46 02h00    NA     10.6 °C       NA 0.2 mm/1h      88%       8.7 °C
## 47 01h30    NA     10.6 °C       NA                88%       8.7 °C
## 48 01h00    NA     10.9 °C       NA   0 mm/1h      87%       8.8 °C
##    Vent moyen (raf.)   Pression
## 1             8 km/h  1004.2hPa
## 2             6 km/h  1004.1hPa
## 3             6 km/h  1004.3hPa
## 4             6 km/h  1004.5hPa
## 5            10 km/h  1004.6hPa
## 6             8 km/h  1004.6hPa
## 7             6 km/h  1004.5hPa
## 8            10 km/h  1004.7hPa
## 9            10 km/h  1004.9hPa
## 10            6 km/h  1004.8hPa
## 11           13 km/h  1004.8hPa
## 12           11 km/h  1004.2hPa
## 13           13 km/h  1004.1hPa
## 14           15 km/h  1003.8hPa
## 15           13 km/h  1003.4hPa
## 16            6 km/h  1003.5hPa
## 17           24 km/h  1004.5hPa
## 18           15 km/h  1002.5hPa
## 19           15 km/h  1002.8hPa
## 20           11 km/h  1003.0hPa
## 21           11 km/h  1003.3hPa
## 22           11 km/h  1004.0hPa
## 23           15 km/h  1004.7hPa
## 24           13 km/h  1005.6hPa
## 25           13 km/h  1005.7hPa
## 26           13 km/h  1006.3hPa
## 27           18 km/h  1006.5hPa
## 28           13 km/h  1006.7hPa
## 29           11 km/h  1006.8hPa
## 30           10 km/h  1006.9hPa
## 31           13 km/h  1006.8hPa
## 32           10 km/h  1007.4hPa
## 33           11 km/h  1007.1hPa
## 34           10 km/h  1007.2hPa
## 35           11 km/h  1007.3hPa
## 36           10 km/h  1007.1hPa
## 37            8 km/h  1007.2hPa
## 38            8 km/h  1007.5hPa
## 39            8 km/h  1007.7hPa
## 40           10 km/h  1008.1hPa
## 41           10 km/h  1007.9hPa
## 42            6 km/h  1008.2hPa
## 43            6 km/h 1008.7hPa=
## 44            6 km/h 1009.1hPa=
## 45            6 km/h 1009.8hPa=
## 46            8 km/h 1010.3hPa=
## 47            8 km/h 1010.7hPa=
## 48            8 km/h 1011.0hPa=

4 Télécharger la page web

Une solution rapide est de télécharger manuellement la page web, et ensuite vous faites la même chose en parsant le fichier html en local. Mais cette solution ne fonctionne pas si vous avez un grand nombre de fichiers à télécharger.

Pour le site de Sephora par exemple, lorsque vous lisez http://www.sephora.fr/Parfum/Parfum-Femme/C309/2, vous aurez toujours les résultats de la première page.

La solution de secours était donc : en mettant le nombre de produits par page au maximum (300), j’avais seulement 3 pages à télécharger.

5 Données cachées

Exemples

Les données que vous cherchez à récupérer parfois se trouvent dans un fichier distinct, bien organisées. Ainsi, il n’est pas nécessaire de crawling le code html pour récupérer les éléments un par un, mais il est possible de lire directement dans ce fichier.

Les exemples de sites sont les suivants:

  • Discours de François Hollande : quand vous êtes sur la page des discours, vous ne verrez pas la liste des discours dans le code source; en revanche, vous avez un lien dans le message d’avertissement en disant que la liste des liens des discours peuvent se trouver sur la page du plan du site.
  • Quick : sur le site de http://familyquick.fr/store-locator, vous voyez l’ensemble des restaurants Quick. Si vous essayez de trouver une manière de lire les données sur la page Google Map, vous ne pourrez pas réussir. Quand vous utilisez l’inspecteur du code source de Chrome, vous pouvez aller dans l’onglet Network, ensuite dans XHR, vous verrez des liens qui permettent de charger les données via js. Il suffit avoir de récupérer un bon lien url. En l’occurrence, c’est un fichier json.
  • Assu2000: idem
  • Marathon de Paris : sur la page officielle :, vous ne pouvez pas voir les résultats directement, car ils sont dans un iframe. Il faut ensuite regarder les liens qui permettent de charger l’iframe.

6 L’arme ultime : Selenium

Selenium permet de simuler un navigateur. Ainsi, tout ce que vous voyez avec l’inspecteur de code source pourra être récupéré. Par exemple sur le site de Sephora :

Sans Selenium, lorsque vous lisez la page 2, vous tombez toujours sur la page 1; avec Selenium, ce que vous êtes bien sur page 2 !

Plus plus d’informations, vous pouvez lire la vignette sur le package RSelenium

7 Conclusion

Grâce à ces techniques de web-scraping, il est possible de récupérer facilement les données sur des sites internet. Bien sûr, si vous voulez industrialiser ce processus, ou si vous avez des objectifs commerciaux, il est nécessaire de discuter avec les sites.

Copyright © 2016 Blog de Kezhan Shi