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

Posted

技术标签:

【中文标题】如何使用 R 登录然后从 aspx 网页下载文件【英文标题】:How to login and then download a file from aspx web pages with R 【发布时间】:2013-04-06 16:25:04 【问题描述】:

我正在尝试使用 R 自动下载this web page 上可用的收入动态面板研究文件。单击这些文件中的任何一个都会将用户带到this login/authentication page。身份验证后,您可以使用 Web 浏览器轻松下载文件。不幸的是,下面的httr 代码似乎没有维护身份验证。我曾尝试在 Chrome 中检查 Login.aspx 页面 (as described here) 中的 Headers,但即使我相信我传递了所有正确的值,它似乎也无法维持身份验证。我不在乎它是用httrRCurl 还是其他东西完成的,我只是喜欢在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 并在每次进一步调用时传递它 - 参见例如***.com/a/15451157/564164 @daroczig 谢谢..我昨天真的尝试复制那个,它没有用。 :( 可能还有其他事情发生吗? 【参考方案1】:

除了在身份验证后存储 cookie(参见我上面的评论),您的解决方案中还有另一个问题点:ASP.net 站点在 cookie 中设置了一个 VIEWSTATE 键值对,该键值对将在您的查询中保留 -如果您检查,您甚至无法在您的示例中登录(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

【讨论】:

是的!!!!!!!那行得通。谢谢!! :) 这是得到我想要的最后两行:file &lt;- getBinaryURL("http://simba.isr.umich.edu/Zips/GetFile.aspx?file=1053", curl=curl)writeBin( file , "c:/temp/thefile.zip" ) 酷,我很高兴能帮上忙。 @daroczig 我对不同的 .NET 站点有类似的查询。如果您希望我打开一个新线程,请告诉我。 @daroczig 打开了一个新线程:***.com/questions/45372987/login-to-net-site-using-r

以上是关于如何使用 R 登录然后从 aspx 网页下载文件的主要内容,如果未能解决你的问题,请参考以下文章

打开网页然后下载文件 C#

直接从网页下载并导入文件到 R 环境

如何直接在网页中打开文件 不出现下载保存提示框!

如何查看网盘视频时长

使用 R 下载文件,给出 JavaScript 语句

ftp如何从网页登陆?