在R中下载csv文件

Posted

技术标签:

【中文标题】在R中下载csv文件【英文标题】:download csv file in R 【发布时间】:2015-10-12 04:26:36 【问题描述】:

我正在尝试使用 R 从我的国家/地区下载历史股票交易。我尝试使用 download.file() 函数。实际上,下载了一个文件,但它是一个空的电子表格。显然,如果我在浏览器中使用此 url,我下载的文件实际上就是我想要的。

我很乐意使用 quantmod,但该软件包仅适用于更大的市场

url<-"https://www.ccbolsa.cl/apps/script/detalleaccion/Transaccion.asp?Nemo=AFPCAPITAL&Menu=H"
destfile <- "/home/hector/TxHistoricas.xls"
download.file(url, destfile)

提前致谢。

【问题讨论】:

我得到的只是一个 javascripthtml 文件。顺便说一句,您的代码中根本没有使用 httr 我认为它是一个 html 文件,在浏览器中打开时呈现为 excel 文件的外观。我可以通过浏览器打开它,但不能通过 R 打开。这不是你做错了什么,这与文件的性质有关。 【参考方案1】:

如果你不想使用 selenium,你可以进行这样的测试:

library(rvest)
library(httr)
library(stringr)

URL <- "https://www.ccbolsa.cl/apps/script/detalleaccion/Transaccion.asp?Nemo=AFPCAPITAL&Menu=H"

获取初始网址:

res <- html_session(URL, timeout(30))

它嵌入了一个表单,它使用javascript提交来获取表单:

inputs <- html_nodes(res, "input")

它使用最后一个 javascript 条目在页面加载时进行重定向,因此我们需要它的位置:

scripts <- html_nodes(res, "script")
action <- html_text(scripts[[length(scripts)]])

这是要提交到的新 URL:

base_url <- "https://www.ccbolsa.cl/apps/script/detalleaccion"
loc <- str_match(action, '\\.action *= *"(.*)"')[,2]
doc_url <- sprintf("%s/%s", base_url, loc)

收集所有查询参数:

query <- lapply(inputs, xml_attr, "value")
names(query) <- sapply(inputs, xml_attr, "name")

现在我们必须使用编码为“表单”的查询创建一个新的POST 请求,并使用并提供重定向 URL(我需要超时)。这会将“xls”内容写入文件:

ret <- POST(doc_url, 
            body=query, 
            encode="form",
            add_headers(Referer=URL),
            write_disk("fil.xls", overwrite=TRUE),
            timeout(30))

这是一个 XLS 文件:

ret$headers$`content-type`
## [1] "application/vnd.ms-excel"

但它实际上是一个 HTML 表格,所以你真的可以这样做:

ret <- POST(doc_url, 
            body=query, 
            encode="form",
            add_headers(Referer=URL),
            timeout(30))

doc <- read_html(content(ret, as="text"))
dat <- html_table(html_nodes(doc, "table"), fill=TRUE)

获取您要查找的内容(dat 列表中有两个丑陋的表,您可能希望使用header=TRUE 作为html_table 的附加参数)。

我不确定这个解决方案有多“动态”,但它是可测试/可验证的。

【讨论】:

当我运行这段代码时,我得到以下错误文档 非常感谢您的回答。但是我得到了一个巨大的物体,2467 个观测值,这很好,但是有 17240 个变量。生成的文件太大而无法正确处理。我可以更改任何参数来防止这种情况发生吗?。 是的,我看到了(表格转换花了这么长时间,我很惊讶!:-) 我在那个网站上没有帐户,甚至不知道我在看什么在数据方面,所以我不知道如何控制他们的行为。您可以将其缩减为仅您需要的变量。 最后,在列表中的两个对象中,只有一个包含我感兴趣的数据。具体来说,dat[[2]]。我正在使用这个数据框,它的大小也合适。非常感谢您的回答!

以上是关于在R中下载csv文件的主要内容,如果未能解决你的问题,请参考以下文章

R导入csv,标题上缺少逗号

在R语言 中如何把list对象逐行写入csv文件中

从R中的csv文件中删除多余的行,然后合并csv文件

ruby读取csv文件数据

R语言 CSV文件

在 R 中打开 CSV 文件时出现错误消息