基于docker+selenium的网站自动签到
本次在docker中部署网站自动签到服务,涉及网页page-source内容匹配、图片验证码识别、滑动拼图验证码识别均参考已有方案原,原分享作者在github-actions上进行部署,本方案仅在部署方式上进行调整:
Windows+wsl2+Docker
1.Windows环境下使用Docker-Destop
这次我没有选择直接部署在服务器上,而是选择通过Docker-Destop开启Ubuntu系统的docker镜像。主要是近期对笔记本有所改动,使得docker-destop打开时报错导致无法使用。之前将docker-destop卸载重装后并无作用,直到今天因为项目的督促才认真排查了下,问题出在wsl2和sock端口冲突(前段时间调整了sock端口),处理方法如下:在powershell中输入netsh winsock reset
并重启即可。
安装wsl2
启用wsl
使用管理员身份打开powershell,输入:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
启用虚拟机平台
使用管理员身份打开powershell,输入:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
将wsl2设置为默认值
使用管理员身份打开powershell,输入:
wsl --set-default-version 2
安装Linux发行版
推荐在Microsoft Store中选择一个Linux发行版进行安装。
我选择的是Ubuntu 18.04 LTS这个发行版。这里注明一下Ubuntu 16.04对Python的最高支持版本是3.5,可以通过更新apt-get列表来安装python3.6。
安装docker-destop
前往docker destop官网下载软件,并运行,接下来就可以正常使用docker-destop了。在使用docker之前可以在powershell中使用wsl命令改变磁盘位置。
2.Docker开启python3.6容器
前往docker hub官网选择需要的镜像。我这里选择的是Python:3.6,因为整个项目的基础环境如此。
docker开启python3.6容器
拉取python3.6镜像
打开powershell,从docker hub拉取python3.6镜像,输入:
docker pull python:3.6
后台启动check_in容器
打开powershell,运行python3.6镜像并暴露5000端口,输入:
docker run -itd -p 5000:5000 --name checkin python:3.6 /bin/bash
使用vscode远程连接docker
打开vscode,可以先安装docker插件,这样远程连接docker-destop更为方便。选中运行中的容器并远程连接。
从github上获取项目
本项目主要集中在服务器部署,直接借鉴已有项目代码再做修改。在vscode远程连接命令行中输入:
git clone https://github.com/wmathor/Check_In.git /home/
配置Python环境
项目需要安装依赖的python库,在vscode远程连接命令行中输入:
pip -r requirements.txt
Chrome+Chromedriver+Selenium
1.安装Chrome+Chromedriver
安装chrome
更新apt-get
在安装chrome之前先更新apt-get,在远程连接命令行中输入:
sudo apt-get update
如果sudo报错,则先安装sudo,输入
apt-get install sudo
下载最新版chrome
通过wget下载最新版本的谷歌浏览器,在远程连接命令行中输入:
wget https://dl.google.com/linux/direct/goole-chrome-stable_current_amd64.deb
如果wget报错,则先安装wget,输入
apt-get install wget
安装chrome
已经下载好了chrome,在远程连接命令行中输入:
sudo dpkg -i google-chrome-stable_current_amd64.deb
如果依赖报错,则先输入
sudo apt-get install -f
安装xvfb
xvfb可以无界面运行谷歌浏览器,实际上通过chrome_options的设置也可实现,在远程连接命令行中输入:
sudo apt-get install xvfb
如果依赖报错,则先输入
sudo apt-get install -f
查看chrome版本
虽然在安装信息中有显示,但我们可以通过命令行进行查询,输入:
google-chrome --version
安装chromedriver
安装相应版本的驱动
访问 http://chromedriver.storage.googleapis.com/index.html ,根据chrome的版本号选择相宜的驱动。相宜指前三个数字相同,驱动最后一个数字可以略低于当前版本。可以复制链接,并于远程连接命令行中下载,输入:
sudo wget http://chromedriver.storage.googleapis.com/(选择的版本号)/chromedriver_linux64.zip
解压chromedriver文件
由于下载的是zip压缩包,所以先做解压,在远程连接命令行中输入:
unzip chromedriver_linux64.zip
如果unzip报错,则先安装unzip,输入
sudo apt-get install unzip
配置驱动
在远程连接命令行中输入:
sudo mv -f chromedriver /usr/local/share/chromedriver sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
查看chromedriver版本
在远程连接命令行中输入:
chromedriver --version
安装selenium
安装selenium
在配置python环境的时候,requirements.txt中包含selenium,所以不必重复安装。
测试selenium
重点注意chrome_options的设置,如果设置不正确,将出现chrome崩溃的问题,python3.6中输入:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') # 无界面打开 chrome_options.add_argument('--no-sandbox') # 支持root用户使用 driver = webdriver.Chrome(chrome_options=chrome_options) driver.get('https://www.baidu.com') print(driver.page_source) # 如果可以打印出baidu的网页信息则selenium测试通过 driver.close() driver.quit()
关于chrome_options的说明
chrome在开启时如果chrome_options的配置不正确,容易出现Unknown error: Chrome failed to start: xxxx
或者Unknown error: session deleted because of page crash from xxxx
等等异常,表明chrome网页崩溃。尤其在docker环境中,chrome更容易奔溃,虽然报错不同,但是主要原因一般为以下几条,添加配置即可。
重点理解以下配置:
无界面打开
chrome_options.add_argument('--headless')
允许root用户使用
chrome_options.add_argument('--no-sandbox')
强制chrome使用
/tmp
目录,即从内存切换成磁盘chrome_options.add_argument('--disable-dev-shm-usage')
2.修改代码
由于本项目重点修改的是部署方式,所以差别集中在服务器环境和github-actions上。服务器docker环境需要手动搭建chrome和chromedriver环境,并且使用pip安装python依赖。项目代码util.py中
需要修改chrome_options的配置以适应服务器docker环境。
原始util.py代码部分
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
注意,经过测试,chrome_options.add_argument('--disable-gpu')
是导致服务器docker环境chrome崩溃的主要原因,所以需要对此进行修改。
修改后的util.py代码部分
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
# chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
chrome_options.add_argument('--disable-dev-shm-usage') # 将使用内存转换成使用磁盘,虽然损失了相应速度,但是可以避免docker环境下内存不足导致chrome的风险
这里选择注释掉错误配置,并且添加新配置chrome_options.add_argument('--disable-dev-shm-usage')
,将使用内存转换成使用磁盘,虽然损失了相应速度,但是可以避免docker环境下内存不足导致chrome的风险。
后续
经过以上配置和修改,原本部署于github-actions上的自动签到项目就可以迁移至服务器了。可以通过定时脚本的方式更加自由的使用该功能。关于账号、密码是通过python命令中传参的方式,这里可以学习一下参数加密传输的方法,github-actions是很好地解决了关键信息泄露的问题。
评论已关闭