Loading... # 1. selenium+chrome镜像 通过`docker search selenium`我们发现,有一个docker镜像叫做`selenium/standalone-chrome`。 看名字应该是包含了selenium和chrome,按照之前的方式我们是在本机上直接调用webdriver控制chrome,而在虚拟机上我们可以使用 **远程调用** 。 先翻一下[官方文档](https://github.com/SeleniumHQ/docker-selenium),发现有两种启动方式: ``` $ 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 ``` 先别急着启动,这里注意两个问题: 1. 这里selenium容器的hostname是chrome,所以要修改`command_executor="http://127.0.0.1:4444/wd/hub"`中的IP地址,修改后为`command_executor="http://chrome:4444/wd/hub"` 2. 注意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`显示的日志中,同样可以看到: ``` 百度一下,你就知道 ``` 最后修改:2022 年 09 月 26 日 © 允许规范转载 打赏 赞赏作者 微信 赞 3 如果觉得我的文章对你有用,请随意赞赏