问题
做了一个分析数据生成图片的小工具,隔一段时间就会截图失败,因为chrome自动更新的版本,工具中的chromedirver与之已经不匹配了。
解决
因为使用者不是一个人且非专业人士,手动解决不可取,自动更新比较靠谱,思路很简单:
1、查询当前chrome版本
2、查询当前chromedriver版本
3、比较两者是否一致,不一致则更新chromedirver驱动
代码
与更新功能相关的包(从一堆代码中摘取出来的,可能有漏的,缺哪个自己安装就好)
import os
from init.Logger import log
import re # 正则
import winreg # windows注册表
import zipfile # 压缩解压
import requests
#下载chromedirver的镜像地址
base_url = 'http://npm.taobao.org/mirrors/chromedriver/'
# 匹配前3位版本号的正则表达式
version_re = re.compile(r'^[1-9]\d*\.\d*.\d*')
# 通过注册表查询chrome版本
def getChromeVersion():
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\Google\\Chrome\\BLBeacon')
value, t = winreg.QueryValueEx(key, 'version')
return version_re.findall(value)[0] # 返回前3位版本号
except WindowsError as e:
# 没有安装chrome浏览器
return "1.1.1"
# 查询Chromedriver版本
def getChromeDriverVersion():
outstd2 = os.popen('chromedriver --version').read()
try:
version = outstd2.split(' ')[1]
version = ".".join(version.split(".")[:-1])
return version
except Exception as e:
return "0.0.0"
# 检查chromedirver用不用更新
def checkChromeDriverUpdate():
chrome_version = getChromeVersion()
log.info(f'当前chrome版本: {chrome_version}')
driver_version = getChromeDriverVersion()
log.info(f'当前chromedriver版本: {driver_version}')
if chrome_version == driver_version:
log.info("版本兼容,无需更新.")
return
log.info("chromedriver版本与chrome浏览器不兼容,更新中>>>")
try:
getLatestChromeDriver(chrome_version)
log.info("chromedriver更新成功!")
except requests.exceptions.Timeout:
log.info("chromedriver下载失败,请检查网络后重试!")
except Exception as e:
log.info(f"chromedriver未知原因更新失败: {e}")
# 获取该chrome版本的最新driver版本号
def getLatestChromeDriver(version):
url = f"{base_url}LATEST_RELEASE_{version}"
latest_version = requests.get(url).text
print(f"与当前chrome匹配的最新chromedriver版本为: {latest_version}")
# 下载chromedriver
print("开始下载chromedriver...")
download_url = f"{base_url}{latest_version}/chromedriver_win32.zip"
file = requests.get(download_url)
with open("chromedriver.zip", 'wb') as zip_file: # 保存文件到脚本所在目录
zip_file.write(file.content)
print("下载完成.")
# 解压
f = zipfile.ZipFile("chromedriver.zip", 'r')
for file in f.namelist():
f.extract(file)
print("解压完成.")
结果:
兼容
不兼容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。