我是R编程的新手,我正在尝试将我在约翰霍普金斯大学数据科学系学习的一些知识付诸实践。具体来说,我想自动化从US Treasury website下载历史债券价格的过程

通过使用Firefox和R,我能够确定美国财政部网站使用了非常简单的HTML POST表单来为感兴趣的报价指定一个日期。然后,它返回所有未偿还债券的二级市场信息表。

我尝试使用两个不同的R程序包向美国财政部Web服务器提交请求未成功。野兔是我尝试过的两种方法:

尝试#1(使用RCurl):

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
td.html <- postForm(url,
                    submit = "Show Prices",
                    priceDate.year  = 2014,
                    priceDate.month = 12,
                    priceDate.day   = 15,
                   .opts = curlOptions(ssl.verifypeer = FALSE))

这将导致返回一个网页并将其存储在td.html中,但其中包含的只是来自Treasurydirect服务器的错误消息。我知道服务器正在工作,因为当我通过浏览器提交相同的请求时,我得到了预期的结果。

尝试#2(使用RVest):
s <- html_session(url)
f0 <- html_form(s)
f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
test <- submit_form(s, f1)

不幸的是,这种方法甚至都没有离开R并导致来自R的以下错误消息:
Submitting with 'submit'
Error in function (type, msg, asError = TRUE)  : <url> malformed

我似乎无法弄清楚如何查看发送给rvest的“格式错误”文本,以便我可以尝试诊断问题。

解决这个看似简单的任务的任何建议或技巧将不胜感激!

最佳答案

好吧,它似乎可以与httr库一起使用。

library(httr)

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"

fd <- list(
    submit = "Show Prices",
    priceDate.year  = 2014,
    priceDate.month = 12,
    priceDate.day   = 15
)

resp<-POST(url, body=fd, encode="form")
content(resp)
rvest库实际上只是httr的包装。看起来在没有服务器名称的情况下解释绝对URL并不能很好地完成工作。所以,如果你看
f1$url
# [1] /GA-FI/FedInvest/selectSecurityPriceDate.htm

您会看到它只包含路径而不是服务器名称。这似乎使httr困惑。如果你这样做
f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
f1$url <- url
test <- submit_form(s, f1)

这似乎有效。也许应该报告给rvest很大。 (在rvest_0.1.0上测试)

10-08 00:31