Récupération de données sur le Web avec rvest

Extraire des données Web à l’aide de rvest en R - Guide étendu

Apprenez à extraire des données de sites web à l’aide du package rvest dans R. Ce tutoriel élargi couvre non seulement les bases de l’analyse HTML et de l’extraction de données, mais aussi des techniques avancées telles que la gestion de la pagination, l’utilisation des sessions et l’implémentation de la gestion des erreurs pour un web scraping robuste.

Programmation
Auteur·rice
Affiliation
Date de publication

10 février 2024

Modifié

9 mai 2025

Mots clés

tutoriel rvest, web scraping en R, Analyse HTML R, extraire des données avec rvest, scraping web avancé R

Introduction

Le web scraping est une technique essentielle pour les data scientists et les analystes qui ont besoin d’extraire des données de sites web à des fins d’analyse ou de recherche. Dans ce tutoriel, vous apprendrez à utiliser rvest, un package R populaire, pour analyser le code HTML, extraire des données et relever les défis les plus courants du web scraping. Nous commencerons par des exemples de base, puis nous aborderons des sujets plus avancés tels que la pagination, l’utilisation des sessions et la gestion des erreurs.



Mise en place

Avant de commencer, assurez-vous que le paquet rvest est installé et chargé:

#| label: install-rvest
# Installer le paquet
install.packages("rvest")

# Charger le paquet
library(rvest)

Exemple de base pour l’extraction de données sur le web

Commençons par un exemple simple : récupérer une page web et en extraire le titre.

#| label: basic-scraping
# Définir l'URL à récupérer
url <- "https://www.worldometers.info/world-population/population-by-country/"

# Lire le contenu HTML de l'URL
page <- read_html(url)

# Extraire le titre de la page à l'aide d'un sélecteur CSS
page_title <- page %>% html_node("title") %>% html_text()
print(paste("Page Title:", page_title))

Résultats:

[1] "Page Title: Population by Country (2025) - Worldometer"

Extraction de liens et de texte

Vous pouvez extraire les hyperliens et leur texte d’une page web:

#| label: extract-links
# Extraire tous les nœuds d'hyperliens
links <- page %>% html_nodes("a")

# Extraire le texte et l'URL des 5 premiers liens
for (i in 1:min(5, length(links))) {
  link_text <- links[i] %>% html_text(trim = TRUE)
  link_href <- links[i] %>% html_attr("href")
  print(paste("Link Text:", link_text, "- URL:", link_href))
}

Résultats:

[1] "Link Text:  - URL: /"
[1] "Link Text: Population - URL: /population/"
[1] "Link Text: CO2 emissions - URL: /co2-emissions/"
[1] "Link Text: Coronavirus - URL: /coronavirus/"
[1] "Link Text: Countries - URL: /geography/countries-of-the-world/"

Extraction de tableaux

De nombreux sites web affichent des données dans des tableaux. Utilisez rvest pour extraire et convertir des tableaux en cadres de données:

#| label: extract-tables
# Trouver le premier tableau de la page
table_node <- page %>% html_node("table")
# Convertir le tableau en cadre de données
table_data <- table_node %>% html_table(fill = TRUE)
print(head(table_data))

Résultats:

Tableau extrait

Gérer la pagination

Pour les sites web dont les données sont réparties sur plusieurs pages, vous pouvez automatiser la pagination. Le code suivant extrait les titres et les URL des articles de blog d’un site web paginé en itérant à travers un ensemble de numéros de page, puis combine les résultats dans un cadre de données.

#| label: pagination-example
library(rvest)
library(dplyr)
library(purrr)
library(tibble)

# Définir une fonction pour extraire une page à partir de son URL
scrape_page <- function(url) {
  tryCatch({
    read_html(url)
  }, error = function(e) {
    message("Error accessing URL: ", url)
    return(NULL)
  })
}

# Le site web utilise un paramètre de requête `#listing-listing-page=` pour la pagination
base_url <- "https://quarto.org/docs/blog/#listing-listing-page="
page_numbers <- 1:2  # Exemple : extraire les 2 premières pages

