无论是测试还是爬虫的一些工作,有时候都会用到selenium去对chrome执行自动化操作,这里介绍一下如何使用docker快捷方便的部署相关应用。
1. selenium+chrome镜像
通过docker search selenium
我们发现,有一个docker镜像叫做selenium/standalone-chrome
。
看名字应该是包含了selenium和chrome,按照之前的方式我们是在本机上直接调用webdriver控制chrome,而在虚拟机上我们可以使用远程调用。
先翻一下官方文档,发现有两种启动方式:
$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-dubnium
#OR
$ docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome:3.141.59-dubnium
这里看到镜像名称后面有标签,如果pull的是latest版本的话那么可以忽略。
2. 启动selenium+chrome服务
现在我们测试启动selenium+chrome
服务。
执行下面的语句启动容器:
docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome
这里容器暴露了一个4444
端口用于连接,使用一下python代码(命名为spider.py)连接selenium服务,生成webdriver:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
command_executor="http://127.0.0.1:4444/wd/hub",
desired_capabilities=DesiredCapabilities.CHROME
)
driver.get("http://www.baidu.com")
print(driver.title)
driver.close()
执行前要确保python3环境中安装了selenium
:
pip install selenium
然后执行代码,返回以下结果说明访问容器成功:
百度一下,你就知道
3. 使用python镜像
现在我们还在本机上执行python代码,有时候也足够了,如果想要在docker上一键部署python+selenium+chrome的话,请继续往下面看。
先pull一个alpine3.6版本的python镜像:
docker pull python:alpine3.6
然后根据我们的需求,定制一下这个python镜像,这里我们在里面安装好selenium就行了,所以编写如下的Dockerfile:
FROM python:alpine3.6
RUN pip install selenium
构建名为selenium_python的新镜像:
docker build . -t selenium_python:v1
4. 编写docker-compose文件
要同时部署python脚本和selenium-chrome,docker-compose当然是首选。
docker-compose并非docker的自带工具,因此执行如下命令安装:
sudo apt-get install docker-compose
根据需求编写docker-compose文件:
version: "2.0"
services:
spider:
image: selenium_python:v1
volumes:
- ./spider.py:/code/spider.py # 这里把刚刚的代码映射到这个目录
command: python /code/spider.py # 定义启动容器执行的命令
depends_on:
- chrome
chrome:
image: selenium/standalone-chrome:latest
ports:
- "4444:4444"
shm_size: 2g
先别急着启动,这里注意两个问题:
- 这里selenium容器的hostname是chrome,所以要修改
command_executor="http://127.0.0.1:4444/wd/hub"
中的IP地址,修改后为command_executor="http://chrome:4444/wd/hub"
- 注意chrome启动要一定的时间,所以在代码最前面加上几秒钟延时(也可以使用相关手段检测chrome完全启动,可以自行谷歌)
修改后的代码为:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
time.sleep(5)
driver = webdriver.Remote(
command_executor="http://chrome:4444/wd/hub",
desired_capabilities=DesiredCapabilities.CHROME
)
driver.get("http://www.baidu.com")
print(driver.title)
driver.close()
然后使用docker-compose启动服务:
docker-compose up -d
如果不报错,在docker logs seleniumchrome_spider_1
显示的日志中,同样可以看到:
百度一下,你就知道