首页 > 解决方案 > 在R中使用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?")

我应该在哪里改进代码?

先感谢您

标签: rtry-catchrcurl

解决方案


您可以使用HEAD请求。在 R 中,它在 package 中可用httr。返回代码可以在Wikipedia上找到。这个SO post可能有用。

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

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

推荐阅读