前言

还是爬虫里面的某个场景需要重度使用 selenium 场景 ,所以需要起这样一个集群

对比

  • 单机版
  • Docker 单机版
  • Docker 单机集群版
  • Docker 分布式集群版

我们在使用 selenium 的时候,我们一般就使用以上的环境和模式

单机版

单机怎么操作呢,下载相应的 webdriver,安装配置参考教程 Selenium & ChromeDriver 全平台安装教程(Mac、Windows、Linux)

对于小型的使用环境,比如单线程操作,我们安装好环境直接使用就可以了

使用案例(Chrome)

1
2
3
4
5
6
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://sitoi.cn/')
browser.get_screenshot_as_file("sitoi.cn.png")
browser.close()

Docker 单机版

保证安装好 dockerdocker-compose ,这里就直接使用 docker-compose.yml 文件起一个实例

  1. 编写 docker-compose.yml 文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: "3"

    services:
    chrome:
    image: selenium/standalone-chrome:latest
    restart: always
    environment:
    - GRID_TIMEOUT=40
    ports:
    - 4444:4444
  2. docker-compose.yml 所在的目录,运行如下命令:

    1
    sudo docker-compose up -d
  3. 检测服务是否启动成功

    浏览器打开 http://127.0.0.1:4444/ 就可以看到我们的 hub 界面了,端口对应 docker-compose.yml 文件内的 ports

  4. 使用案例(Chrome)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from 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 单机集群版

  1. 编写 docker-compose.yml 文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    version: '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
  2. docker-compose.yml 所在的目录,运行如下命令:

    1
    sudo docker-compose up -d
  3. 检测服务是否启动成功

    浏览器打开 http://127.0.0.1:4445/ 就可以看到我们的 hub 界面了,端口对应 docker-compose.yml 文件内的 ports

  1. 使用案例(Firefox)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from 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

  1. 编写 docker-compose.yml 文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    version: '2'
    services:
    hub:
    image: selenium/hub:latest
    restart: always
    ports:
    - "0.0.0.0:4446:4444"
  2. docker-compose.yml 所在的目录,运行如下命令:

    1
    sudo docker-compose up -d
  3. 检测服务是否启动成功

    浏览器打开 http://127.0.0.1:4446/ 就可以看到我们的 hub 界面了,端口对应 docker-compose.yml 文件内的 ports

部署 node 节点(chrome)

node 节点(chrome)假设 B 机上,IP 地址为:10.10.2.1

  1. 编写 docker-compose.yml 文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    version: '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:5555

    HUB_HOST 填写 hub 节点的 IP 地址
    HUB_PORT 填写 hub 节点的 PORT 端口
    REMOTE_HOST 填写地址为 node 节点的 IP 地址,和端口号

  2. docker-compose.yml 所在的目录,运行如下命令:

    1
    sudo docker-compose up -d

部署 node 节点(firefox)

node 节点(firefox)假设 C 机上,ip 地址为:10.10.3.1

  1. 编写 docker-compose.yml 文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    version: '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
  2. docker-compose.yml 所在的目录,运行如下命令:

    1
    sudo docker-compose up -d
  3. 使用案例(Firefox)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from 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 环境,直接使用远程的环境即可,环境更统一