前言
因为电脑google浏览器自动升级,还有就是其他同事使用的Google浏览器版本与自己的不一致,需要重复去下载,所有老是需要重新去下载驱动,很麻烦,所有写了一个自动下载驱动的方法。
当前方法只适配了Windows上的google驱动,其它系统和浏览器可以自己修改适配一下。文章来源:https://www.toymoban.com/news/detail-508037.html
获取谷歌版本(获取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))
def downloadChromeDriver(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.zip
if '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]
with open(PATH(zipfile_name), 'wb') as zip:
zip.write(resp_zip.content)
break
else:
return 0
# 解压驱动文件并替换
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)
with open(PATH("chromedriver.exe"), 'wb') as f:
# 保存解压出来的文件
f.write(f_data)
logging.info('对应谷歌浏览器驱动版本下载成功')
zf.close()
# 删除zip压缩包文件
os.remove(PATH('chromedriver_win32.zip'))
return 1
else:
logging.error('没有找到 {} 版本的驱动。请手动前往下载:{}'.format(chrome_version, url))
return 0
下载逻辑判断
1、本地不存在驱动,直接下载
2、存在且版本与浏览器版本匹配,则跳过
3、存在但版本跟浏览器匹配不上,则自动下载文章来源地址https://www.toymoban.com/news/detail-508037.html
# 如果没有谷歌驱动,自动下载驱动
if not os.path.isfile(PATH("chromedriver.exe")):
dret = downloadChromeDriver(chromeV)
logging.info('google驱动自动下载成功') if dret == 1 else 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 == 1 else logging.error('google驱动下载失败!')
else:
logging.info('当前驱动与浏览器版本匹配,无需更新驱动')
到了这里,关于selenium【自动下载谷歌驱动】自动获取谷歌版本,并自动下载对应版本的chromedriver.exe的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!