---
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, </br> 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"))
```
