Mis*_*lav 12 foreach selenium r rselenium azure-batch
我在Windows 7上使用R的最新版本.
我想用RSelenium这样的方法并行运行很多测试,我的问题是:
RSelenium测试的方法是什么?假设我想进行1000次测试,每步需要1小时.逐个运行测试需要花费很多时间(每天24次测试,因此总共需要42天).我知道如何使用doParallel和foreach包在我的机器上并行运行测试:并行运行RSelenium,但有时,这还不够.我想并行运行大约100个测试.我尝试使用Azure Batch,但在启动selenium服务器时在某些节点上遇到很多错误.
更具体地说,我写了dockerfile:
FROM rocker/r-base:latest
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libxml2-dev \
libcurl4-openssl-dev \
libssl-dev \
gnupg2 \
libfftw3-dev \
libtiff-dev \
libx11-dev \
libcairo2-dev \
libxt-dev \
firefox
#RUN add-apt-repository -y ppa:mozillateam/firefox-next
## Install Java
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" \
| tee /etc/apt/sources.list.d/webupd8team-java.list \
&& echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" \
| tee -a /etc/apt/sources.list.d/webupd8team-java.list \
&& apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 \
&& echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" \
| /usr/bin/debconf-set-selections \
&& apt-get update \
&& apt-get install -y oracle-java8-installer \
&& update-alternatives --display java \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean \
&& R CMD javareconf
## make sure Java can be found in rApache and other daemons not looking in R ldpaths
RUN echo "/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/" > /etc/ld.so.conf.d/rJava.conf
RUN /sbin/ldconfig
# Install the R Packages from CRAN
RUN Rscript -e 'install.packages(c("Cairo", "Rcpp", "RSelenium", "httr", "rvest", "imager", "RCurl"))'
Run Code Online (Sandbox Code Playgroud)
我用doAzureParallelpackage来并行执行多个脚本:
# prepare Azure batch
setwd("E:/data/R/web_scraping/zk_ba/azure")
library(doAzureParallel)
setVerbose(TRUE)
setAutoDeleteJob(FALSE)
generateCredentialsConfig("credentials.json")
setCredentials("credentials.json")
generateClusterConfig("cluster.json")
cluster <- makeCluster("cluster.json")
registerDoAzureParallel(cluster)
getDoParWorkers()
opt <- list(wait = FALSE)
jobId <- foreach(
i = 1:n_cluster,
# .packages = c("RSelenium", "imager", "httr", "RCurl", "rvest"),
# .combine = 'rbind',
.errorhandling = "pass",
.options.azure = opt,
.export = c("metadata", "first_step", "parcele_df", "vlasnici_df", "status_teret_df", "n_cluster")
) %dopar% {
library(RSelenium)
library(imager)
library(httr)
library(RCurl)
library(rvest)
#-----------------------------------#
# START SELENIUM AND PREPARE #
#-----------------------------------#
if (first_step == TRUE) {
tryCatch({
rD <<- RSelenium::rsDriver(
browser = "firefox",
extraCapabilities = list(
"moz:firefoxOptions" = list(
args = list('--headless')
)
)
)
}, error = function(e) NA)
driver <<- rD$client
driver$open()
driver$navigate("http://www.e-grunt.ba/")
Sys.sleep(3L)
..
}
Run Code Online (Sandbox Code Playgroud)
但这在许多节点上返回错误:
<simpleError in checkError(res): Undefined error in httr call. httr output: Failed to connect to localhost port 4567: Connection refused>
Run Code Online (Sandbox Code Playgroud)
在我们需要在很多并行测试中使用RSelenium的情况下,一般建议是什么?
小智 1
RSelenium4567默认连接到它在端口上设置的 Selenium 服务器。一旦其中一个并行节点通过此端口连接到服务器,其他节点就无法通过此端口连接。
解决方案是将以下参数添加到rsDriver循环中foreach:
rD <<- RSelenium::rsDriver(
port = 4567L + as.integer(i),
browser = "firefox",
extraCapabilities = list(
"moz:firefoxOptions" = list(
args = list('--headless')
)
)
Run Code Online (Sandbox Code Playgroud)
您可能需要检查端口与其他应用程序的冲突。