R语言 下载.文件保持原来的名称或表名

dldeef67  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(79)

我想在R中下载以下链接,在浏览器下载后保持文件名。http://www.coingecko.com/price_charts/export/1/usd.xls
请注意,如果您通过浏览器下载文件,文件名将是'btc-usd-max.xls'。然而,如果我运行以下代码,文件名将是'usd.xls'。然而,文件名'btc-usd-max.xls'传达了相关信息。是否可以使用R检索此'btc-usd-max'名称?

link <- 'http://www.coingecko.com/price_charts/export/1/usd.xls'
download.file(url=link, destfile=basename(link), method='auto')

字符串
以下主题中提供的解决方案无法解决此问题。R download.file to a folder keeping original name
上述解依赖于content-disposition,而content-disposition不存在。

library(httr)
hd <- HEAD(link)
filename <- gsub(".*name=", "", headers(hd)$`content-disposition`)


我试过从httr包中使用HEAD()命令,并使用download.file函数下载文件。

sdnqo3pr

sdnqo3pr1#

显示的文件名在一个名为content-disposition的响应头中,但只有当你从服务器获得一个状态200时才能显示。在httr中,默认的用户代理会导致服务器返回一个状态403,而不返回这个头,所以你需要添加一个服务器将响应的用户代理。
一旦这样做了,它是相当容易提取文件名。

library(httr)

url <- 'http://www.coingecko.com/price_charts/export/1/usd.xls'
UA <- "Mozilla/5.0 (Windows NT 6.1; rv:85.0) Gecko/20100101 Firefox/85.0"
res <- GET(url, user_agent(UA))
filename <- strsplit(res$headers$`content-disposition`, '\"')[[1]][2]

字符串
现在我们有

filename
#> [1] "btc-usd-max.xls"


我们可以这样写结果:

writeBin(res$content, filename)


但奇怪的是,实际的二进制数据似乎是CSV格式而不是xls格式(当我试图在Excel中打开它时,无论是在R中下载还是直接在浏览器中下载,我都会收到警告)。

data <- read.csv(text = content(res, 'text'))


然后将data写入根据文件名命名的Excel工作表。

相关问题