[英]How can I POST a simple HTML form in R?
我对R编程比较陌生,我试图将我在Johns Hopkins数据科学专业中学到的一些东西用于实际应用。 具体来说,我想自动化从美国财政部网站下载历史债券价格的过程
使用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
测试rvest_0.1.0
)
我知道这是一个老问题,但添加了
style='POST'
postForm
参数也可以postForm
问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.