r - 在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?")
我应该在哪里改进代码?
先感谢您
解决方案
您可以使用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
推荐阅读
- python - 尝试使用 Def 退出 ForLoop 时出现语法错误
- woocommerce - 在 woocommerce 管理产品列表中为特定产品属性添加过滤器下拉列表
- zeromq - 看不懂zeromq的repo策略
- node.js - 为什么 puppeteer 报告“UnhandledPromiseRejectionWarning:错误:导航失败,因为浏览器已断开连接!”?
- arrays - Swift 抱怨未声明的类型,但这似乎不是问题
- javascript - 没有互联网时如何显示自定义错误消息
- python - 生日悖论 - 如何绘制
- sql - 为什么我们需要主键?
- python - 如何使用 web3.py 在给定的 ETH 地址获取特定的代币余额
- reactjs - “react-bootstrap”不包含名为“Card”的导出