如何在使用download.file之前检查url中是否存在文件



我有一个问题,不知道如何解决。我有一个url列表,可以直接下载一些文件。

例如。

x<-list("https://www.ecb.europa.eu/paym/coll/assets/html/dla/ea_MID/ea_csv_200219.csv",
"http://sdw.ecb.europa.eu/quickviewexport.do?SERIES_KEY=120.EXR.M.USD.EUR.SP00.A&type=csv")
name_file<-list("name_1.csv","name_2.csv")

在这种情况下,下面的脚本运行良好,但如果一个或多个url不起作用,tryCatch不会向我返回消息。请有人帮我,告诉我哪里错了?

for(i in seq_along(x)) {
x<-as.character(x[i])
nse.folder = paste0("directory_files/",name_file[i])
tryCatch({download.file(x, destfile = nse.folder, method='curl')}, error = function(e) "Error: this url doesn't work!")
Sys.sleep(4)
}

为了测试我剪切的脚本,例如url,如下所示:

x<-list("https://www.ecb.europa.eu/paym/coll/assets/html/dla/ea_MID/",
"http://sdw.ecb.europa.eu/quickviewexport.do?")

我应该在哪里改进代码?

提前感谢

您可以使用HEAD请求。在R中,它在包httr中可用。返回代码可以在维基百科上找到。这个SO帖子可能很有用。

一个非常简单的功能可以是

urlFileExist <- function(url){
HTTP_STATUS_OK <- 200
hd <- httr::HEAD(url)
status <- hd$all_headers[[1]]$status
list(exists = status == HTTP_STATUS_OK, status = status)
}
lapply(x, urlFileExist)
#[[1]]
#[[1]]$exists
#[1] TRUE
#
#[[1]]$status
#[1] 200
#
#
#[[2]]
#[[2]]$exists
#[1] TRUE
#
#[[2]]$status
#[1] 200

最新更新