前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >chromedriver自动更新下载

chromedriver自动更新下载

原创
作者头像
用户6841540
发布2024-07-26 09:10:58
400
发布2024-07-26 09:10:58
举报
文章被收录于专栏:安义技术分享

1.windows版本

下面提供一个能自动下载自己谷歌浏览器对应版本的chromedriver的python程序。(windows系统)

代码语言:python
代码运行次数:0
复制
# -\*- coding:utf-8 -\*-

# @author:Ye Zhoubing

# @datetime:2023/11/30 14:30

# @software: PyCharm

"""

    该程序的功能为自动更新chromedriver驱动,将驱动下载至当前文件夹,并解压到当前文件夹。

    if \_status == '200' and \_url.endswith('chromedriver-win32.zip')在这里根据

你的系统选择驱动,如果是linux系统,选择chromedriver-linux64.zip,如果是win系统,选择

chromedriver\_win64.zip或者chromedriver\_win32.zip

"""

import re

import shutil

from selenium.webdriver.chrome.service import Service

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-win64.zip'):  # chromedriver-linux64.zip,chromedriver-win32.zip,chromedriver-win64.zip;32位与64位都可以使用,不用纠结自己电脑是32位还是64位

                    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 str(\_chrome\_ver\_pre) in \_url:  # 与浏览器版本号前1位相同,需要继续修改

                        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是114版本以上,url\_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位(第一个小数点前的数字,例如:122)

    chrome\_ver\_pre\_3 = chrome\_version.rsplit('.', 1)[0]  # 浏览器版本号 前3位(即3组数字,中间点分隔,例如:122.01.32)

    if os.path.exists('chromedriver.exe'):  # 驱动文件存在,但是和浏览器版本不符

        loc\_drv\_ver = os.popen('chromedriver.exe --version').read().strip().split(' ')[1]  # 获取本地驱动文件版本

        if str(chrome\_ver\_pre\_1) not in loc\_drv\_ver:  # 浏览器版本号前1位和驱动文件版本前1位不相同

            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\_1), 115)

            else:

                extract\_zip(download\_114(url\_114, headers, chrome\_ver\_pre\_1), 114)

        else:  # 什么也没有

            print(f'当前google浏览器的版本号为:{chrome\_version} ')

            print('驱动文件 chromedriver.exe 不存在。\n正在下载,请稍等……')

            if chrome\_ver\_pre\_1 >= 115:  # 只要找前1位相同的版本号就行,比如:'122.0.6253.3'只要下载是122就开头的驱动即可

                extract\_zip(download\_115(url\_115, headers, chrome\_ver\_pre\_1), 115)

            else:

                extract\_zip(download\_114(url\_114, headers, chrome\_ver\_pre\_1), 114)





# endregion





# 调用示例

chromedriver\_download()  # 更新浏览器驱动

# 你的代码

service = Service('chromedriver.exe')

driver = webdriver.Chrome(service=service)

print('google浏览器启动成功。')

driver.get(r'https://www.baidu.com')

driver.quit()

2.linux版本

代码语言:python
代码运行次数:0
复制
# -\*- coding:utf-8 -\*-

# @author:Ye Zhoubing

# @datetime:2023/11/30 14:30

# @software: PyCharm

"""

    该程序的功能为自动更新chromedriver驱动,将驱动下载至当前文件夹,并解压到当前文件夹。

    if \_status == '200' and \_url.endswith('chromedriver-win32.zip')在这里根据

你的系统选择驱动,如果是linux系统,选择chromedriver-linux64.zip,如果是win系统,选择

chromedriver\_win64.zip或者chromedriver\_win32.zip

"""

import re

import shutil

import os

from zipfile import ZipFile

import requests

# region 自动更新chromedriver\_win32驱动

def chromedriver\_download(chrome\_version):

    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-linux64.zip'):  # chromedriver-linux64.zip,chromedriver-win32.zip,chromedriver-win64.zip;32位与64位都可以使用,不用纠结自己电脑是32位还是64位

                    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 str(\_chrome\_ver\_pre) in \_url:  # 与浏览器版本号前1位相同,需要继续修改

                        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'):

                os.remove('chromedriver')  # 驱动文件存在时,先删除

                print('原驱动文件 chromedriver删除完成。')

            zip\_ext\_folder = "-".join(zip\_n.split("-", 2)[:2])

            zip\_ext\_full\_name = f'{zip\_ext\_folder}/chromedriver' if int(ver\_pre) == 115 else 'chromedriver'

            # 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")  # 驱动文件移动到当前文件夹

                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是114版本以上,url\_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\_ver\_pre\_1 = int(chrome\_version.split('.')[0])  # 浏览器版本号 前1位(第一个小数点前的数字,例如:122)

    chrome\_ver\_pre\_3 = chrome\_version.rsplit('.', 1)[0]  # 浏览器版本号 前3位(即3组数字,中间点分隔,例如:122.01.32)

    if os.path.exists('chromedriver'):  # 驱动文件存在,但是和浏览器版本不符

        loc\_drv\_ver = os.popen('google-chrome --version').read().strip().split(' ')[1]  # 获取本地驱动文件版本

        if str(chrome\_ver\_pre\_1) not in loc\_drv\_ver:  # 浏览器版本号前1位和驱动文件版本前1位不相同

            print(f'当前google浏览器的版本号为:{chrome\_version} ')

            zip\_name = find\_zip\_name(chrome\_ver\_pre\_3)

            if zip\_name:  # 压缩包存在

                print(

                    f'驱动文件 chromedriver存在,版本号为:{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存在,版本号为:{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不存在,但是找到文件 {zip\_name}。')

            if chrome\_ver\_pre\_1 >= 115:

                extract\_zip(download\_115(url\_115, headers, chrome\_ver\_pre\_1), 115)

            else:

                extract\_zip(download\_114(url\_114, headers, chrome\_ver\_pre\_1), 114)

        else:  # 什么也没有

            print(f'当前google浏览器的版本号为:{chrome\_version} ')

            print('驱动文件 chromedriver不存在。\n正在下载,请稍等……')

            if chrome\_ver\_pre\_1 >= 115:  # 只要找前1位相同的版本号就行,比如:'122.0.6253.3'只要下载是122就开头的驱动即可

                extract\_zip(download\_115(url\_115, headers, chrome\_ver\_pre\_1), 115)

            else:

                extract\_zip(download\_114(url\_114, headers, chrome\_ver\_pre\_1), 114)











# 调用示例

cmd = "google-chrome --version"  # 获取chrome版本

chrome\_version = os.popen(cmd).read().strip().split(" ")[-1]

chromedriver\_download(chrome\_version)  # 更新浏览器驱动
注:

1.该程序考虑了114版本后chromedriver下载的网址不同的问题。

2.该程序都需要提前安装好chrome才能正常运行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.windows版本
  • 2.linux版本
    • 注:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档