selenium自动更新google浏览器驱动chromedriver.exe(兼容114版及以下&115版及以上)

        每次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()

   

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值