使用Rselenium / PhantomJS进行http身份验证

时间:2017-05-04 20:54:04

标签: r selenium phantomjs rvest

Rselenium很新,与Chrome合作进行调试,然后转移到PhantomJS进行制作(因为我可以在没有浏览器窗口的情况下循环运行脚本)。

我正在尝试搜索一个具有漂亮的香草认证弹出窗口的https网站。当我使用Chrome时,我可以使用格式https://user:pass@www.somewebsite.com。然而,似乎当我使用phantomjs时,这将无法工作。有没有一种方法可以使用RSelenium驱动PhantomJS管理凭证?

如果没有,是否有更好的方法?具有讽刺意味的是,我可以使用rvest / httr登录网站...问题是它非常重要,我真的需要RSelenium来导航并最终得到我需要的数据。

一些示例代码,但遗憾的是我无法提供我引用的受密码保护的网站:

library(RSelenium)
library(httr)
library(wdman)
selCommand<-wdman::selenium(jvmargs = c("-Dwebdriver.chrome.verboseLogging=true"),
                        retcommand = TRUE)
cat(selCommand)
#start Selenium server via shell script

remDr <- remoteDriver(port = 4567L, browserName = "chrome")
#remDr <- remoteDriver(port = 4567L, browserName = "phantomjs")
remDr$open()
remDr$navigate("https://user:pass@www.somewebiste.com") #works with chrome, 
                                                        #does not work with PhantomJS

任何帮助表示赞赏,谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用Cookie登录使用getAllCookies。然后,在PhantomJS浏览器中,调用addCookie

答案 1 :(得分:0)

首先应该是http而不是https

library(RSelenium)

rD <- rsDriver(browser = "phantom")
remDr <- rD$client

remDr$navigate("http://user:passwd@httpbin.org/basic-auth/user/passwd")
> remDr$getPageSource()[[1]]
[1] "<html><head></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\">{\n  \"authenticated\": true, \n  \"user\": \"user\"\n}\n</pre></body></html>"
rm(rD)
gc()

或者,如果这不起作用,您可以设置自定义标题:

base64pw <- paste("Basic", 
                  base64enc::base64encode(charToRaw("user:passwd")))
eCaps <- list( "phantomjs.page.customHeaders.Authorization" = base64pw)
rD <- rsDriver(browser = "phantom", extraCapabilities = eCaps)
remDr <- rD$client

remDr$navigate("http://httpbin.org/basic-auth/user/passwd")
> remDr$getPageSource()[[1]]
[1] "<html><head></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\">{\n  \"authenticated\": true, \n  \"user\": \"user\"\n}\n</pre></body></html>"
rm(rD)
gc()