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
<- "https://www.worldometers.info/world-population/population-by-country/"
url
# Lire le contenu HTML de l'URL
<- read_html(url)
page
# Extraire le titre de la page à l'aide d'un sélecteur CSS
<- page %>% html_node("title") %>% html_text()
page_title 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
<- page %>% html_nodes("a")
links
# Extraire le texte et l'URL des 5 premiers liens
for (i in 1:min(5, length(links))) {
<- links[i] %>% html_text(trim = TRUE)
link_text <- links[i] %>% html_attr("href")
link_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
<- page %>% html_node("table")
table_node # Convertir le tableau en cadre de données
<- table_node %>% html_table(fill = TRUE)
table_data print(head(table_data))
Résultats:
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
<- function(url) {
scrape_page 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
<- "https://quarto.org/docs/blog/#listing-listing-page="
base_url <- 1:2 # Exemple : extraire les 2 premières pages
page_numbers
# Initialiser un tibble vide pour stocker les messages
<- tibble(title = character(), url = character())
all_posts
# Boucle sur chaque numéro de page
for (page_number in page_numbers) {
<- paste0(base_url, page_number)
url <- scrape_page(url)
page
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'
<- page %>%
posts html_nodes("h3.no-anchor.listing-title") %>%
map_df(function(h3) {
<- h3 %>% html_node("a")
a_tag if (!is.null(a_tag)) {
<- a_tag %>% html_text(trim = TRUE)
title <- a_tag %>% html_attr("href")
link tibble(title = title, url = link)
else {
} tibble(title = NA_character_, url = NA_character_)
}
})# Ajouter les messages de cette page à la liste globale
<- bind_rows(all_posts, posts)
all_posts
}
# Délai respectueux entre les requêtes
Sys.sleep(1)
}
# Afficher les premières lignes des messages collectés
print(head(all_posts))
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
<- "https://www.worldometers.info/world-population/population-by-country/"
url # Créer un objet session
<- session("https://www.worldometers.info")
session # Utiliser la session pour naviguer et scraper
<- session %>% session_jump_to(url)
page <- page %>% read_html() %>% html_node("title") %>% html_text()
page_title 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
<- function(url) {
safe_scrape tryCatch({
read_html(url)
error = function(e) {
}, message("Error: ", e$message)
return(NULL)
})
}
<- safe_scrape("https://example.com/nonexistent")
page 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 fichierrobots.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
- Automatiser les rapports avec RMarkdown
- Tableaux de bord interactifs avec Shiny
- Tidyverse pour la science des données
Bon codage et bonne exploration du web avec rvest!
Explorer d’autres articles
Voici d’autres articles de la même catégorie pour vous aider à approfondir le sujet.
Réutilisation
Citation
@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}
}