我正在尝试编写一个代码,允许我从需要登录的安全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)。此外,有没有更好,更有效的方法来解决这个问题?
自动执行此过程对我来说非常重要,所以非常感谢您的帮助。
答案 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证书。