使用R从https下载具有登录凭据

时间:2015-06-23 19:04:09

标签: r https finance downloading rcurl

我正在尝试编写一个代码,允许我从需要登录的安全https网站下载.xls文件。这对我来说非常困难,因为我没有网络编码的经验 - 我所有的R经验都来自于随时可用的数据集的计量经济学工作。

我跟着this thread来帮助编写一些代码,但我认为我遇到了麻烦,因为示例是http,我需要https。

这是我的代码:

install.packages("RCurl")
library(RCurl)

curl = getCurlHandle()
curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer =  TRUE, curl = curl)

html <- getURL('https://jump.valueline.com/login.aspx', curl = curl)

viewstate <- as.character(sub('.*id="_VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))

params <- list(
    'ct100$ContentPlaceHolder$LoginControl$txtUserID' = 'MY USERNAME',
    'ct100$ContentPlaceHolder$LoginControl$txtUserPw' = 'MY PASSWORD',
    'ct100$ContentPlaceHolder$LoginControl$btnLogin' = 'Sign In',
    '_VIEWSTATE' = viewstate)

html <- postForm('https://jump.valueline.com/login.aspx', .params = params, curl = curl)

当我开始运行那个开始的那个&#34; html&lt; - getURL(......&#34;我得到:

> html <- getURL('https://jump.valueline.com/login.aspx', curl = curl)
Error in function (type, msg, asError = TRUE)  : 
SSL certificate problem: unable to get local issuer certificate

有解决方法吗?我如何能够访问本地发行人证书?

我读到添加&#39; .opts = list(ssl.verifypeer = FALSE)&#39;进入curlSetOpt可以解决这个问题,但是当我添加它时,getURL运行,但是postForm行给了我

> html <- postForm('https://jump.valueline.com/login.aspx', .params = params, curl = curl)
Error: Internal Server Error

除此之外,在我尝试访问的网站上,此代码看起来是否有效?我进入检查员,并将所有参数更改为我的网页正确,但由于我不熟悉网络编码,我不是100%我抓到了正确的东西(特别是VIEWSTATE)。此外,有没有更好,更有效的方法来解决这个问题?

自动执行此过程对我来说非常重要,所以非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

尝试httr:

library(httr)
html <- content(GET('https://jump.valueline.com/login.aspx'), "text")

viewstate <- as.character(sub('.*id="_VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))

params <- list(
  'ct100$ContentPlaceHolder$LoginControl$txtUserID' = 'MY USERNAME',
  'ct100$ContentPlaceHolder$LoginControl$txtUserPw' = 'MY PASSWORD',
  'ct100$ContentPlaceHolder$LoginControl$btnLogin' = 'Sign In',
  '_VIEWSTATE' = viewstate
)
POST('https://jump.valueline.com/login.aspx', body = params)

这仍然给我一个服务器错误,但这可能是因为你没有在正文中发送正确的字段。

答案 1 :(得分:-1)

html <- getURL('https://jump.valueline.com/login.aspx', curl = curl, ssl.verifypeer = FALSE)

这对你有用。您获得的错误可能是因为libcurl不知道在哪里可以获取SSL证书。