GUR FLTAUR :
 Tous premiers pas
 dans le WEB SCRAPING



INSEE – Aurélien D’Isanto

    Nom Prénom
2 mai 2012
Plan
    1 – le Web Scraping, c’est quoi

    2 – les outils disponibles de Web Scraping sous R

    3 – ex 1 : récupération automatique de données insee.fr

    4 – ex 2 : automatisation de recherche sur GOOGLE

    5 – pour finir …




2
1 – le Web Scraping, c’est quoi
 Extraction de données d’un site Internet à partir de
  programmes informatiques pour :
      retraiter et/ou les remettre en forme
      les analyser
      les rediffuser sous une autre forme
      éventuellement les utiliser à des fins commerciales

 Envoi de données vers un site Internet à partir de scripts pour :
      Remplir automatiquement des formulaires
      Automatiser des tâches Internet




3
1 – le Web Scraping, c’est quoi
 Comment : écrire un programme informatique
      implémentant un grand nombre de requêtes de
      « dialogue » de type client/serveur (download, upload, …)
      Le client étant le programme
      Et le serveur étant le site Internet d’intérêt représenté par
      son URL

 Conseillé d’avoir des notions de base en HTML/XML
  puisque l’on récupère/envoie des données en HTML




4
2 – les outils disponibles de Web Scraping sous R
 Package Rcurl
      Package de base pour le dialoguer avec des URL
      Simplement une interface du logiciel LIBCURL
      Extraire les informations d’entête du code source HTML d’une
      URL et extraire le contenu d’une URL (i.e. son code source
      HTML) : getURLContent et getURL
      Récupérer les paramètres d’un formulaire WEB :
      getFormParams
      Remplir un formulaire : getForm et postForm

 Package scrapeR
      Package d’une fonction très paramétrable (scrape) pour extraire
      des données de sites WEB en grande quantité

5
2 – les outils disponibles de Web Scraping sous R
 Package XML
     Package d’outil très utiles de traitement d’objets HTML/XML
     Indispensable pour l’extraction de données de sites WEB puisque
     les sorties brutes sont de l’HTML brut …
     Fonction htmlTreeParse et XmlTreeParse : rendre « user-friendly »
     les sorties brutes des fonctions de Rcurl et scrapeR, en indentant
     correctement les balises
     Fonction readHTMLTable : extrait uniquement les tableaux d’une
     document HTML (URL ou document en local) et les met dans un
     format très « user-friendly »

    Package stringr
       Contient des fonctions très utiles pour extraire des chaînes de
       caractères
       Notamment str_locate_all : renvoie toutes les positions auxquelles
       on trouve une expression donnée dans une chaîne de caractères
6
3 – récupération automatique de données insee.fr




7
3 – récupération automatique de données insee.fr
    library(scrapeR)
    library(RCurl)
    library(XML)

    ## préalable : aller sur le site insee.Fr voir comment
    ## sont construits les noms des URL des informations rapides

    ## on découpe l'URL pour la paramétrer efficacement
    urlfixe_partie1 <-"http://www.insee.fr/fr/themes/info-rapide.asp?id="
    id <- "11"
    urlfixe_partie2 <-"&date="
    datePubli <- "20120423«

    paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep="")

    "http://www.insee.fr/fr/themes/info-rapide.asp?
    id=11&date=20120423"


8
3 – récupération automatique de données insee.fr

    ## on extrait le code source HTML de l'URL recomposée
    pageSource <-
    scrape( url=paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep=""),
                   follow=TRUE,
                   headers=TRUE,
                   parse=FALSE,
                   verbose=TRUE)
    pageSource

    Extrait de pageSource :

    Stocks</td>rn<td class="tab-chiffre"> 11</td>rn<td
    class="tab-chiffre"> 13</td>



9
3 – récupération automatique de données insee.fr
     ## alternative :
     pageSource_alternative <-
     getURL(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep=""))

     pageSource_alternative




