R成精系列-Mac os用R+Docker部署Rselenium搭建爬虫系统

最近在用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仓库就相当于光盘盒子。
      通过docker可以快速搭建各种环境。刚好可用于本次爬虫任务的hub+node环境的搭建,另外说句题外话docker技术细节你可以不懂,但是你需要知道怎么使用。
  • R 嗯~~~不用介绍了吧。
  • Mac OS……
    接下来进入到实操环节:

下载Docker安装Docker

  1. Mac 下载安装Docker desktop版本还是比较简单,到Dorker mac下载地址注册一个账号,下载docker dmg直接安装即可,这也是最简单的方法。
  2. 安装成功后,打开docker。
    docker

    看到docker就在运行了。接下来打开终端工具进行操作会比较方便。


    docker运行状态

搭建Selenium环境

搭建Selenium环境主要分为三个步骤:
1 .启动docker
打开docker程序后,进入终端输入docker version即可查看docker版本,说明docker已经运行。网上有许多docker相关的教程,这里就不再赘述。

  1. 拉取Selenium镜像,我们这里拉取两个镜像1个Selenium hub镜像,1个Selenium chrome-node。Selenium镜像有许多,更多的请参考Selenium镜像列表
docker pull selenium/hub
docker pull selenium/node-chrome

经过一段时间的下载,镜像就下载成功了,下载成功后就可以基于镜像启动容器。

  1. 基于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/hubselenium/node后,我们运行docker ps - a有如下信息:


这是selenium就启动了。
浏览器输入localhost:4444.可以查看Selenium Grid Hub的版本,也表示其运行正常。
屏幕快照 2018-12-09 下午5.57.12.png

启动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)#截图
屏幕快照 2018-12-09 下午6.24.48.png

结尾

用完后关闭、清除容器、关闭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   
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容