我正在尝试自动下载 this web page 上可用的收入动态面板研究文件。使用 R。单击这些文件中的任何一个都会将用户带到 this login/authentication page .身份验证后,可以使用 Web 浏览器轻松下载文件。不幸的是,httr
下面的代码似乎没有维护身份验证。我试过检查 Headers
在 Chrome 中的 Login.aspx 页面( as described here ),但即使我相信我传递了所有正确的值,它似乎也没有保持身份验证。我不在乎它是否完成了 httr
或 RCurl
或者其他什么,我只是想要在 R 中工作的东西,所以我不需要让这个脚本的用户必须手动下载文件或使用一些完全独立的程序。我对此的尝试之一如下,但它不起作用。任何帮助,将不胜感激。谢谢!! :D
require(httr)
values <-
list(
"ctl00$ContentPlaceHolder3$Login1$UserName" = "you@email.com" ,
"ctl00$ContentPlaceHolder3$Login1$Password" = "somepassword" ,
"ctl00$ContentPlaceHolder3$Login1$LoginButton" = "Log In" ,
"_LASTFOCUS" = "" ,
"_EVENTTARGET" = "" ,
"_EVENTARGUMENT" = ""
)
POST( "http://simba.isr.umich.edu/u/Login.aspx?redir=http%3a%2f%2fsimba.isr.umich.edu%2fZips%2fZipMain.aspx" , body = values )
resp <- GET( "http://simba.isr.umich.edu/Zips/GetFile.aspx" , query = list( file = "1053" ) )
最佳答案
除了在身份验证后存储 cookie(请参阅我上面的评论)之外,您的解决方案还有另一个问题点:ASP.net 站点设置了 VIEWSTATE
cookie 中的键值对将保留在您的查询中 - 如果您检查,您甚至无法在您的示例中登录(POST
命令的结果包含有关如何登录的信息,只需检查一下)。
可能的解决方案概述:
RCurl
包裹:> library(RCurl)
curl
选项:> curl = getCurlHandle()
> curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl)
VIEWSTATE
:> html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl)
VIEWSTATE
使用正则表达式或任何其他工具:> viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
VIEWSTATE
:> params <- list(
'ctl00$ContentPlaceHolder3$Login1$UserName' = '<USERNAME>',
'ctl00$ContentPlaceHolder3$Login1$Password' = '<PASSWORD>',
'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In',
'__VIEWSTATE' = viewstate
)
> html = postForm('http://simba.isr.umich.edu/u/Login.aspx', .params = params, curl = curl)
恭喜,现在您已登录
curl
持有 cookie 来验证这一点! > grepl('Logout', html)
[1] TRUE
curl = curl
在您的所有查询中。 关于asp.net - 如何使用R登录然后从aspx网页下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853204/