-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
Docker运行示例
- 确保已安装Docker。
- 运行selenium chrome镜像:
sudo docker run -d -p 4444:4444 -p 5900:5900 -v /home/data:/data --name selenium-chrome --shm-size="4g" selenium/standalone-chrome
几个值得注意的点:
-
4444
:Docker运行端口,宿主机4444
端口映射到容器内部的4444
端口。 -
5900
:用于远程可视化调试,宿主机5900
端口映射到容器内部的5900
端口。可以通过VNC Viewer访问localhost:5900
,密码secret
来可视化的查看正在运行的浏览器的运行状态,包括出现了什么问题。 -
/home/data
为宿主机目录,映射到Docker容器内部的/data
文件,常用于带用户信息模式
时指定用户目录,注意要确保/home/data
文件夹下的文件对于Docker的容器是可写的,不然无法正常使用带用户信息模式!
- 运行任务:
A. 如不需要自己编译程序,则直接运行打包好的程序(以Linux版本为例)即可:
./EasySpider/resources/app/chrome_linux64/easyspider_executestage --ids [0] --docker_driver http://localhost:4444/wd/hub --user_data 0 --server_address http://localhost:8074 --config_folder "./" --headless 1 --read_type local --config_file_name config.json --saved_file_name
B. 如果需要自己修改源代码并运行程序,则执行下面的命令:
切换的本项目源码的ExecuteStage
文件夹,安装Python环境(Python版本需要为3.10或3.11):
pip3 install -r requirements.txt
然后执行任务:
python3 easyspider_executestage.py --ids [0] --docker_driver http://localhost:4444/wd/hub --user_data 0 --server_address http://localhost:8074 --config_folder "./" --headless 1 --read_type local --config_file_name config.json --saved_file_name
自行配置环境并运行程序的情况下,如提示Cannot find file ../ElectronJS/chrome_win64/stealth.min.js
的情况下,就在../ElectronJS
文件夹下手动建立一个chrome_win64
文件夹,再把ElectronJS
文件夹下的stealth.min.js
文件复制到chrome_win64
文件夹下即可,如果遇到其他同类错误则执行一样的操作。
命令行参数说明在此文档中:https://github.com/NaiboWang/EasySpider/wiki/Argument-Instruction
以上为local模式示例,在--docker_driver
后面写远程Docker的网址,默认是http://localhost:4444/wd/hub
,--read_type local
则需要从本地的ExecuteStage/execution_instances
文件夹里读取0.json
文件,否则--read_type remote
的情况下会从--server_address http://localhost:8074
的服务器中读取任务信息。
一定要等到任务执行完成并自行退出,否则将会出现Docker容器中的浏览器被占用而无法被其他任务使用的情况!!!如果碰到这种情况,请看下面的解决方案。
- 访问
http://localhost:4444
来查看浏览器占用情况,一个浏览器只能被一个任务使用,如果意外退出程序但浏览器仍正被占用,导致无法被其他任务使用(命令行输出卡在Using remote driver
或Headless mode
)时,请重启Docker镜像重置浏览器:
sudo docker restart selenium-chrome
只有下图为0%时才可执行其他任务:
如果需要Docker容器运行的时候带用户信息模式,则需要在0.6.3及以上版本的EasySpider执行easyspider_executestage
程序的时候传入--user_folder
参数,且该参数对应的路径是Docker容器内部的文件夹路径,即用户信息目录需要拷贝或映射到Docker容器内部,如:
python3 easyspider_executestage.py --ids [0] --docker_driver http://localhost:4444/wd/hub --user_data 1 --server_address http://localhost:8074 --config_folder "./" --user_folder "/data/user_folder" --headless 1 --read_type local --config_file_name config.json --saved_file_name
即Docker容器内部的/data/user_folder
为用户信息目录,注意--user_data
字段需要设置为1
表示使用用户信息目录,具体用法可参考:https://github.com/NaiboWang/EasySpider/issues/532
以上示例是同时只运行一个浏览器Docker实例的情况,如需要同时运行多个浏览器示例以便多个任务同时执行,可以使用下面的解决方案:
- 启动Selenium Hub,Selenium Hub作为中央节点,管理各个Selenium Node。使用下面的命令启动Hub:
sudo docker network create grid
sudo docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub
- 启动Selenium Nodes
接下来,连接Chrome节点到Hub。可以根据需要启动任意数量的节点,下面是启动三个浏览器实例的命令:
sudo docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="4g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome
sudo docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="4g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome
sudo docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="4g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome
如果你需要更多的浏览器实例,可以重复上面的命令。
-
其余命令执行方式不变,仍然在
--docker_driver
后面写远程Docker的网址,默认是http://localhost:4444/wd/hub
。 -
访问
http://localhost:4444
来查看浏览器占用情况,理论上应该有三个实例并显示占用情况:
Click Pages
above to see more pages