Нужна помощь в очистке большого архива

#r #web-scraping

#r #веб-очистка

Вопрос:

Для школьного проекта мне нужно очистить веб-сайт, что не является проблемой. Но для того, чтобы он назывался BigData, я хотел очистить весь архив (за последние 5 лет). Единственное, что меняется в URL-адресе, — это дата в конце URL-адреса, но я не знаю, как написать скрипт, который изменяет только дату в конце.

Веб-сайт, который я использую, таков: https://www.ongelukvandaag.nl/archief / .

И нужные мне даты — с 01-01-2015 по 24-09-2020. Первую часть кода я уже понял, и я могу очистить 1 страницу. Я новичок в использовании R и хотел бы знать, может ли кто-нибудь мне помочь. Код показан ниже. Заранее спасибо!

Это то, что я получил до сих пор, и ошибки находятся под кодом.

 install.packages("XML")
install.packages("reshape")
install.packages("robotstxt")
install.packages("Rcrawler")
install.packages("RSelenium")
install.packages("devtools")
install.packages("exifr")
install.packages("Publish")

devtools::install_github("r-lib/xml2")

library(rvest)
library(dplyr)
library(xml)
library(stringr)
library(jsonlite)
library(xml12)
library(purrr)
library(tidyr)
library(reshape)
library(XML)
library(robotstxt)
library(Rcrawler)
library(RSelenium)
library(ps)
library(devtools)
library(exifr)
library(Publish)

#Create an url object

url<-"https://www.ongelukvandaag.nl/archief/%d "

#Verify the web can be scraped

paths_allowed(paths = c(url))

#Obtain the links for every day from 2015 to 2020

map_df(2015:2020, function(i){
  page<-read_html(sprintf(url,i))
  
  data.frame(Links = html_attr(html_nodes(page, ".archief a"),"href"))
}) -> Links %>%
  
Links$Links<-paste("https://www.ongelukvandaag.nl/",Links$Links,sep = "")

#Scrape what you want from each link:
  
d<- map(Links$Links, function(x) {
    
    Z <- read_html(x)
    
    Date <- Z %>% html_nodes(".text-muted") %>% html_text(trim = TRUE) # Last update
    All_title <- Z %>% html_nodes("h2") %>% html_text(trim = TRUE) # Title
    
    return(tibble(All_title,Date))
    
  })
  

Ошибки, которые я получаю:

 Error in open.connection(x, "rb") : HTTP error 400. 

in paste("https://www.ongelukvandaag.nl/", Links$Links, sep = "") :   object 'Links' not found >

in map(Links$Links, function(x) { : object 'Links' not found
  

и пакеты «xml12» и «xml» не работают в этой версии RStudio

Комментарии:

1. Что вы имеете в виду, «xml» и «xml12» не работают? Какие версии R у вас есть?

2. В xml CRAN xml12 нет таких пакетов, как (все в нижнем регистре) и .

3. Я бы просто указал, что было бы безопаснее (1) создать объект для каждой страницы, которую вы повторяете, (2) создать отказоустойчивую оболочку для вашего read_html() или (3) сохранить локальную копию html’а в кэше. Если вы очищаете список из сотен URL-адресов, вероятность того, что либо сервер, либо ваше соединение завершится неудачно / будет заблокировано, довольно высока, и вы можете потерять все, что вы уже собрали в памяти через цикл map () до этого момента, довольно высока.

Ответ №1:

Взгляните на мой код и мои комментарии:

 library(purrr)
library(rvest) # don't load a lot of libraries if you don't need them
url <- "https://www.ongelukvandaag.nl/archief/"
bigdata <- 
  map_dfr(
    2015:2020,
    function(year){
      year_pg <- read_html(paste0(url, year))
      list_dates <- year_pg %>% html_nodes(xpath = "//div[@class='archief']/a") %>% html_text() # in case some dates are missing
      map_dfr(
        list_dates,
        function(date) {
          pg <- read_html(paste0(url, date))
          items <- pg %>% html_nodes("div.full > div.row")
          items <- items[sapply(items, function(x) length(x %>% html_node(xpath = "./descendant::h2"))) > 0] # drop NA items
          data.frame(
            date = date,
            title = items %>% html_node(xpath = "./descendant::h2") %>% html_text(),
            update = items %>% html_node(xpath = "./descendant::h4") %>% html_text(),
            image = items %>% html_node(xpath = "./descendant::img") %>% html_attr("src") 
          )
        }
      )
    }
  )
  

Комментарии:

1. большое спасибо за помощь! теперь я, наконец, могу продолжить свою статью

2. @FlorisEvers Примите мой ответ, если он вам поможет.