# Préparation et rappel des étapes ---- #installation des librairies, si elles ne sont pas déjà installées # install.packages("xlsx") # install.packages("xml2") # install.packages("rvest") # install.packages("dplyr") # install.packages("stringr") # install.packages("lubridate") #chargement des librairies library(xlsx) library(xml2) #lecture page web library(rvest) #webscraping library(dplyr) #r "moderne" library(stringr) #simplifier le traitement des chaines de caractères etc... library(lubridate) #opérations sur objets date-heure #modifier setwd() : indiquer le chemin du dossier au niveau duquel vous souhaitez sauvegarder les fichiers xlsx de sortie #setwd("chemin/acces") # Besoin : Collecter le titre, le chapeau, le texte, le journal, la date de publication, les mots-clefs, et les liens vers d’autres #pages contenues dans le texte de l’article médiatique. # Rappel des deux étapes : # Étape 1 : Consultation du code source des pages des articles identifiés : #Le web scraping des informations des articles identifiés se base sur des balises présentes dans le code source de la page web. #On y accède grâce à un clic droit sur la page web ouverte dans un navigateur et en choisissant « Inspecter » (variable selon les navigateurs, voir liens dans la partie 2.1.1). #Cette fonctionnalité permet de visualiser le lien entre une zone de la page et le code source. De plus, avec un clic droit sur la parte d’intérêt du code source, #on peut copier directement le « chemin CSS » ou « chemin Xpath ». Par exemple, dans le cas 1, pour récupérer le titre, le chemin CSS est : # « html.js.js-focus-visible.webfont body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-pagearticle#main-content.lt-endor.box.mb2 header.nodeheader h1.nodeheader-title » # Étape 2 : Réalisation du script R #Avant de pouvoir chercher les éléments qui nous intéressent, il faut que la/les pages soient chargée(s) dans l’environnement R (utilisation du package "xml2"). #Puis on récupère les éléments d’intérêt avec la syntaxe utilisée dans la page web en question (utilisation du package "rvest"). #Les scripts permettant de répondre aux objectifs énoncés sont détaillés ci-dessous. # CAS 1 : Source médiatique ---- # URL ciblée searchUrl <- "https://www.20minutes.fr/planete/2854659-20200905-occitanie-bacterie-tueuse-oliviers-reperee-premiere-fois-region" # Lecture de la page web page <- xml2::read_html(searchUrl) # Sélection des informations d'intérêt grâce aux balises de la page web (voir code source de la page web) # Avec rvest, on utilise le chemin CSS titre <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 header.nodeheader h1.nodeheader-title") %>% #on peut aussi laisser juste "body article header h1" rvest::html_text() chapeau <- page %>% rvest::html_nodes(" body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 header.nodeheader p.hat") %>% rvest::html_text() text <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 div.lt-endor-body.content div.qiota_reserve.content") %>% rvest::html_text() journal <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 header.nodeheader div.nodeheader-infos address.authorsign") %>% rvest::html_text() date <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 header.nodeheader div.nodeheader-infos div.datetime") %>% rvest::html_text() motscles <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 div.lt-endor-body.content ul.tags.mt1.pt1.mb1 li") %>% rvest::html_text() lienstext <- page %>% rvest::html_nodes("body div#page-wrap div#page-content.pt2.pb2.wrap.wrap-page article#main-content.lt-endor.box.mb2 div.lt-endor-body.content div.qiota_reserve.content p a") %>% rvest::html_attr("href") # Retrait des espaces des éléménts extraits (avant et après les éléments d'intérêt); Retrait aussi des retours à la ligne (\n) avant et après mais pas au milieu chapeau <- stringr::str_trim(chapeau) journal <- stringr::str_trim(journal) date <- stringr::str_trim(date) text <- stringr::str_trim(text) # Remplacement des retours à la ligne par un espace date <- gsub('\n',' ',date) text <- gsub('\n',' ',text) # Séparation des dates date <- unlist(stringr::str_split(date,"—")) date <- stringr::str_trim(date) # Récupération que de la date sans le texte autours date <- stringr::str_extract(date, "../../..") date <- as.Date(date, format = "%d/%m/%y") # Synthétise les données dans un tableau TabRecap <- data.frame( Lien = searchUrl, Titre = titre, Chapeau = chapeau, DatePublication = date[1], DateMiseaJour = date[2], Journal = journal, MotsCles = paste0(motscles,collapse = ', '), LiensText = paste0(lienstext,collapse = ', '), Text = text ) # Export du tableau en format xlsx # hors "projet R", ajouter le chemin d'accès vers le fichier xlsx::write.xlsx(TabRecap,'CAS1_tabrecap.xlsx',row.names = FALSE) # CAS 2 : Source scientifique ---- # Url ciblée searchUrl <- "https://www.frontiersin.org/articles/10.3389/finsc.2022.887659/full" # Lecture de la page web page <- xml2::read_html(searchUrl) # Sélection des informations d'intérêt grâce aux balises de la page web titre <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.JournalAbstract h1") %>% rvest::html_text() auteurs <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.JournalAbstract div.authors") %>% rvest::html_text() abstract <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.JournalAbstract p") %>% rvest::html_text() text <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.JournalFullText") %>% rvest::html_text() #(la date est traitée dans la partie suivante) journaldatelien <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.article-header-container div.header-bar-three-container div.header-bar-three") %>% rvest::html_text() lien <- page %>% rvest::html_nodes("body.journal-insect-science.section-invasive-insect-species div#main-content.page-container.sidemenu-collapsed div#article.boxed.white.no-padding div.container-fluid.main-container-xxl div#similar-articles.row div.new-wrapper main div.article-section div.article-container div.abstract-container div.article-header-container div.header-bar-three-container div.header-bar-three a") %>% rvest::html_attr("href") # Retrait des espaces des éléménts extraits auteurs <- stringr::str_trim(auteurs) journaldatelien <- stringr::str_trim(journaldatelien) text <- stringr::str_trim(text) # Remplacement des retours à la ligne par un espace text <- gsub('\n',' ',text) # Séparation du journal et de la date (ne garde pas le lien https) journal <- unlist(stringr::str_split(journaldatelien,"([0-9]{2} ..... [0-9]{4})|(\r\n\r\n)")) #sépare sur une expression régulière ou \r\n\r\n , tu peux aussi mettre celle là [0-9]{2} [A-Z]{1}[a-z]{4} [0-9]{4} journal <- paste0(journal[1:2], collapse = '') date <- stringr::str_extract(journaldatelien,"[0-9]{2} ..... [0-9]{4}") date <- lubridate::dmy(date) # Synthétise les données dans un tableau TabRecap <- data.frame( Lien = lien, Titre = titre, Auteurs = auteurs, DatePublication = date, Journal = journal, Abstract = abstract, Text = text ) # Export du tableau en format xlsx # hors "projet R", ajouter le chemin d'accès vers le fichier xlsx::write.xlsx(TabRecap,'CAS2_tabrecap.xlsx',row.names = FALSE)