每次google浏览器自动更新之后,用selenium写的程序就运行不了了,经常要手动去下载驱动太麻烦,就自己写了个自动检测更新浏览器驱动的代码,话不多说,上代码。
# -*- coding: utf-8 -*-
import re
import shutil
from selenium import webdriver
import os
from zipfile import ZipFile
import requests
# region 自动更新chromedriver_win32驱动
def chromedriver_download():
def download_114(_url, _headers, _chrome_ver_pre):
try:
res = requests.get(_url, headers=_headers)
except requests.exceptions.RequestException as e:
print(f'获取下载链接出错:', e)
return None
li_ver = re.findall("<CommonPrefixes><Prefix>(.*?)/</Prefix></CommonPrefixes>", res.text)[:-1] # 获取所有版本号
if li_ver:
for www_drv_ver in reversed(li_ver):
if _chrome_ver_pre in www_drv_ver:
new_zip_name = f'chromedriver_win32_{www_drv_ver}.zip' # zip文件名
url_ = f'https://chromedriver.storage.googleapis.com/{www_drv_ver}/chromedriver_win32.zip' # 构建下载地址
try:
content = requests.get(url_, headers=headers).content
with open(new_zip_name, 'wb') as f:
f.write(content)
print(f'驱动文件 {new_zip_name} 下载完成。')
return new_zip_name
except requests.exceptions.RequestException as e:
print(f'驱动文件 {new_zip_name} 下载出错:', e)
else:
print('获取下载链接失败。')
return None
def download_115(url, _headers, _chrome_ver_pre):
try:
res = requests.get(url, headers=headers)
except requests.exceptions.RequestException as e:
print(f'获取下载链接出错:', e)
return None
li_url = re.findall('<code>(https://.*?)</code>', res.text) # 获取所有url
li_status = re.findall(r'<code>(\d{3})</code>', res.text) # 获取所有状态码
if li_url:
for _url, _status in zip(reversed(li_url), reversed(li_status)):
if _status == '200' and _url.endswith('chromedriver-win32.zip'): # chromedriver_win32
www_drv_ver = _url.split('/')[-3] # 版本号
old_zip_name = _url.split('/')[-1] # zip文件名
new_zip_name = old_zip_name.replace('.zip', f'-{www_drv_ver}.zip') # 修改后的zip文件名
if _chrome_ver_pre in _url: # 与浏览器版本号前3位相同
try:
content = requests.get(_url, headers=_headers).content
with open(new_zip_name, 'wb') as f:
f.write(content)
print(f'驱动文件 {new_zip_name} 下载完成。')
return new_zip_name
except requests.exceptions.RequestException as e:
print(f'驱动文件 {new_zip_name} 下载出错:', e)
else:
print('获取下载链接失败。')
return None
def extract_zip(zip_n, ver_pre): # 解压ZIP文件 zip文件名,大版本号
if zip_n is not None:
print(f'正在解压,请稍等……')
if os.path.exists('chromedriver.exe'):
os.remove('chromedriver.exe') # 驱动文件存在时,先删除
print('原驱动文件 chromedriver.exe 删除完成。')
zip_ext_folder = "-".join(zip_n.split("-", 2)[:2])
zip_ext_full_name = f'{zip_ext_folder}/chromedriver.exe' if int(ver_pre) == 115 else 'chromedriver.exe'
# 114和115版压缩包中文件结构不相同
with ZipFile(zip_n) as file: # 解压驱动压缩包
file.extract(zip_ext_full_name, path=os.getcwd()) # 解压
print('解压完成。')
os.remove(zip_n) # 删除压缩文件
if int(ver_pre) == 115: # 114版本以下没有临时文件
os.rename(f"{zip_ext_full_name}", "chromedriver.exe") # 驱动文件移动到当前文件夹
shutil.rmtree(f'{zip_ext_folder}') # 删除临时解压文件夹
print('临时文件清除完成。')
def find_zip_name(zip_name_pre): # 查找驱动压缩包完整名称,不含路径 因版本号末尾的数字不确定
for file in os.listdir(os.getcwd()): # 遍历当前文件夹下的所有文件,排除文件夹
if not os.path.isdir(file):
if zip_name_pre in file:
return file
# 下载驱动并解压 自动判断浏览器版本 114及以前的版本和114以上的版本下载地址不相同,压缩包结构也不相同。
url_115 = 'https://googlechromelabs.github.io/chrome-for-testing/' # 119.0.6045.105/win32/chromedriver-win32.zip
url_114 = 'https://chromedriver.storage.googleapis.com/?delimiter=/&prefix='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/86.0.4240.198 Safari/537.36'}
chrome_version = os.popen( # 获取浏览器版本 windows
r'reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version').read().strip().split(" ")[-1]
chrome_ver_pre_1 = int(chrome_version.split('.')[0]) # 浏览器版本号 前1位
chrome_ver_pre_3 = chrome_version.rsplit('.', 1)[0] # 浏览器版本号 前3位
if os.path.exists('chromedriver.exe'): # 驱动文件存在,但是和浏览器版本不符
loc_drv_ver = os.popen('chromedriver.exe --version').read().strip().split(' ')[1] # 获取本地驱动文件版本
if chrome_ver_pre_3 not in loc_drv_ver: # 浏览器版本号前几位和驱动文件版本前几位不相同
print(f'当前google浏览器的版本号为:{chrome_version} ')
zip_name = find_zip_name(chrome_ver_pre_3)
if zip_name: # 压缩包存在
print(f'驱动文件 chromedriver.exe 存在,版本号为:{loc_drv_ver} 与浏览器的版本号不符,但是找到文件 {zip_name}')
if chrome_ver_pre_1 >= 115:
extract_zip(download_115(url_115, headers, chrome_ver_pre_3), 115)
else:
extract_zip(download_114(url_114, headers, chrome_ver_pre_3), 114)
else: # 压缩包不存在
print(f'驱动文件 chromedriver.exe 存在,版本号为:{loc_drv_ver} 与浏览器的版本号不符。\n正在下载,请稍等……')
if chrome_ver_pre_1 >= 115:
extract_zip(download_115(url_115, headers, chrome_ver_pre_3), 115)
else:
extract_zip(download_114(url_114, headers, chrome_ver_pre_3), 114)
else: # 驱动文件不存在
zip_name = find_zip_name(chrome_ver_pre_3)
if zip_name: # 驱动压缩包存在
print(f'当前google浏览器的版本号为:{chrome_version} ')
print(f'驱动文件 chromedriver.exe 不存在,但是找到文件 {zip_name}。')
if chrome_ver_pre_1 >= 115:
extract_zip(download_115(url_115, headers, chrome_ver_pre_3), 115)
else:
extract_zip(download_114(url_114, headers, chrome_ver_pre_3), 114)
else: # 什么也没有
print(f'当前google浏览器的版本号为:{chrome_version} ')
print('驱动文件 chromedriver.exe 不存在。\n正在下载,请稍等……')
if chrome_ver_pre_1 >= 115:
extract_zip(download_115(url_115, headers, chrome_ver_pre_3), 115)
else:
extract_zip(download_114(url_114, headers, chrome_ver_pre_3), 114)
# endregion
# 调用示例
chromedriver_download() # 更新浏览器驱动 q12393933
# 你的代码
driver = webdriver.Chrome()
print('google浏览器启动成功。')
driver.get(r'https://www.baidu.com')
driver.quit()