在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)
提前致谢。
【问题讨论】:
我得到的只是一个 javascript 的 html 文件。顺便说一句,您的代码中根本没有使用 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文件的主要内容,如果未能解决你的问题,请参考以下文章