如何使用R登录然后从aspx网页下载文件

Ant*_*ico 14 asp.net r download rcurl httr

我正在尝试使用R 自动下载此网页上可用的收入动态面板研究文件.点击任何这些文件会将用户带到此登录/身份验证页面.身份验证后,可以使用Web浏览器轻松下载文件.不幸的是,下面的代码似乎没有维护身份验证.我已经尝试在Chrome中检查Login.aspx页面(如此处所述),但即使我认为我传递了所有正确的值,它似乎也不会保持身份验证.如果是与做我不关心或者还是其他什么东西,我只是喜欢的事,在'r的作品,所以我不需要有此脚本的用户必须手动或使用一些完全独立的程序下载的文件.我对此的尝试之一如下,但它不起作用.任何帮助,将不胜感激.谢谢!!:dhttrHeadershttrRCurl

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" ) )
Run Code Online (Sandbox Code Playgroud)

dar*_*zig 11

除了在认证后存储cookie(参见我的上述评论)之外,您的解决方案中还有另一个问题点:ASP.net站点VIEWSTATE在cookie中设置一个键值对,将在您的查询中保留 - 如果您检查,您可以甚至没有在你的例子中登录(POST命令的结果包含有关如何登录的信息,只需检查出来).

概述可能的解决方案:

  1. 加载RCurl包:

    > library(RCurl)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置一些方便的curl选项:

    > curl = getCurlHandle()
    > curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 第一次加载页面来捕获VIEWSTATE:

    > html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl)
    
    Run Code Online (Sandbox Code Playgroud)
  4. VIEWSTATE使用正则表达式或任何其他工具提取:

    > viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将参数设置为您的用户名,密码VIEWSTATE:

    > params <- list(
        'ctl00$ContentPlaceHolder3$Login1$UserName'    = '<USERNAME>',
        'ctl00$ContentPlaceHolder3$Login1$Password'    = '<PASSWORD>',
        'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In',
        '__VIEWSTATE'                                  = viewstate
        )
    
    Run Code Online (Sandbox Code Playgroud)
  6. 最后登录:

    > html = postForm('http://simba.isr.umich.edu/u/Login.aspx', .params = params, curl = curl)
    
    Run Code Online (Sandbox Code Playgroud)

    恭喜,现在您已登录并curl持有验证该cookie的cookie!

  7. 验证您是否已登录:

    > grepl('Logout', html)
    [1] TRUE
    
    Run Code Online (Sandbox Code Playgroud)
  8. 因此,您可以继续下载任何文件 - 只需确保传递curl = curl所有查询.

  • 是!!!!!!!有效.谢谢!!:)这里是得到我想要的两个最后一行:`file < - getBinaryURL("http://simba.isr.umich.edu/Zips/GetFile.aspx?file=1053",curl = curl)`和`writeBin(file,"c:/temp/thefile.zip")` (2认同)