--- title: "Web scraping" author: "Maxime Wack" date: "17/11/2020" output: xaringan::moon_reader: css: ['default','css/my_style.css'] lib_dir: libs seal: false nature: ratio: '4:3' countIncrementalSlides: false self-contained: true beforeInit: "addons/macros.js" highlightLines: true --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, fig.asp= .5) library(tidyverse) library(DT) library(knitr) library(httr) library(rvest) options(DT.options = list(paging = F, info = F, searching = F)) ``` class: center, middle, title # UE Visualisation ### 2020-2021 ## Dr. Maxime Wack ### AHU Informatique médicale #### Hôpital Européen Georges Pompidou,
Université de Paris --- # Web scraping ### Utilisation de `httr` et `rvest` ## httr Permet de faire des requêtes réseau → interroger et télécharger directement depuis R ## rvest Extraction de données depuis des pages HTML --- # httr ```{r init, echo = F, message = F, error = F} library(tidyverse) library(httr) library(rvest) ``` Télécharger une page wikipedia ```{r dl wikipedia} GET("https://en.wikipedia.org/wiki/Comparison_of_operating_systems") -> wiki ``` ```{r dl wikipedia do, echo = F} wiki ``` --- # Parsing HTML ```{r html} wiki %>% read_html -> wiki_html ``` ```{r html do, echo = F} wiki_html ``` --- # Sélecteurs CSS [W3Schools](https://www.w3schools.com/cssref/css_selectors.asp) ### Selecteurs permettant d'identifier un **nœud** précis dans le **DOM** (Document Object Model) d'une page HTML ### Permet de sélectionner par identifiant, classe, position dans la hiérarchie, position entre élements d'un même niveau, ou relativement entre élements ### Utiliser l'**inspecteur** des outils de développement du navigateur pour identifier les éléments à capturer --- # Sélecteurs CSS ```{r tables} wiki_html %>% html_nodes(".wikitable") ``` ```{r table} wiki_html %>% html_node("div + .wikitable") ``` --- # Extraction d'une table ```{r scrape} wiki_html %>% html_node("div + .wikitable") %>% html_table -> wikitable ``` ```{r scrape do, echo = F} datatable(wikitable) ``` --- # Exercices ### Transformer cette table en forme normale ### Extraire la table avec les informations techniques ### Identifier les OS libres fonctionnant avec un microkernel ```{r wiki table} # On identifie toutes les tables "wikitable" GET("https://en.wikipedia.org/wiki/Comparison_of_operating_systems") %>% read_html %>% html_nodes(".wikitable") -> wikitables # On extrait et parse les deux premières tables wikitables[[1]] %>% html_table -> table1 wikitables[[2]] %>% html_table -> table2 # On joint les tables, sélectionne les variables pertinentes et met en œuvre les filtres correspondant à l'énoncé inner_join(table1, table2) %>% select(Name, Creator, Cost = `Cost, availability`, License = `Preferred license[g 1]`, Kernel = `Kernel type`) %>% filter(Kernel %>% str_detect("[Mm]icrokernel"), License %in% c("AGPL", "BSD", "GNU GPL, GNU LGPL", "MIT", "MIT, GNU GPL, GNU LGPL, LPL")) ```