Как сохранить результаты из цикла для веб-создания с помощью rvest в R

#r #loops #web-scraping #rvest #tibble

Вопрос:

Я пытаюсь импортировать базу данных с одного и того же веб-сайта, но на разных вкладках.

 # webscraping para idh

algo <- c(1996:2017)

idh_link <- c(paste0("https://datosmacro.expansion.com/idh?anio=", 1996:2017))
final <- vector(length = length(idh_link))

for (i in seq_along(algo)) {
idh_desc <- read_html(idh_link[i])

pais <- idh_desc %>% 
  html_nodes("td:nth-child(1), .header:nth-child(1)") %>% 
  html_text()

idhaño <- idh_desc %>% 
  html_nodes("td:nth-child(2), .header:nth-child(2)") %>% 
  html_text()

final[i] <- tibble(pais, idhaño)
}
 

В этом случае он только восстанавливает информацию из первой ссылки и не создает тиббл в конце цикла (идея состоит в том, чтобы выполнить внутреннее соединение со всеми тибблами).

Я использую library(rvest) для создания веб — страниц

Ответ №1:

Векторы не могут хранить данные.кадры/фрагменты. Векторы могут хранить только атомарные объекты, такие как целые числа, строки символов и т. Д.

Для хранения серии кадров данных лучше всего использовать список.

 algo <- c(1996:2017)

idh_link <- c(paste0("https://datosmacro.expansion.com/idh?anio=", 1996:2017))
#data structure to store a series of data frames
final <- list()

for (i in seq_along(algo)) {
   idh_desc <- read_html(idh_link[i])
   
   pais <- idh_desc %>% 
      html_nodes("td:nth-child(1), .header:nth-child(1)") %>% 
      html_text()
   
   idhaño <- idh_desc %>% 
      html_nodes("td:nth-child(2), .header:nth-child(2)") %>% 
      html_text()
   
   #name the list elements with the year information
   final[[as.character(algo[i])]] <- tibble(pais, idhaño)

   #add a pause so not to "attack" the server
   Sys.sleep(1)
}
 

Чтобы объединить все фреймы данных, хранящиеся в списке, я бы рекомендовал bind_rows() использовать пакет dplyr или bind_cols() из него.