多机分布式环境下的 selenium 集群
前言
还是爬虫里面的某个场景需要重度使用 selenium 场景 ,所以需要起这样一个集群
对比
- 单机版
- Docker 单机版
- Docker 单机集群版
- Docker 分布式集群版
我们在使用 selenium
的时候,我们一般就使用以上的环境和模式
单机版
单机怎么操作呢,下载相应的 webdriver
,安装配置参考教程 Selenium & ChromeDriver 全平台安装教程(Mac、Windows、Linux)
对于小型的使用环境,比如单线程操作,我们安装好环境直接使用就可以了
使用案例(Chrome)
1 | from selenium import webdriver |
Docker 单机版
保证安装好 docker
和 docker-compose
,这里就直接使用 docker-compose.yml
文件起一个实例
编写
docker-compose.yml
文件,内容如下:1
2
3
4
5
6
7
8
9
10version: "3"
services:
chrome:
image: selenium/standalone-chrome:latest
restart: always
environment:
- GRID_TIMEOUT=40
ports:
- 4444:4444在
docker-compose.yml
所在的目录,运行如下命令:1
sudo docker-compose up -d
检测服务是否启动成功
浏览器打开 http://127.0.0.1:4444/ 就可以看到我们的 hub 界面了,端口对应
docker-compose.yml
文件内的ports
使用案例(Chrome)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17from selenium import webdriver
browser = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={
'browserName': 'chrome',
'version': '',
'platform': 'ANY',
'goog:chromeOptions': {
'extensions': [],
'args': ['--no-sandbox', '-headless', '--disable-dev-shm-usage']}
}
)
browser.get("https://sitoi.cn")
browser.get_screenshot_as_file("sitoi.cn.png")
browser.quit()
如果你要开很多个也可以,前台挂个
nginx
然后启用多个之后集群
Docker 单机集群版
编写
docker-compose.yml
文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22version: '2'
services:
hub:
image: selenium/hub:latest
ports:
- "0.0.0.0:4445:4444"
chrome:
image: selenium/node-chrome:latest
restart: always
depends_on:
- hub
environment:
HUB_HOST: hub
firefox:
image: selenium/node-firefox:latest
restart: always
depends_on:
- hub
environment:
HUB_HOST: hub在
docker-compose.yml
所在的目录,运行如下命令:1
sudo docker-compose up -d
检测服务是否启动成功
浏览器打开 http://127.0.0.1:4445/ 就可以看到我们的 hub 界面了,端口对应
docker-compose.yml
文件内的ports
使用案例(Firefox)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17from selenium import webdriver
browser = webdriver.Remote(
command_executor='http://127.0.0.1:4445/wd/hub',
desired_capabilities={
'browserName': 'firefox',
'version': '',
'platform': 'ANY',
'goog:firefoxOptions': {
'extensions': [],
'args': ['--no-sandbox', '-headless', '--disable-dev-shm-usage']}
}
)
browser.get("https://sitoi.cn")
browser.get_screenshot_as_file("sitoi.cn.png")
browser.quit()
多机集群
为了解决单机(单机集群)横向扩展不足的问题,我们可以搭建分布式的 selenium 集群,将 hub 节点 和 node 节点拆分开,方便以后的横向扩展,可以通过添加机器来解决单机内存等性能问题。
部署 hub 节点
hub 节点假设在 A 机上,IP 地址为: 10.10.1.1
编写
docker-compose.yml
文件,内容如下:1
2
3
4
5
6
7version: '2'
services:
hub:
image: selenium/hub:latest
restart: always
ports:
- "0.0.0.0:4446:4444"在
docker-compose.yml
所在的目录,运行如下命令:1
sudo docker-compose up -d
检测服务是否启动成功
浏览器打开 http://127.0.0.1:4446/ 就可以看到我们的 hub 界面了,端口对应
docker-compose.yml
文件内的ports
部署 node 节点(chrome)
node 节点(chrome)假设 B 机上,IP 地址为:10.10.2.1
编写
docker-compose.yml
文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12version: '2'
services:
chrome:
image: selenium/node-chrome:latest
restart: always
environment:
- HUB_HOST=10.10.2.22
- HUB_PORT=4446
- REMOTE_HOST=http://10.10.2.1:5556
ports:
- 0.0.0.0:5556:5555HUB_HOST
填写 hub 节点的 IP 地址HUB_PORT
填写 hub 节点的 PORT 端口REMOTE_HOST
填写地址为 node 节点的 IP 地址,和端口号在
docker-compose.yml
所在的目录,运行如下命令:1
sudo docker-compose up -d
部署 node 节点(firefox)
node 节点(firefox)假设 C 机上,ip 地址为:10.10.3.1
编写
docker-compose.yml
文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12version: '2'
services:
firefox:
image: selenium/node-firefox:latest
restart: always
environment:
- HUB_HOST=10.10.2.22
- HUB_PORT=4446
- REMOTE_HOST=http://10.10.3.1:5557
ports:
- 0.0.0.0:5557:5555在
docker-compose.yml
所在的目录,运行如下命令:1
sudo docker-compose up -d
使用案例(Firefox)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17from selenium import webdriver
browser = webdriver.Remote(
command_executor='http://127.0.0.1:4446/wd/hub',
desired_capabilities={
'browserName': 'firefox',
'version': '',
'platform': 'ANY',
'goog:firefoxOptions': {
'extensions': [],
'args': ['--no-sandbox', '-headless', '--disable-dev-shm-usage']}
}
)
browser.get("https://sitoi.cn")
browser.get_screenshot_as_file("sitoi.cn.png")
browser.quit()
总结
- 使用 docker 极大屏蔽了部署 selenium 会遇到的系统差异问题,步骤简洁,易于配置。
- 不再需要本地安装 selenium 环境,直接使用远程的环境即可,环境更统一