10
3 – récupération automatique de données insee.fr
     ## on met en forme sous forme d'arbre
     pageSource_mf <- htmlTreeParse(pageSource,
                       asText = TRUE)

     pageSource_mf

     <tr>
        <td   class="TexteTetiere etendue-ligne">Production passée</td>
        <td   class="tab-chiffre">7</td>
        <td   class="tab-chiffre">0</td>
        <td   class="tab-chiffre">19</td>
        <td   class="tab-chiffre">26</td>
     </tr>

     ## ainsi on peut chercher les balises correspondant à ce qui nous interessent
     ## et automatiser une opération : par ex, récupérer tous les
     ## titres des informations rapides des enquêtes de conj depuis 2 ans

11
3 – récupération automatique de données insee.fr
     ## on peut aussi récupérer en une seule ligne de code tous les tableaux
     ## d'une page web et les mettre en forme en matrice
     tableaux <-
     readHTMLTable(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep=""))

     ## la fonction crée autant d'éléments qu'il y a de tableaux (ici 2)
     ## on accède aux valeurs comme pour une matrice
     ## pratique si l'on veut reconstruire un tableau de bord personnalisé
     ## de la situation conjoncturelle à partir des nombreux tableaux insee
     ## disponibles chaque mois ! Pour cela, une fois les tableaux récupérés, on
     ## extrait les données d'intérêt des tableaux et on les met en forme

     tableaux


12
3 – récupération automatique de données insee.fr
     Tableaux

     $tableau1
     Soldes dÂ’opinion, en % CVS NA NA NA NA NA 1
     Industrie manufacturière Moy (1) Janv. 12 Fév. 12 Mars 12 Avril 12
     2 Indicateur synthétique (2) 100 92 93 98 95
     3 Production passée 5 –6 –7 –8 –2
     4 Stocks 13 16 14 11 10
     5 Carnets de commandes globaux –17 –28 –26 –20 –23
     6 Carnets de commandes étrangers –12 –26 –33 –10 –24
     7 Perspectives personnelles de production 5 –5 –1 8 –4
     8 Perspectives générales de production –8 –36 –27 –15 –14

     tableaux$tableau2[5,5]

     [1] –20

13
3 – récupération automatique de données insee.fr
     ## exemple d'utilisation : analyse des révisions des enquêtes de conjoncture
     mois_revision <- "mars 2012"
     datePubli_moisprec <- "20120323"
     tableaux_moisprec <-
     readHTMLTable(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli_moisprec,sep=""))

     tableaux_moisprec

     $tableau1
     Soldes dÂ’opinion, en % CVS NA NA NA NA NA
     1 Industrie manufacturière Moy (1) Déc. 11 Janv. 12 Fév. 12 Mars 12
     2 Indicateur synthétique (2) 100 94 92 93 96
     3 Production passée 5 –5 –6 –7 –10
     4 Stocks 13 15 16 14 9
     5 Carnets de commandes globaux –17 –26 –28 –26 –23
     6 Carnets de commandes étrangers –12 –20 –26 –33 –15
     7 Perspectives personnelles de production 5 –1 –5 –1 6
     8 Perspectives générales de production –8 –36 –36 –27 –15


14
3 – récupération automatique de données insee.fr
     rev_tableau1 <- paste(mois_revision, "- révision de", tableaux$tableau1[,1],":",
     tableaux$tableau1[,5],"/", tableaux_moisprec$tableau1[,6])

     rev_tableaux1_mf<-rev_tableau1[2:8]

     rev_tableaux1_mf

     [1]   "mars   2012   -   révision   de   Indicateur synthétique (2) : 98 / 96"
     [2]   "mars   2012   -   révision   de   Production passée : –8 / –10"
     [3]   "mars   2012   -   révision   de   Stocks : 11 / 9"
     [4]   "mars   2012   -   révision   de   Carnets de commandes globaux : –20 / –23"
     [5]   "mars   2012   -   révision   de   Carnets de commandes étrangers : –10 / –15"
     [6]   "mars   2012   -   révision   de   Persp. personnelles de production : 8 / 6"
     [7]   "mars   2012   -   révision   de   Persp. générales de production : –15 / –15"




