R - 使用RCurl发布登录表单

时间:2013-09-29 04:20:50

标签: r forms http-post rcurl

我是新手使用R发布表单然后从网上下载数据。我有一个问题可能很容易让那里的人发现我做错了什么,所以我感谢你的耐心等待。我有一台Win7 PC,Firefox 23.x是我的典型浏览器。

我正在尝试发布显示在

上的主要表单

http://www.aplia.com/

我有以下R脚本:

your.username <- 'username'
your.password <- 'password'
setwd( "C:/Users/Desktop/Aplia/data" )

require(SAScii) 
require(RCurl)
require(XML)
agent="Firefox/23.0" 

options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))
curl = getCurlHandle()
curlSetOpt(
cookiejar = 'cookies.txt' ,
useragent = agent,
followlocation = TRUE ,
autoreferer = TRUE ,
curl = curl
)

# list parameters to pass to the website (pulled from the source html)
params <-
list(
'userAgent' = agent,
'screenWidth' = "",
'screenHeight' = "",
'flashMajor' = "",
'flashMinor' = "",
'flashBuild' = "",
'flashPatch' = "",
'redirect' = "",
'referrer' = "http://www.aplia.com",
'txtEmail' = your.username,
'txtPassword' = your.password 
    )

# logs into the form
html = postForm('https://courses.aplia.com/', .params = params, curl = curl)
html

# download a file once form is posted
html <-
getURL(
"http://courses.aplia.com/af/servlet/mngstudents?ctx=filename" ,
curl = curl
)
html

但是从那里我可以告诉我没有得到我想要的页面,因为返回到html的是重定向消息,似乎要求我再次登录(?):

"\r\n\r\n<html>\r\n<head>\r\n    <title>Aplia</title>\r\n\t<script language=\"JavaScript\" type=\"text/javascript\">\r\n\r\n        top.location.href = \"https://courses.aplia.com/af/servlet/login?action=form&redirect=%2Fservlet%2Fmngstudents%3Fctx%3Dfilename\";\r\n    \r\n\t</script>\r\n</head>\r\n<body>\r\n    Click <a href=\"https://courses.aplia.com/af/servlet/login?action=form&redirect=%2Fservlet%2Fmngstudents%3Fctx%3Dfilename\">here</a> to continue.\r\n</body>\r\n</html>\r\n"

虽然我确实认为一旦表单成功发布(手动,在浏览器中),就会出现一系列重定向。如何判断表格是否正确发布?

我很确定,一旦我能够正确地使用该帖子,我就不会有任何问题指导R下载我需要的文件(本学期我500名学生的在线活动报告)。但花了几个小时研究这个并陷入困境。也许我需要在RCurl包中设置更多与cookie有关的选项(因为网站使用cookies)---?

任何帮助都非常感谢!!我通常使用R来处理统计数据,所以对这些包和函数来说是新手。

1 个答案:

答案 0 :(得分:5)

答案最终变得非常简单。出于某种原因,我没有看到需要包含在postForm中的一个选项:

html = postForm('https://courses.aplia.com/', .params = params, curl = curl, style="POST")

那就是......