自动获取谷歌版本,并自动下载对应版本的chromedriver.exe
前言
因为电脑google浏览器自动升级,还有就是其他同事使用的Google浏览器版本与自己的不一致,需要重复去下载,所有老是需要重新去下载驱动,很麻烦,所有写了一个自动下载驱动的方法。
当前方法只适配了Windows上的google驱动,其它系统和浏览器可以自己修改适配一下。
获取谷歌版本(获取google版本)
# __*__ coding:utf-8 __*__import os
# 获取浏览器版本,windows
chromeV = os.popen('reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version').read().strip().split(" ")[-1]
定义下载驱动方法
# __*__ coding:utf-8 __*__import logging
import os
import xml
import zipfile
import requests
from xml.etree import ElementTree
import re
import win32api, win32con
PATH =lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x))defdownloadChromeDriver(chrome_version, platform='win'):"""
自动下载谷歌驱动
:param chrome_version: 谷歌浏览器版本, 如:106.0.5249.119
:param platform: 1.win 2.linux 3.mac
"""
xmlns ='{http://doc.s3.amazonaws.com/2006-03-01}'
url ='http://chromedriver.storage.googleapis.com/?delimiter=/&prefix='
resp = requests.get(url=url)# 读取字符串格式xml数据
tree = xml.etree.ElementTree.fromstring(resp.text)
CommonPrefixes_list = tree.findall('{}CommonPrefixes'.format(xmlns))for Prefix in CommonPrefixes_list:# 获取所有的驱动文件版本
prefix_ = Prefix.findall('{}Prefix'.format(xmlns))[0].text
if chrome_version[0:10]== prefix_[0:10]:
resp = requests.get('{}{}'.format(url, prefix_))# 版本下各个系统版本谷歌驱动
root = xml.etree.ElementTree.fromstring(resp.text)
contents = root.findall('{}Contents'.format(xmlns))for con in contents:# print(con.tag)
headers ={'Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9'}# 下载驱动# http://chromedriver.storage.googleapis.com/100.0.4896.20/chromedriver_win32.zipif'Key'in con[0].tag and platform in con[0].text:
resp_zip = requests.get(url='http://chromedriver.storage.googleapis.com/'+con[0].text, headers=headers)
zipfile_name = con[0].text.split('/')[1]withopen(PATH(zipfile_name),'wb')aszip:zip.write(resp_zip.content)breakelse:return0# 解压驱动文件并替换
zf = zipfile.ZipFile(zipfile_name,'r')
name_list =[item for item in zf.namelist()]for gz_item in name_list:
f_data = zf.read(gz_item)withopen(PATH("chromedriver.exe"),'wb')as f:# 保存解压出来的文件
f.write(f_data)
logging.info('对应谷歌浏览器驱动版本下载成功')
zf.close()# 删除zip压缩包文件
os.remove(PATH('chromedriver_win32.zip'))return1else:
logging.error('没有找到 {} 版本的驱动。请手动前往下载:{}'.format(chrome_version, url))return0
下载逻辑判断
1、本地不存在驱动,直接下载
2、存在且版本与浏览器版本匹配,则跳过
3、存在但版本跟浏览器匹配不上,则自动下载
# 如果没有谷歌驱动,自动下载驱动ifnot os.path.isfile(PATH("chromedriver.exe")):
dret = downloadChromeDriver(chromeV)
logging.info('google驱动自动下载成功')if dret ==1else logging.error('google驱动下载失败!')# 启动浏览器
s = Service(executable_path=PATH("chromedriver.exe"))
options = webdriver.ChromeOptions()# 禁用日志--因为cmd运行的时候出现日志打印,且展示为乱码
options.add_experimental_option('excludeSwitches',['enable-logging'])# 方法一:如果驱动有,则尝试使用旧的驱动启动,启动失败则自动下载更新驱动try:
driver = webdriver.Chrome(service=s, options=options)except Exception as e:
logging.info('启动失败当前驱动可能与浏览器不匹配,更新一下驱动\n{}'.format(e))
downloadChromeDriver(chromeV)
driver = webdriver.Chrome(service=s, options=options)# 方法二:获取驱动的版本,和浏览器版本对比# 获取google驱动版本
chromedriver_version = os.popen(PATH('chromedriver.exe')).read().strip().split(' ')[2]# 如果没有谷歌驱动,自动下载驱动if chromeV[0:10]!= chromedriver_version[0:10]:
os.remove('chromedriver.exe')
dret = downloadChromeDriver(chromeV)
logging.info('当前驱动可能与浏览器版本相差过大,更新驱动成功')if dret ==1else logging.error('google驱动下载失败!')else:
logging.info('当前驱动与浏览器版本匹配,无需更新驱动')
最后送个小福利
日志可以写入文件的同时还能在终端打印(纯属个人喜好,调试方便)
import logging
# 定义日志的格式
logFormat ='%(asctime)s %(filename)s[%(lineno)d] %(levelname)s\t%(message)s'.format('\n'*0)# 根据日志初始化时间来创建日志文件
logfile =open("logfile.log", encoding="utf-8", mode="a")# 日志模块初始化
logging.basicConfig(level=logging.INFO, stream=logfile,format= logFormat)# 实例终端输出日志方法
console = logging.StreamHandler(stream=sys.stdout)# 设置终端打印的日志等级
console.setLevel(logging.INFO)# 设置终端打印日志的格式,logFormat上面已定义
formatter = logging.Formatter(logFormat)# 设置格式
console.setFormatter(formatter)# 添加到日志句柄
logging.getLogger('').addHandler(console)
版权归原作者 抬眼已是半生 所有, 如有侵权,请联系我们删除。