引言

工作中用到了 Selenium 作为爬虫去解析网页,发现单机跑慢的要死,所以找了点资料,将官方的 Selenium 集群搭建了起来,下面是搭建的过程。
环境介绍
系统 jdk 环境 selenium 版本 首先从官网上下载好最新版本的selenium-server-standalone.jar

https://www.seleniumhq.org/download/

在 Hub 机器上执行下面的命令,运行 hub 管理端

java -jar selenium-server-standalone.jar -role hub

执行以后会出现下面这样的提示

记住下面的两个 URL 地址:

http://10.10.88.51:4444/grid/register/
http://10.10.88.51:4444/wd/hub

第一个地址是注册 node 的时候回使用到,第二个地址是在代码中会用到

安装 Node

将上面下载的 jar 文件复制到各个节点机器上,然后执行下面命令,注册 node 节点

java -jar selenium-server-standalone.jar -role node -hub http://10.10.88.51:4444/grid/register/ -capabilities browserName=chrome,platform=linux,maxInstances=30 -maxSession 60 -log /var/log/selenium.log

记住将-hub后面的 url 地址更改为你的 hub 地址,执行以后会出现下面的界面

然后我们返回 Hub 机器上看 Hub 机器上回出现一条这样的提示

可以看到已经成功注册了节点机器。其他节点按照同样的方式进行注册即可。
关于其中的参数可以参考下面的文章:

https://github.com/SeleniumHQ/selenium/wiki/Grid2#configuring-the-nodes

查看 web 界面

在注册完 node 节点以后,我们可以在 web 界面中看到我们注册的机器的列表以及配置
我们访问 Hub 机器的 url 地址为:

http://10.10.88.51:4444/grid/console

将其中的10.10.88.51换为你 hub 机器的 ip 地址即可访问

至此我们的 Selenium 集群以及初步搭建完成,接下来就是使用了

使用 Selenium 集群

这边我用 python 代码进行测试 Selenium 机器是否能正常使用。
代码如下

# -*- coding:utf-8 -*-
# Author: sky
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--hide-scrollbars')
driver = webdriver.Remote(command_executor="http://10.10.88.51:4444/wd/hub",options=chrome_options)
driver.get("https://www.03sec.com")
driver.implicitly_wait(3)
driver.find_elements_by_tag_name("div")
print(driver.page_source)
driver.quit()

其中chrome_options请根据自己的情况进行自定义,
command_executor为上面我们记录的第二条 url 地址, 请自行更换

其实和平时写没有什么区别,唯一的区别就是

driver = webdriver.Remote(command_executor="http://10.10.88.51:4444/wd/hub",options=chrome_options)

这条配置

设置 Centos7 开机启动

  • selenium grid 设置开机启动的命令
mkdir /opt/script
touch /opt/script/autostart.sh
echo "
#!/bin/bash
#description:启动selenium Grid
screen -dmS selenium java -jar selenium-server-standalone.jar -role hub -maxSession 100 -log /var/log/selenium.log
" >> /opt/script/autostart.sh
chmod +x /opt/script/autostart.sh
echo "su - root -c '/opt/script/autostart.sh'" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
cat /etc/rc.d/rc.local
ls -la /etc/rc.d/rc.local
cat /opt/script/autostart.sh
ls -la /opt/script/autostart.sh
echo "ok"


  • selenium node 设置开机启动的命令
mkdir /opt/script
touch /opt/script/autostart.sh
echo "
#!/bin/bash
#description:启动selenium节点
screen -dmS selenium java -jar selenium-server-standalone.jar -role node -hub http://selenium-grid 服务器IP:4444/grid/register/ -capabilities browserName=chrome,platform=linux,maxInstances=30 -maxSession 60  -log /var/log/selenium.log
" >> /opt/script/autostart.sh
chmod +x /opt/script/autostart.sh
echo "su - root -c '/opt/script/autostart.sh'" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
cat /etc/rc.d/rc.local
ls -la /etc/rc.d/rc.local
cat /opt/script/autostart.sh
ls -la /opt/script/autostart.sh
echo "ok"



安装中遇到的问题

可能会有中文乱码的问题,在 centos7 下安装下中文字体库即可,

yum groupinstall fonts

总结

集群安装以后,使用和平时没什么两样,速度也差不多。如果你是单机单进程跑,没必要使用集群。如果涉及到多进程或者多线程这样的话,Selenium 集群才能真正发挥作用。
参考

https://github.com/SeleniumHQ/selenium/wiki/Grid2
https://www.seleniumhq.org/docs/07_selenium_grid.jsp