15
4 – automatisation de recherche sur GOOGLE




16
4 – automatisation de recherche sur GOOGLE
     library(RCurl)
     library(XML)

     ## choix de la recherche
     rech <- "insee"




17
4 – automatisation de recherche sur GOOGLE
     ## on effectue quelconque une recherche sur google
     ## puis on copie l'URL résultat en paramètre d'entrée
     ## de la fonction getFormParams
     ## en sortie de la fonction, on obtient les paramètres
     ## du formulaire de la recherche GOOGLE
     param <- getFormParams("http://www.google.com/search?
     hl=en&lr=&ie=ISO-8859-1&q=insee&btnG=Search")

     Param

     hl           lr             ie                q            btnG
     "en"         ""      "ISO-8859-1"          "insee"       "Search"




18
4 – automatisation de recherche sur GOOGLE
     ## récupération manuelle ou automatique des paramètres
     ## ici manuelle car peu nombreux
     ## puis la fonction getForm nous permet de changer à loisir les paramètres
     ## pour la recherche GOOGLE, seul le paramètre q doit être changé
     ## en sortie de getForm : de contenu HTML brut de l'URL formée
     ## la concaténation des informations en entrée
     res_rech <- getForm("http://www.google.com/search",
                  hl="en",
                  lr="",
                  ie="ISO-8859-1",
                  q=rech,
                  btnG="Search")




19
4 – automatisation de recherche sur GOOGLE
     ## on rend "user-friendly" la sortie précédente
     ## en affichant le code HTML sous forme d'arbre
     res_rech_mef <- htmlTreeParse(res_rech, asText = TRUE)

     ## on peut rendre le résultat encore plus user-friendly
     ## en convertissant les caractères mal affichés (non ASCII)

     ## on repère alors dans l'arbre les infos qui nous interessent :
     ## titres des premiers résultats ? nombre de résultats ? ...
     ## et on automatise ainsi une extraction de résultats de recherche
     ## Lorsque l'on applique des fonctions d'extraction de chaînes de
     ## caractères sur le résultat HTML, il vaut mieux le faire sur
     ## le code source brut et non celui mis en forme par la fonction htmlTreeParse




20
4 – automatisation de recherche sur GOOGLE
     Extrait1 de res_rech_mef

     <div style="float:right">
        <a class="fl" href="/advanced_search?
        q=insee&hl=en&lr=&ie=UTF-8&prmd=ivnsl">Advanced search
        </a>
     </div>
        <div>About 20,500,000 results</div>
     </div>

     Extrait 2 de res_rech_mef

     <h3 class="r">
        <a href="/url?
        q=http://www.insee.fr/en/default.asp&sa=U&ei=CMqgT7iMEoPqOZj8tfMI&ved
        =0CB8QFjAA&usg=AFQjCNEt5-wN51BxzoDxRFTqDzW-a0xRmQ">
             <b>INSEE </b> - National Institute of Statistics and Economic Studies - France
        </a>
     </h3>


21
5 – Pour finir …
 Un très grand nombre de possibilités :
     RCurl semble aussi pouvoir gérer le protocole HTTPS
     Marketing ciblé en obtenant des informations sur les personnes
     via des réseaux sociaux
     Construction de Bases de données par Wikipédia
     Difficultés principales pour automatiser : comprendre le
     nommage des URL propre à chaque site et retraiter le code
     source HTML …

 Mais une image très mitigée …
     parfois vu comme du pillage d’Internet
     les « robots » remplisseurs de formulaire vus comme nuisibles en
     terme de surcharge des serveurs
     attention aux droits d’auteur …
     Détournement d’informations personnelles à des fins lucratives
     …
22
Pour en savoir plus
 http://curl.haxx.se/ : informations sur le logiciel source sur
  lequel s’appuient les packages de web scraping de R

 Voir les manuels (sur le site du CRAN) des packages
  mentionnés dans la présentation

 http://www.omegahat.org/RCurl/ : page personnelle du
  package RCurl




23

Premier pas de web scrapping avec R

  • 1.
    GUR FLTAUR : Tous premiers pas dans le WEB SCRAPING INSEE – Aurélien D’Isanto Nom Prénom 2 mai 2012
  • 2.
    Plan 1 – le Web Scraping, c’est quoi 2 – les outils disponibles de Web Scraping sous R 3 – ex 1 : récupération automatique de données insee.fr 4 – ex 2 : automatisation de recherche sur GOOGLE 5 – pour finir … 2
  • 3.
    1 – leWeb Scraping, c’est quoi  Extraction de données d’un site Internet à partir de programmes informatiques pour : retraiter et/ou les remettre en forme les analyser les rediffuser sous une autre forme éventuellement les utiliser à des fins commerciales  Envoi de données vers un site Internet à partir de scripts pour : Remplir automatiquement des formulaires Automatiser des tâches Internet 3
  • 4.
    1 – leWeb Scraping, c’est quoi  Comment : écrire un programme informatique implémentant un grand nombre de requêtes de « dialogue » de type client/serveur (download, upload, …) Le client étant le programme Et le serveur étant le site Internet d’intérêt représenté par son URL  Conseillé d’avoir des notions de base en HTML/XML puisque l’on récupère/envoie des données en HTML 4
  • 5.
    2 – lesoutils disponibles de Web Scraping sous R  Package Rcurl Package de base pour le dialoguer avec des URL Simplement une interface du logiciel LIBCURL Extraire les informations d’entête du code source HTML d’une URL et extraire le contenu d’une URL (i.e. son code source HTML) : getURLContent et getURL Récupérer les paramètres d’un formulaire WEB : getFormParams Remplir un formulaire : getForm et postForm  Package scrapeR Package d’une fonction très paramétrable (scrape) pour extraire des données de sites WEB en grande quantité 5
  • 6.
    2 – lesoutils disponibles de Web Scraping sous R  Package XML Package d’outil très utiles de traitement d’objets HTML/XML Indispensable pour l’extraction de données de sites WEB puisque les sorties brutes sont de l’HTML brut … Fonction htmlTreeParse et XmlTreeParse : rendre « user-friendly » les sorties brutes des fonctions de Rcurl et scrapeR, en indentant correctement les balises Fonction readHTMLTable : extrait uniquement les tableaux d’une document HTML (URL ou document en local) et les met dans un format très « user-friendly » Package stringr Contient des fonctions très utiles pour extraire des chaînes de caractères Notamment str_locate_all : renvoie toutes les positions auxquelles on trouve une expression donnée dans une chaîne de caractères 6
  • 7.
    3 – récupérationautomatique de données insee.fr 7
  • 8.
    3 – récupérationautomatique de données insee.fr library(scrapeR) library(RCurl) library(XML) ## préalable : aller sur le site insee.Fr voir comment ## sont construits les noms des URL des informations rapides ## on découpe l'URL pour la paramétrer efficacement urlfixe_partie1 <-"http://www.insee.fr/fr/themes/info-rapide.asp?id=" id <- "11" urlfixe_partie2 <-"&date=" datePubli <- "20120423« paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep="") "http://www.insee.fr/fr/themes/info-rapide.asp? id=11&date=20120423" 8
  • 9.
    3 – récupérationautomatique de données insee.fr ## on extrait le code source HTML de l'URL recomposée pageSource <- scrape( url=paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep=""), follow=TRUE, headers=TRUE, parse=FALSE, verbose=TRUE) pageSource Extrait de pageSource : Stocks</td>rn<td class="tab-chiffre"> 11</td>rn<td class="tab-chiffre"> 13</td> 9
  • 10.
    3 – récupérationautomatique de données insee.fr ## alternative : pageSource_alternative <- getURL(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep="")) pageSource_alternative 10
  • 11.
    3 – récupérationautomatique de données insee.fr ## on met en forme sous forme d'arbre pageSource_mf <- htmlTreeParse(pageSource, asText = TRUE) pageSource_mf <tr> <td class="TexteTetiere etendue-ligne">Production passée</td> <td class="tab-chiffre">7</td> <td class="tab-chiffre">0</td> <td class="tab-chiffre">19</td> <td class="tab-chiffre">26</td> </tr> ## ainsi on peut chercher les balises correspondant à ce qui nous interessent ## et automatiser une opération : par ex, récupérer tous les ## titres des informations rapides des enquêtes de conj depuis 2 ans 11
  • 12.
    3 – récupérationautomatique de données insee.fr ## on peut aussi récupérer en une seule ligne de code tous les tableaux ## d'une page web et les mettre en forme en matrice tableaux <- readHTMLTable(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli,sep="")) ## la fonction crée autant d'éléments qu'il y a de tableaux (ici 2) ## on accède aux valeurs comme pour une matrice ## pratique si l'on veut reconstruire un tableau de bord personnalisé ## de la situation conjoncturelle à partir des nombreux tableaux insee ## disponibles chaque mois ! Pour cela, une fois les tableaux récupérés, on ## extrait les données d'intérêt des tableaux et on les met en forme tableaux 12
  • 13.
    3 – récupérationautomatique de données insee.fr Tableaux $tableau1 Soldes dÂ’opinion, en % CVS NA NA NA NA NA 1 Industrie manufacturière Moy (1) Janv. 12 Fév. 12 Mars 12 Avril 12 2 Indicateur synthétique (2) 100 92 93 98 95 3 Production passée 5 –6 –7 –8 –2 4 Stocks 13 16 14 11 10 5 Carnets de commandes globaux –17 –28 –26 –20 –23 6 Carnets de commandes étrangers –12 –26 –33 –10 –24 7 Perspectives personnelles de production 5 –5 –1 8 –4 8 Perspectives générales de production –8 –36 –27 –15 –14 tableaux$tableau2[5,5] [1] –20 13
  • 14.
    3 – récupérationautomatique de données insee.fr ## exemple d'utilisation : analyse des révisions des enquêtes de conjoncture mois_revision <- "mars 2012" datePubli_moisprec <- "20120323" tableaux_moisprec <- readHTMLTable(paste(urlfixe_partie1,id,urlfixe_partie2,datePubli_moisprec,sep="")) tableaux_moisprec $tableau1 Soldes dÂ’opinion, en % CVS NA NA NA NA NA 1 Industrie manufacturière Moy (1) Déc. 11 Janv. 12 Fév. 12 Mars 12 2 Indicateur synthétique (2) 100 94 92 93 96 3 Production passée 5 –5 –6 –7 –10 4 Stocks 13 15 16 14 9 5 Carnets de commandes globaux –17 –26 –28 –26 –23 6 Carnets de commandes étrangers –12 –20 –26 –33 –15 7 Perspectives personnelles de production 5 –1 –5 –1 6 8 Perspectives générales de production –8 –36 –36 –27 –15 14
  • 15.
    3 – récupérationautomatique de données insee.fr rev_tableau1 <- paste(mois_revision, "- révision de", tableaux$tableau1[,1],":", tableaux$tableau1[,5],"/", tableaux_moisprec$tableau1[,6]) rev_tableaux1_mf<-rev_tableau1[2:8] rev_tableaux1_mf [1] "mars 2012 - révision de Indicateur synthétique (2) : 98 / 96" [2] "mars 2012 - révision de Production passée : –8 / –10" [3] "mars 2012 - révision de Stocks : 11 / 9" [4] "mars 2012 - révision de Carnets de commandes globaux : –20 / –23" [5] "mars 2012 - révision de Carnets de commandes étrangers : –10 / –15" [6] "mars 2012 - révision de Persp. personnelles de production : 8 / 6" [7] "mars 2012 - révision de Persp. générales de production : –15 / –15" 15
  • 16.
    4 – automatisationde recherche sur GOOGLE 16
  • 17.
    4 – automatisationde recherche sur GOOGLE library(RCurl) library(XML) ## choix de la recherche rech <- "insee" 17
  • 18.
    4 – automatisationde recherche sur GOOGLE ## on effectue quelconque une recherche sur google ## puis on copie l'URL résultat en paramètre d'entrée ## de la fonction getFormParams ## en sortie de la fonction, on obtient les paramètres ## du formulaire de la recherche GOOGLE param <- getFormParams("http://www.google.com/search? hl=en&lr=&ie=ISO-8859-1&q=insee&btnG=Search") Param hl lr ie q btnG "en" "" "ISO-8859-1" "insee" "Search" 18
  • 19.
    4 – automatisationde recherche sur GOOGLE ## récupération manuelle ou automatique des paramètres ## ici manuelle car peu nombreux ## puis la fonction getForm nous permet de changer à loisir les paramètres ## pour la recherche GOOGLE, seul le paramètre q doit être changé ## en sortie de getForm : de contenu HTML brut de l'URL formée ## la concaténation des informations en entrée res_rech <- getForm("http://www.google.com/search", hl="en", lr="", ie="ISO-8859-1", q=rech, btnG="Search") 19
  • 20.
    4 – automatisationde recherche sur GOOGLE ## on rend "user-friendly" la sortie précédente ## en affichant le code HTML sous forme d'arbre res_rech_mef <- htmlTreeParse(res_rech, asText = TRUE) ## on peut rendre le résultat encore plus user-friendly ## en convertissant les caractères mal affichés (non ASCII) ## on repère alors dans l'arbre les infos qui nous interessent : ## titres des premiers résultats ? nombre de résultats ? ... ## et on automatise ainsi une extraction de résultats de recherche ## Lorsque l'on applique des fonctions d'extraction de chaînes de ## caractères sur le résultat HTML, il vaut mieux le faire sur ## le code source brut et non celui mis en forme par la fonction htmlTreeParse 20
  • 21.
    4 – automatisationde recherche sur GOOGLE Extrait1 de res_rech_mef <div style="float:right"> <a class="fl" href="/advanced_search? q=insee&hl=en&lr=&ie=UTF-8&prmd=ivnsl">Advanced search </a> </div> <div>About 20,500,000 results</div> </div> Extrait 2 de res_rech_mef <h3 class="r"> <a href="/url? q=http://www.insee.fr/en/default.asp&sa=U&ei=CMqgT7iMEoPqOZj8tfMI&ved =0CB8QFjAA&usg=AFQjCNEt5-wN51BxzoDxRFTqDzW-a0xRmQ"> <b>INSEE </b> - National Institute of Statistics and Economic Studies - France </a> </h3> 21
  • 22.
    5 – Pourfinir …  Un très grand nombre de possibilités : RCurl semble aussi pouvoir gérer le protocole HTTPS Marketing ciblé en obtenant des informations sur les personnes via des réseaux sociaux Construction de Bases de données par Wikipédia Difficultés principales pour automatiser : comprendre le nommage des URL propre à chaque site et retraiter le code source HTML …  Mais une image très mitigée … parfois vu comme du pillage d’Internet les « robots » remplisseurs de formulaire vus comme nuisibles en terme de surcharge des serveurs attention aux droits d’auteur … Détournement d’informations personnelles à des fins lucratives … 22
  • 23.
    Pour en savoirplus  http://curl.haxx.se/ : informations sur le logiciel source sur lequel s’appuient les packages de web scraping de R  Voir les manuels (sur le site du CRAN) des packages mentionnés dans la présentation  http://www.omegahat.org/RCurl/ : page personnelle du package RCurl 23