# Initialiser un tibble vide pour stocker les messages
all_posts <- tibble(title = character(), url = character())

# Boucle sur chaque numéro de page
for (page_number in page_numbers) {
  url <- paste0(base_url, page_number)
  page <- scrape_page(url)
  
  if (!is.null(page)) {
    # Extraire les articles de blog : chaque titre et URL se trouve dans une balise <h3> avec la classe 'no-anchor listing-title'
    posts <- page %>%
      html_nodes("h3.no-anchor.listing-title") %>%
      map_df(function(h3) {
        a_tag <- h3 %>% html_node("a")
        if (!is.null(a_tag)) {
          title <- a_tag %>% html_text(trim = TRUE)
          link <- a_tag %>% html_attr("href")
          tibble(title = title, url = link)
        } else {
          tibble(title = NA_character_, url = NA_character_)
        }
      })
    # Ajouter les messages de cette page à la liste globale
    all_posts <- bind_rows(all_posts, posts)
  }
  
  # Délai respectueux entre les requêtes
  Sys.sleep(1)
}

# Afficher les premières lignes des messages collectés
print(head(all_posts))

Extraction des articles de blog

Utilisation des sessions

L’utilisation de sessions peut aider à maintenir l’état (par exemple, les cookies et les en-têtes) à travers plusieurs requêtes, améliorant ainsi l’efficacité lors de l’extraction de plusieurs pages d’un même site.

#| label: using-sessions
url <- "https://www.worldometers.info/world-population/population-by-country/"
# Créer un objet session
session <- session("https://www.worldometers.info")
# Utiliser la session pour naviguer et scraper
page <- session %>% session_jump_to(url)
page_title <- page %>% read_html() %>% html_node("title") %>% html_text()
print(paste("Session-based Page Title:", page_title))

Gestion des erreurs

L’intégration de la gestion des erreurs garantit que votre script peut traiter les problèmes inattendus avec élégance.

#| label: error-handling
# Utiliser tryCatch pour gérer les erreurs pendant le scraping
safe_scrape <- function(url) {
  tryCatch({
    read_html(url)
  }, error = function(e) {
    message("Error: ", e$message)
    return(NULL)
  })
}

page <- safe_scrape("https://example.com/nonexistent")
if (is.null(page)) {
  print("Failed to retrieve the page. Please check the URL or try again later.")
}

Résultats:

Error: HTTP error 404.
[1] "Failed to retrieve the page. Please check the URL or try again later."

Bonnes pratiques pour le Récupération de données sur le Web

  • Respecter les politiques du site web:
    Vérifiez toujours le fichier robots.txt et les conditions de service du site web pour vous assurer de leur conformité avec leurs politiques de scraping.
  • Mise en place d’une limitation de débit:
    Utilisez des délais (par exemple, Sys.sleep()) entre les requêtes pour éviter de submerger le serveur.
  • Surveiller les changements:
    Les sites web peuvent changer de structure au fil du temps. Mettez régulièrement à jour vos sélecteurs et votre gestion des erreurs pour tenir compte de ces changements.
  • Documenter votre code:
    Commentez vos scripts et structurez-les clairement pour faciliter la maintenance et la reproductibilité.

Conclusion

En développant les bases, ce tutoriel couvre les techniques avancées pour le web scraping avec rvest, y compris la gestion de la pagination, l’utilisation des sessions, et la mise en œuvre de la gestion des erreurs. Grâce à ces outils et à ces bonnes pratiques, vous pouvez mettre en place des flux d’extraction de données robustes pour vos projets de science des données.

Plus d’informations

Bon codage et bonne exploration du web avec rvest!

Explorer d’autres articles

Note

Voici d’autres articles de la même catégorie pour vous aider à approfondir le sujet.

Retour au sommet

Réutilisation

Citation

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Récupération de données sur le Web avec rvest},
  date = {2024-02-10},
  url = {https://www.datanovia.com/fr/learn/programming/r/tools/web-scraping-with-rvest.html},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2024. “Récupération de données sur le Web avec rvest.” February 10, 2024. https://www.datanovia.com/fr/learn/programming/r/tools/web-scraping-with-rvest.html.