我正在尝试自动下载收入动态面板研究文件可在这个网页 http://simba.isr.umich.edu/Zips/ZipMain.aspx使用 R。单击这些文件中的任何一个都会使用户进入此登录/认证页面 http://simba.isr.umich.edu/u/Login.aspx。身份验证后,可以使用网络浏览器轻松下载文件。不幸的是,httr
下面的代码似乎没有维护身份验证。我尝试过检查Headers
在 Chrome 中的 Login.aspx 页面 (如此处所述 https://stackoverflow.com/questions/10213194/use-rcurl-to-bypass-disclaimer-page-then-do-the-web-scrapping),但即使我相信我传递了所有正确的值,它似乎也无法维持身份验证。我不在乎它是否完成httr
or RCurl
或者其他什么,我只是想要在 R 内部工作的东西,这样我就不需要这个脚本的用户必须手动下载文件或使用一些完全独立的程序下载文件。我对此的尝试之一如下,但它不起作用。任何帮助,将不胜感激。谢谢!! :D
require(httr)
values <-
list(
"ctl00$ContentPlaceHolder3$Login1$UserName" = "[email protected] /cdn-cgi/l/email-protection" ,
"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
命令包含有关如何登录的信息,只需查看即可)。
可能的解决方案的概述:
-
Load 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)
-
Extract VIEWSTATE
使用正则表达式或任何其他工具:
> viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
-
设置参数为您的用户名、密码and the 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
在您的所有查询中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)