Rselenium и foreach с допараллельностью - PullRequest
1 голос
/ 09 апреля 2019

Я использую Rselenium для очистки https://www.oddsportal.com. Я пытаюсь сделать это параллельно, так как у меня 50 000 URL-адресов и я хочу сократить время выполнения. Проблема в том, что я получаю одинаковые результаты для каждого кластера / узла (3). Я получаю 3 раза каждый заголовок URL. Я использую код из этого поста Запуск файла yaml для параллельного теста селена из R или python

Это то, что я пробовал для параллельных процессов, но это не работает так, как я хочу:

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", "http://www.oddsportal.com")

appHTML <- c()

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

clusterEvalQ(cl, {
  library(RSelenium)
eCap <- list(phantomjs.page.settings.userAgent 
             = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", phantomjs.page.settings.loadImages = FALSE, phantomjs.phantom.cookiesEnabled = FALSE, phantomjs.phantom.javascriptEnabled = TRUE)

remDr <- remoteDriver(browserName = "phantomjs", port=8910, extraCapabilities = eCap)
remDr$open()
})



myTitles <- c()
strt<-Sys.time()
ws <- foreach(x = 1:6, .packages = c("rvest", "magrittr", "RSelenium"))  %dopar%  {
  remDr$navigate(URLsPar[x])
  remDr$getTitle()[[1]]
}
end<-strt-Sys.time()

clusterEvalQ(cl, {
  remDr$close()
})

stopImplicitCluster()

Выход:

[[1]]
[1] "Google"

[[2]]
[1] "Google"

[[3]]
[1] "Google"

[[4]]
[1] "Odds Portal: Odds Comparison, Sports Betting Odds"

[[5]]
[1] "Odds Portal: Odds Comparison, Sports Betting Odds"

[[6]]
[1] "Odds Portal: Odds Comparison, Sports Betting Odds"

Я также пытался добавить remDr $ navigate (url) в кластер, потому что мне нужно войти на страницу, чтобы продолжить и получить мои данные позже в функции foreach. Если я добавлю remDr$navigate(url) к clusterEvalQ, я получу только это:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

Может ли кто-нибудь помочь мне, как выполнить параллельный анализ, чтобы не получать одинаковые данные для каждого узла, а также чтобы иметь возможность войти в систему?

Код с навигацией:

clusterEvalQ(cl, {
  library(RSelenium)
eCap <- list(phantomjs.page.settings.userAgent 
             = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", phantomjs.page.settings.loadImages = FALSE, phantomjs.phantom.cookiesEnabled = FALSE, phantomjs.phantom.javascriptEnabled = TRUE)

remDr <- remoteDriver(browserName = "phantomjs", port=8910, extraCapabilities = eCap)
remDr$open()
remDr$navigate("https://www.oddsportal.com/login/")
})
...