Я пытаюсь создать базу данных с помощью rvest. Поскольку у меня много данных для загрузки, я попытался написать несколько функций, которые позволили бы мне прервать процесс очистки и перезапустить его там, где я его оставил. Однако, хотя функции работают более или менее, всякий раз, когда я вручную прерываю их, я теряю вывод. Кто-нибудь знает решение, которое позволило бы мне остановить функцию без потери кадра данных, который создает l oop? Буду рад любому совету!
Некоторые URL, с которых я пытаюсь очистить данные:
to_do <- c("https://jobs.51job.com/shenzhen-nsq/116924235.html?s=01&t=0",
"https://jobs.51job.com/shenzhen-nsq/116923692.html?s=01&t=0",
"https://jobs.51job.com/shenzhen-nsq/116923628.html?s=01&t=0",
"https://jobs.51job.com/shenzhen-nsq/116923578.html?s=01&t=0",
"https://jobs.51job.com/shenzhen-nsq/116920896.html?s=01&t=0")
Функции, которые я создал для загрузки:
# In order to initiate the dowload
dl_data_start <- function(to_do){
output <- tibble()
i = 1
while (to_do[i] %in% to_do) {
page <- read_html(to_do[i])
position <- page %>%
html_nodes(.,'h1') %>%
html_text(.)
resume <- page %>%
html_nodes(.,'.ltype') %>%
html_text(.)
job_offer <- page %>%
html_nodes(.,'.job_msg') %>%
html_text(.)
eps <- page %>%
html_nodes(.,'.com_msg') %>%
html_text(.)
eps_status <- page %>%
html_nodes(.,'.at:nth-child(1)') %>%
html_text(.)
eps_description <- page %>%
html_nodes(.,'.tmsg') %>%
html_text(.)
employees <- page %>%
html_nodes(.,'.at:nth-child(2)') %>%
html_text(.)
category <- page %>%
html_nodes(.,'.at:nth-child(3)') %>%
html_text(.)
salary <- page %>%
html_nodes(.,'.cn strong') %>%
html_text(.)
url <- to_do[i]
id <- i
current <- tibble(position,resume,job_offer,eps,eps_description,eps_status,
employees,category,salary,url,id)
output <- bind_rows(output,current)
print(output[i,])
i = i + 1
}
return(output)
}
# function in order to continue the download where I left it
dl_data_continue <- function(to_do,df,done){
i = (match(tail(done,n=1),to_do) + 1)
while (to_do[i] %in% to_do) {
page <- read_html(to_do[i])
position <- page %>%
html_nodes(.,'h1') %>%
html_text(.)
resume <- page %>%
html_nodes(.,'.ltype') %>%
html_text(.)
job_offer <- page %>%
html_nodes(.,'.job_msg') %>%
html_text(.)
eps <- page %>%
html_nodes(.,'.com_msg') %>%
html_text(.)
eps_status <- page %>%
html_nodes(.,'.at:nth-child(1)') %>%
html_text(.)
eps_description <- page %>%
html_nodes(.,'.tmsg') %>%
html_text(.)
employees <- page %>%
html_nodes(.,'.at:nth-child(2)') %>%
html_text(.)
category <- page %>%
html_nodes(.,'.at:nth-child(3)') %>%
html_text(.)
salary <- page %>%
html_nodes(.,'.cn strong') %>%
html_text(.)
url <- to_do[i]
id <- i
current <- tibble(position,resume,job_offer,eps,eps_description,eps_status,
employees,category,salary,url,id)
df <- bind_rows(df,current)
print(df[i,])
i = i + 1
}
return(df)
}
Проблема, с которой я столкнулся, заключается в том, что всякий раз, когда я прерываю l oop или когда происходит ошибка, я теряю все данные. Кто-нибудь может решить эту проблему? Я попробовал несколько вещей, таких как безопасно или tryCatch, но я не могу понять, что здесь не так. Большое спасибо.
Редактировать: Я также сделал несколько попыток с tryCatch. Используя приведенную ниже функцию, код больше не прерывается при возникновении проблемы (например, ошибка HTTP 404). Однако, когда есть ошибка, l oop останется застрявшей в проблемной итерации c, поэтому я должен использовать ее неправильно.
dl_data_continue_2 <- function(to_do,df,done){
i = (match(tail(done,n=1),to_do) + 1)
while (to_do[i] %in% to_do) {
tryCatch(
{expr =
page <- read_html(to_do[i])
position <- page %>%
html_nodes(.,'h1') %>%
html_text(.)
resume <- page %>%
html_nodes(.,'.ltype') %>%
html_text(.)
job_offer <- page %>%
html_nodes(.,'.job_msg') %>%
html_text(.)
eps <- page %>%
html_nodes(.,'.com_msg') %>%
html_text(.)
eps_status <- page %>%
html_nodes(.,'.at:nth-child(1)') %>%
html_text(.)
eps_description <- page %>%
html_nodes(.,'.tmsg') %>%
html_text(.)
employees <- page %>%
html_nodes(.,'.at:nth-child(2)') %>%
html_text(.)
category <- page %>%
html_nodes(.,'.at:nth-child(3)') %>%
html_text(.)
salary <- page %>%
html_nodes(.,'.cn strong') %>%
html_text(.)
url <- to_do[i]
id <- i
current <- tibble(position,resume,job_offer,eps,eps_description,eps_status,
employees,category,salary,url,id)
df <- bind_rows(df,current)
print(df[i,])
i = i + 1},
error = function(e){
message("* Caught an error on itertion ")
print(e)
i = i + 1
}
)
}
out
}
Используя безопасно, я в основном пытался
library(purrr)
dl_safely <- safely(dl_data_continue)