httr:用POST()检索数据

cir*_*cld 8 html forms r http-post httr

免责声明:虽然我已经设法使用httr的POST函数从其他来源获取数据,但让我们知道我对httr和HTML表格一般都是完整的n00b.

我想使用httr从网站直接将一些数据带入R. 我的第一次尝试涉及将命名列表传递给body arg(如此插图中所示).但是,我注意到表单输入名称中的方括号(至少我认为它们是表单输入参数).所以相反,我尝试将字体作为字符串传递,因为我认为它应该出现在请求正文中:

url <- 'http://research.stlouisfed.org/fred2/series/TOTALSA/downloaddata'
query <- paste('form[native_frequency]=Monthly', 'form[units]=lin',
                'form[frequency]=Monthly', 'form[obs_start_date]="1976-01-01"',
                'form[obs_end_date]="2014-11-01"', 'form[file_format]=txt'
                sep = '&')
response <- POST(url, body = query)
Run Code Online (Sandbox Code Playgroud)

在任何情况下,上面的代码只返回网页源代码,我无法弄清楚如何正确提交表单,以便它返回与手动单击表单的"下载数据"按钮相同的数据.

在Chrome上的开发人员工具/网络中,它在Content-Disposition下的响应标题中指出,当我手动单击表单上的"下载数据"按钮时,会有一个包含数据的文本文件附件.它似乎不在上面代码中与响应对象关联的任何标头中.为什么POST请求不返回此文件 - 数据的文件在哪里?

感觉就像我错过了一些明显的东西.有人在乎帮助我连接点吗?

MrF*_*ick 7

通常,如果您要使用httr它,您可以让它为您构建和编码数据,您只需通过表单值列表传递信息.尝试

url<-"http://research.stlouisfed.org/fred2/series/TOTALSA/downloaddata"
query <- list('form[native_frequency]'="Monthly",
    'form[units]'="lin",
    'form[frequency]'="Monthly",
    'form[obs_start_date]'="1996-01-01",
    'form[obs_end_date]'="2014-11-01",
    'form[file_format]'="txt")
response <- POST(url, body = query)
content(response, "text")
Run Code Online (Sandbox Code Playgroud)

而回报看起来像

[1] "Title:               Total Vehicle Sales\r\nSeries ID:           TOTALSA\r\nSource:   
US. Bureau of Economic Analysis\r\nRelease:             Supplemental Estimates, Motor 
Vehicles\r\nSeasonal Adjustment: Seasonally Adjusted Annual Rate\r\nFrequency:           Monthly\r\nUnits:               
Millions of Units\r\nDate Range:          1996-01-01 to 2014-11-
01\r\nLast Updated:        2014-12-05 7:16 AM CST\r\nNotes:               \r\n\r\nDATE       
VALUE\r\n1996-01-01  14.8\r\n1996-02-01  15.6\r\n1996-03-01  16.0\r\n1996-04-01  15.5\r\n1996-05-01 
16.0\r\n1996-06-01  15.3\r\n1996-07-01  15.1\r\n1996-08-01  15.5\r\n1996-09-01  15.5\r\n1996-10-01   15.3\r
Run Code Online (Sandbox Code Playgroud)