R:使用rvest(或httr)登录需要cookie的站点

时间:2017-03-09 17:08:40

标签: r cookies rvest shibboleth httr

我正在尝试为R中的UK Data Service自动执行基于shibboleth的登录过程。一个人sign up for an account to login here。此问题automating the login to the uk data service website in R with RCurl or httr中可以找到先前尝试自动执行此过程。

我认为这个问题的优秀答案,how to authenticate a shibboleth multi-hostname website with httr in R,会让我在那里,但我已经撞墙了。

而且,是的,RSelenium提供了另一种选择 - which I've actually tried - 但我对RSelenium的体验是它总是剥落(更不用说它很难开始工作了)跨平台),虽然rvest / httr / RCurl解决方案不会中断,除非或直到网站发生变化并且很容易在其他人的计算机上工作。

无论如何,该网站要求您点击初始登录页面(并获取cookie),然后进入您的组织(点击并获取cookie),然后输入您的用户名和密码(cookies),然后(因为{ {1}}没有javascript)点击另一个Cookie修改页面,然后登陆"您的帐户"页。在我看来,所有步骤中的cookie都是必要的 - 最终表示您已登录(rvest)的cookie是由初始登录页面创建的。

所以这就是我到目前为止所拥有的。首先,进入组织页面并进入组织,从初始登录页面保存cookie(使用此处的技巧Submit form with no submit button in rvest),以应对提交按钮未激活的事实,直到进入组织)。

ASPSESSIONIDSQAQSSQA

然后,输入用户名和密码:

library(tidyverse)
library(rvest)
library(stringr)

org <- "your_organization"
user <- "your_username"
password <- "your_password"

signin <- "http://esds.ac.uk/newRegistration/newLogin.asp"
handle_reset(signin)

# get to org page and enter org
p0 <- html_session(signin) %>% 
    follow_link("Login")
org_link <- html_nodes(p0, "option") %>% 
    str_subset(org) %>% 
    str_match('(?<=\\")[^"]*') %>%
    as.character()

f0 <- html_form(p0) %>%
    first() %>%
    set_values(origin = org_link)
fake_submit_button <- list(name = "submit-btn",
                           type = "submit",
                           value = "Continue",
                           checked = NULL,
                           disabled = NULL,
                           readonly = NULL,
                           required = FALSE)
attr(fake_submit_button, "class") <- "btn-enabled"
f0[["fields"]][["submit"]] <- fake_submit_button

c0 <- cookies(p0)$value
names(c0) <- cookies(p0)$name
p1 <- submit_form(session = p0, form = f0, config = set_cookies(.cookies = c0))

# enter user and password f1 <- html_form(p1) %>% first() %>% set_values("j_username" = user, "j_password" = password) c1 <- cookies(p1)$value names(c1) <- cookies(p1)$name p2 <- submit_form(session = p1, form = f1, config = set_cookies(.cookies = c1)) 说&#34;由于您的浏览器不支持JavaScript,您必须按“继续”按钮一次以继续&#34;,所以:

p2$response

可悲的是,# click through f2 <- p2 %>% html_form() %>% first() c2 <- cookies(p2)$value names(c2) <- cookies(p2)$name p3 <- submit_form(p2, f2, config = set_cookies(.cookies = c2)) 实际上是在组织条目页面p3上重新启动,而不是最终成为&#34;您的帐户&#34;。

一个可能很重要的问题是,p0包含两个c2 Cookie,JSESSIONID显示的Cookie适用于不同的域。我不知道该怎么做 - 我已经尝试从cookies(p2)先放弃第一个而没有运气。有什么建议?谢谢!

0 个答案:

没有答案