Параллельный запуск RSelenium с помощью Docker - PullRequest
0 голосов
/ 08 февраля 2019

В настоящее время я пытаюсь использовать пакет doParallel для распараллеливания моего веб-скребка RSelenium (работает на Docker).Я нашел этот пост ( Ускорьте очистку веб-страниц с помощью нескольких браузеров Rselenium ) и копирую ответ, предоставленный @hdharrison здесь:

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

# using  docker run -d -p 4445:4444 selenium/standalone-chrome:3.5.3
# in windows
URLsPar <- c("https://stackoverflow.com/", "https://github.com/", 
             "http://www.bbc.com/", "http://www.google.com", 
             "https://www.r-project.org/", "https://cran.r-project.org",
             "https://twitter.com/", "https://www.facebook.com/")

appHTML <- c()

(cl <- (detectCores() - 1) %>%  makeCluster) %>% registerDoParallel
# open a remoteDriver for each node on the cluster
clusterEvalQ(cl, {
  library(RSelenium)
  remDr <- remoteDriver(remoteServerAddr = "192.168.99.100", port = 4445L, 
                        browserName = "chrome")
  remDr$open()
})
ws <- foreach(x = 1:length(URLsPar), 
              .packages = c("rvest", "magrittr", "RSelenium"))  %dopar%  {
                print(URLsPar[x])
                remDr$navigate(URLsPar[x])
                remDr$getTitle()[[1]]
              }
> ws
[[1]]
[1] "Stack Overflow - Where Developers Learn, Share, & Build Careers"

[[2]]
[1] "The world's leading software development platform · GitHub"

[[3]]
[1] "BBC - Homepage"

[[4]]
[1] "Google"

[[5]]
[1] "R: The R Project for Statistical Computing"

[[6]]
[1] "The Comprehensive R Archive Network"

[[7]]
[1] "Twitter. It's what's happening."

[[8]]
[1] "Facebook - Log In or Sign Up"     


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

stopImplicitCluster()

Похоже, это решение, которым я являюсьищет, но когда я запускаю его, я сталкиваюсь с таким сообщением об ошибке:

Ошибка в checkForRemoteErrors (lapply (cl, recvResult)):

3 узла вызвали ошибки;Первая ошибка: неопределенная ошибка в вызове httr.Вывод httr: Не удалось подключиться к порту 192.168.99.100. 4445: Отказано в соединении

Это вывод 'docker ps':

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                    NAMES
f2d62f6b293b        selenium/standalone-chrome:3.5.3   "/opt/bin/entry_poin…"   36 minutes ago      Up 35 minutes       0.0.0.0:4445->4444/tcp   recursing_austin

Я понимаю, что мне придется открытьновый браузер для каждого ядра, но я предполагаю, что именно в этом и заключается проблема: в тот момент, когда я уменьшаю количество своих ядер, я получаю меньше ошибок.

Если я могу предоставить более подробную информацию, пожалуйста, дайте мне знать!Заранее спасибо!

1 Ответ

0 голосов
/ 11 февраля 2019

Тем временем я смог понять, как исправить свою ошибку.Если кто-то еще сталкивается с той же проблемой, я оставляю здесь комментарий.Я не могу объяснить логику этого, но мой код работает, как и ожидалось, когда я заменяю

remDr <- remoteDriver(remoteServerAddr = "192.168.99.100", port = 4445L, 
                       browserName = "chrome")

на

remDr <- remoteDriver(port = 4445L) 

и использую браузер Firefox вместо Chrome.

...