并行运行 RSelenium

Posted

技术标签:

【中文标题】并行运行 RSelenium【英文标题】:Run RSelenium in parallel 【发布时间】:2016-12-21 09:58:14 【问题描述】:

我将如何并行运行RSelenium

以下是并行使用rvest的示例

library(RSelenium)
library(rvest)
library(magrittr)
library(foreach)
library(doParallel)

URLsPar <- c("http://www.example.com/", "http://s5.tinypic.com/n392s6_th.jpg", "http://s5.tinypic.com/jl1jex_th.jpg",
         "http://s6.tinypic.com/16abj1s_th.jpg", "http://s6.tinypic.com/2ymvpqa_th.jpg")

(detectCores() - 1) %>%  makeCluster %>% registerDoParallel

ws <- foreach(x = 1:length(URLsPar), .packages = c("rvest", "magrittr", "RSelenium"))  %dopar%  
      URLsPar[x] %>% read_html %>% as("character")

stopImplicitCluster()

【问题讨论】:

使用remoteDriver 类的open 方法为每个实例打开一个单独的浏览器。就您的工作流程而言,seleniumPipes 可能是合适的github.com/johndharrison/seleniumPipes 我有几千个 url,假设我在 registerDoParallel 中有 3 个核心,我需要在 foreach 之前 open 3 个实例吗?我不知道seleniumPipes!谢谢 【参考方案1】:

在集群中的每个节点上启动一个remoteDriver:

library(RSelenium)
library(rvest)
library(magrittr)
library(foreach)
library(doParallel)

URLsPar <- c("http://www.bbc.com/", "http://www.cnn.com", "http://www.google.com",
             "http://www.yahoo.com", "http://www.twitter.com")
appHTML <- c()
# start a Selenium Server
selServ <- startServer()

(cl <- (detectCores() - 1) %>%  makeCluster) %>% registerDoParallel
# open a remoteDriver for each node on the cluster
clusterEvalQ(cl, 
  library(RSelenium)
  remDr <- remoteDriver()
  remDr$open()
)
myTitles <- c()
ws <- foreach(x = 1:length(URLsPar), .packages = c("rvest", "magrittr", "RSelenium"))  %dopar%  
  remDr$navigate(URLsPar[x])
  remDr$getTitle()[[1]]


# close browser on each node
clusterEvalQ(cl, 
  remDr$close()
)

stopImplicitCluster()
# stop Selenium Server
selServ$stop()

> ws
[[1]]
[1] "BBC - Homepage"

[[2]]
[1] "CNN - Breaking News, U.S., World, Weather, Entertainment & Video News"

[[3]]
[1] "Google"

[[4]]
[1] "Yahoo"

[[5]]
[1] "Welcome to Twitter - Login or Sign up"

【讨论】:

@jdharrsion:是否可以使用 Parallel 在单个 Firefox 实例上打开多个选项卡?我知道所有并行实例的环境都不同,但仍然想知道是否可能 如何使用 docker 实现这一点。我试过上面的代码,只是在remDr的括号中插入remoteServerAddr = "192.168.99.100", port = 4445L, browserName = "chrome",但是它返回一个错误处理命令时发生未知的服务器端错误。

以上是关于并行运行 RSelenium的主要内容,如果未能解决你的问题,请参考以下文章

Promise.all 同时或并行运行 [重复]

并行运行异步查询 (IAsyncEnumerable)

并行运行 RSelenium

如何并行运行机器人框架测试用例而不是并行测试套件?

如何将python for循环从顺序转换为并行运行

verilog 中啥语句并行运行啥时候顺序运行!搞不懂 请教高手!