我想在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`)

我已经try 使用HTtr包中的head()命令,并使用Download.file函数下载文件.

推荐答案

显示的文件名位于名为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格式(当我try 在Excel中打开它时,无论是以R格式下载还是直接在浏览器中下载,我都会收到警告).您可能更喜欢将其作为CSV阅读,使用:

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

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

R相关问答推荐

如果行和列名以相同的开头,将矩阵值设置为0

如何删除gggvenn与gggplot绘制的空白?

当两个图层映射到相同的美学时,隐藏一个图层的图例值

将向量组合到一个数据集中,并相应地命名行

如何在geom_col中反转条

汇总数据表中两个特定列条目的值

在ggplot2的框图中绘制所有级别的系数

SHINY:使用JS函数应用的CSS样式显示HTML表格

基于Key->Value数据帧的基因子集相关性提取

如何将一个方阵分解成没有循环的立方体

如何将一些单元格的内容随机 Select 到一个数据框中?

远离理论值的伽马密度曲线下面积的近似

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

将多个列合并为一个列的有效方法是什么?

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

在REST API中使用参数R

Ggplot2:添加更多特定 colored颜色 的线条

为什么R列名称忽略具有指定名称的向量,而只关注索引?

以列名的字符向量作为参数按行应用自定义函数