最近在用R做爬虫的时候遇到了部分网页无法爬取。于是转投Selenium的怀抱。本文就简要介绍利用mac 下的docker搭建Selenium环境,实现爬虫应用。
先简单介绍用的工具:
Selenium
也是一个用于Web应用程序测试的工具,Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。本文将采用Selenium Grid,它用于分布式自动化测试,就是一套Selenium 代码可在不同的环境上运行。Selenium Grid 有两个概念
hub
:主节点,接受测试任务,并进行分配,只有一个主hub节点。node
:分支节点,不同的节点分支,接受hub任务,并进行测试,可以有多个。RSelenium
通过调用Selenium Sever来模拟浏览器环境,实现爬虫任务。Docker
一般叫docker容器,一个可爱的鲸鱼,上面坨着集装箱,可以比喻为电脑集群。先来搞清楚它里面的几个概念。
Docker镜像
,运行Docker容器的一个环境,打个比方镜像就像已经配置好的程序包或者源代码的光盘,用于将程勋安装在电脑上。Docker容器
,简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。 如果把镜像看成面向对象中的 “类” 的话,那么容器就是“类”的实例化“ 对象”,打个比方:容器就像是已经安装好镜像的一台台电脑,但是容器一关闭后这台电脑就消失了。Docker仓库
,存放Docker镜像的仓库,作用和GitHub类似,Docker仓库就相当于光盘盒子。R
嗯~~~不用介绍了吧。Mac OS
……看到docker就在运行了。接下来打开终端工具进行操作会比较方便。
##搭建Selenium环境
搭建Selenium环境主要分为三个步骤:
1 .启动docker
打开docker程序后,进入终端输入docker version
即可查看docker版本,说明docker已经运行。网上有许多docker相关的教程,这里就不再赘述。
4. 拉取Selenium镜像,我们这里拉取两个镜像1个Selenium hub镜像,1个Selenium chrome-node。Selenium镜像有许多,更多的请参考Selenium镜像列表。
docker pull selenium/hub docker pull selenium/node-chrome
经过一段时间的下载,镜像就下载成功了,下载成功后就可以基于镜像启动容器。
5. 基于Selenium镜像,启动Selenium容器,启动一个selenium hub,一个chrome-node。
#单主机 docker run -d -p 4444:4444 --name selenium-hub selenium/hub docker run -d --link selenium-hub:hub -v /dev/shm:/dev/shm selenium/node-chrome
启动一个hub,docker启动命令如下:docker run -d -p 4444:4444 --name selenium-hub selenium/hub.
做一些简单的说明:
run
:通过镜像启动一个容器-p
:端口映射,5555是容器宿主机的端口就是我们docker这个轮船的端口,4444是我们容器的端口就是我们集装箱的端口。这说明了我们把容器的4444端口开放给docker主机的5555端口,那么我们就可以通过docker主机的5555端口来访问容器了,有点啰嗦~~~-d
:docker后台运行这个容器,我们知道运行server-standalone-2.52.0.jar这个包实际上是启动一个socket程序的,是在一个while循环中的。如果不启用后台运行的话,在xshell当前窗口是不能进行其他的操作的,当然你要再开一个窗口连接docker也可以。--name
:指定容器运行的别名,如果不指定会随机生成一个。selenium/hub
:就是我们要运行的镜像文件。启动完hub后,我们启动一个node,启动node命令如下:
docker run -P -d --link selenium_hub:hub selenium/node-chrome做一些简单的说明:
run
:和上文相同
-P
:随机生成映射端口号,上文中的-p是指定特定的端口号,这里面是node我们并不需要知道容器内部的端口号,当然你要指定也可以,端口号不要冲突即可。
-d
:后台运行与上文相同。
--link
:说明我们这个容器是依赖上文中我们生成的容器selenium_hub,后面我们会提到link的使用。
selenium_hub:hub
:前面的selenium_hub是我们上文中通过selenium/hub镜像启动容器的别名;后面的hub一定要写成hub或者HUB,写成其他启动失败,为什么这样我们后面会和- -link一起说明。
selenium/node-chrome
:node的镜像。
启动了selenium/hub
与selenium/node
后,我们运行docker ps - a
有如下信息:
这是selenium就启动了。
浏览器输入localhost:4444
.可以查看Selenium Grid Hub的版本,也表示其运行正常。
##启动R安装Rselenium包
install.packages("RSelenium")
##爬取页面
library(RSelenium) remDr<-remoteDriver(port=4444L, browserName = "chrome") remDr$open(silent = TRUE)#打开浏览器 [1] "Connecting to remote server" $acceptInsecureCerts [1] FALSE $acceptSslCerts [1] FALSE $applicationCacheEnabled [1] FALSE $browserConnectionEnabled [1] FALSE $browserName [1] "chrome" $chrome $chrome$chromedriverVersion [1] "2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634)" $chrome$userDataDir [1] "/tmp/.org.chromium.Chromium.YhY2Yo" $cssSelectorsEnabled [1] TRUE $databaseEnabled [1] FALSE $`goog:chromeOptions` $`goog:chromeOptions`$debuggerAddress [1] "localhost:35767" $handlesAlerts [1] TRUE $hasTouchScreen [1] FALSE $javascriptEnabled [1] TRUE $locationContextEnabled [1] TRUE $mobileEmulationEnabled [1] FALSE $nativeEvents [1] TRUE $networkConnectionEnabled [1] FALSE $pageLoadStrategy [1] "normal" $platform [1] "Linux" $rotatable [1] FALSE $setWindowRect [1] TRUE $takesHeapSnapshot [1] TRUE $takesScreenshot [1] TRUE $unexpectedAlertBehaviour [1] "ignore" $version [1] "70.0.3538.110" $webStorageEnabled [1] TRUE $webdriver.remote.sessionid [1] "d823c1c5d795381ab346daa2a32c7e87" $id [1] "d823c1c5d795381ab346daa2a32c7e87" remDr$navigate("https://www.baidu.com")#爬取百度 remDr$getTitle()#获取title remDr$screenshot(display = TRUE)#截图
##结尾
用完后关闭、清除容器、关闭docker。
#清除(关闭全部容器) : docker kill $(docker ps -a -q) docker stop $(docker ps -a -q) #删除全部容器: docker rm $(docker ps -a -q)
##参考
RSelenium Docker安装参考文档
Docker官方网站
sessionInfo() R version 3.5.1 (2018-07-02) Platform: x86_64-apple-darwin15.6.0 (64-bit) Running under: macOS 10.14.1 Matrix products: default BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets [6] methods base other attached packages: [1] RSelenium_1.7.4 loaded via a namespace (and not attached): [1] httr_1.3.1 compiler_3.5.1 R6_2.3.0 [4] assertthat_0.2.0 tools_3.5.1 wdman_0.2.4 [7] binman_0.1.1 curl_3.2 yaml_2.2.0 [10] Rcpp_1.0.0 jsonlite_1.5 caTools_1.17.1.1 [13] openssl_1.0.2 bitops_1.0-6 semver_0.2.0 [16] XML_3.98-1.16