Définitions & usages
| Méthode | Avantages | Inconvénients |
|---|---|---|
| Webscraping | Furtif ; interface ; contrôle ; ludique | Légalité floue ; complexité ; éphémère |
| API | Légal si CGU ; données nettoyées ; requêtes simples ; durabilité | Limites ; prix ; inscription ; pas d’interface |
| Accès direct à la base de données | Légal ; informations nettoyées ; pas de programmation ! | négociation ; pas de contexte / contrôle |
Les grands principes du webscraping
En pratique, notre bot va procéder en deux temps :
rvest) -> bien pour débuter, scraping de base.mechanize, scrapy) -> pour les projets les plus ambitieux.rvest, 2.0 pour Python et cie)get_ratings(2017)get_film_metadata(url)get_text(".class")data(ratings)data(report)vignette("allocine-scraper")get_ratings) au plus bas (get_text)?get_ratingsget_ratings, puis la coder soi-même ; puis remplacer process_filmlist ; puis get_film_ratingsget_ratings(2017, pages = 4)
#> # A tibble: 94 x 9
#> paper rating title date duration genre nationality direction actors
#> <chr> <chr> <chr> <date> <dbl> <chr> <chr> <chr> <chr>
#> 1 Bande… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 2 Cinem… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 3 Ecran… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 4 L'Exp… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 5 Le Po… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 6 Paris… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 7 Posit… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 8 Trans… Chef-d… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 9 20 Mi… Très b… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> 10 Closer Très b… A Be… 2017-11-08 90 Drame britannique De Lynne… Avec Jo…
#> # … with 84 more rowshttps://www.allocine.fr/film/fichefilm-215099/critiques/presse/
"https://www.allocine.fr/film/fichefilm-215099/critiques/presse/" %>%
get_film_ratings()
#> # A tibble: 40 x 9
#> paper rating title date duration genre nationality direction actors
#> <chr> <chr> <chr> <date> <dbl> <chr> <chr> <chr> <chr>
#> 1 Bande… Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 2 Closer Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 3 IGN F… Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 4 Les I… Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 5 Mad M… Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 6 Télé … Chef-d… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 7 20 Mi… Très b… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 8 CNews Très b… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 9 Cinem… Très b… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> 10 Derni… Très b… Star … 2017-12-13 152 Acti… américain De Rian … Avec D…
#> # … with 30 more rowsget_press_ratings"https://www.allocine.fr/film/fichefilm-215099/critiques/presse/" %>%
get_press_ratings()
#> # A tibble: 40 x 2
#> paper rating
#> <chr> <chr>
#> 1 Bande à part Chef-d'oeuvre
#> 2 Closer Chef-d'oeuvre
#> 3 IGN France Chef-d'oeuvre
#> 4 Les Inrockuptibles Chef-d'oeuvre
#> 5 Mad Movies Chef-d'oeuvre
#> 6 Télé Loisirs Chef-d'oeuvre
#> 7 20 Minutes Très bien
#> 8 CNews Très bien
#> 9 CinemaTeaser Très bien
#> 10 Dernières Nouvelles d'Alsace Très bien
#> # … with 30 more rowsget_film_metadataCtrl+Shift+KCtrl+Shift+IGET, POST, HEADERS) -> onglet NetworkGETPOSTBalises imbriquées :
Balises = nœud (node)
//div/ul/li
get_text() (de soscrap)dplyr, forcats, stringr, lubridate, …%>% (pipe) qui devient vite indispensable (paquet magrittr)setwd(), enfin des chemins reproductibles !library(glue)
glue("Adieu", "horrible", "paste()", .sep = " ")
#> Adieu horrible paste()
a <- 41
glue("La réponse à votre question est {a+1}.")
#> La réponse à votre question est 42.paste() et collapse()fstrings dans Python 3.8, printf chez UNIX, …)message() plutôt que print()stop() avec un message d’erreur clairreturn() pour forcer un retourrlang::is_missing() pour les arguments normauxrlang::quo_is_missing()testthatOu comment j’ai appris à ne plus m’en faire et à aimer les boucles
pages <- c(1, 2, 3)
films <- tibble(
titre = character(),
real = character(),
)
for (page in pages) {
films <- films %>%
add_row(tibble(titre = glue("Film {page}"),
real = glue("Real {page}"))
)
}Qu’est-ce que j’obtiens si je fais print(films) ?
pages <- c(1, 2, 3)
films <- tibble(
titre = character(),
real = character(),
)
for (page in pages) {
films <- films %>%
add_row(tibble(titre = glue("Film {page}"),
real = glue("Real {page}"))
)
}
print(films)
#> # A tibble: 3 x 2
#> titre real
#> <glue> <glue>
#> 1 Film 1 Real 1
#> 2 Film 2 Real 2
#> 3 Film 3 Real 3for(annee in annees) {
for(page in pages) {
for(film in films) {
for (note in notes) {
return(toutes_les_notes)
}
films %>%
add_row(...)
}
}
return(films %>%
add_column(annee = annee))
}Quels problèmes ?
for(annee in annees) {
for(page in pages) {
for(film in films) {
for (note in notes) {
return(toutes_les_notes)
}
films %>%
add_row(...)
}
}
return(films %>%
add_column(annee = annee))
}Quels problèmes ?
pages <- c(1, 2, 3)
films <- tibble(
titre = character(),
real = character(),
)
for (page in pages) {
films <- films %>%
add_row(tibble(titre = glue("Film {page}"),
real = glue("Real {page}"))
)
}
print(films)
#> # A tibble: 3 x 2
#> titre real
#> <glue> <glue>
#> 1 Film 1 Real 1
#> 2 Film 2 Real 2
#> 3 Film 3 Real 3purrrmap : une listemap_int : un vecteur d’integersmap_chr : un vecteur de textemap_df : une base de données type tibble# Définir une fonction pour récupérer les évaluations des films
# d'une page à partir de son URL
get_ratings_from_page <- function(url) { ... }
# Récupération des URLs des pages des films de cette année
this_year_urls <- ...
# Lancer le scraping et retourner une base de données toute faite :)
this_year_ratings <- map_df(this_year_urls,
~ get_ratings_from_page(.x))urls <- c("https://google.com", "http://je-nexiste-pas.lol")
# Je récupère les nœuds de chaque page
resultat <- map(urls,
~ httr::GET(url) %>%
read_html() %>%
get_nodes())
#> Error in get_nodes(.): could not find function "get_nodes"
print(resultat)
#> Error in print(resultat): object 'resultat' not found
Comment ça marche ?