下面提供一个能自动下载自己谷歌浏览器对应版本的chromedriver
的python程序。(windows系统)
# -\*- 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()
# -\*- 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 删除。