pythonselenium⾃动化之chrome与chromedriver版本兼容问题
  ⼤家都知道,我们借助python+selenium来驱动chrome等浏览器时,需要有chromedriver的⽀持。近来,chrome浏览器的主版本号基本保持每⽉⼀更新的频次。当我们的chromedriver版本如果落后chrome主版本超过1,则chromedriver会提⽰版本不兼容,⼤概显⽰信息如下:“ptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 80”。
  解决此问题有两个⽅法,先来说说治标的⽅法:早期的chromedriver并不严格校验chrome浏览器的版本,⽽且⾯对最新的chrome,它依然够⽤,毕竟⼤多数时候我们常⽤的chrome的api功能都没变过。所以,我们可以使⽤旧版本chromedriver来规避这个问题,⽐如ChromeDriver 2.35.528161就不存在这个问题;
  接下来⼩爬重点说说相对治本的⽅法:我们在脚本中分别获取chromedriver和chrome的版本号,⽐较其主版本号的差异,触发条件后,⾃动在chromedriver mirror上下载与chrome相对应版本的chromedriver,解压,替换原chrome driver⽂件,⼀⽓呵成。
  chrome的版本,我们⼀般通过浏览器地址栏输⼊“chrome://settings/help”来查看:
也可以右键⽂件来查看版本号:
在python的世界⾥,我们可以这样去读取⼀个⽂件(如chrome)的“属性-详细信息-产品版本信息”(需要提前安装pywin32模块),返回值是⼀个版本号的字符串:“87.0.4280.141”:
from win32com.client import Dispatch
allInfo=Dispatch("Scripting.FileSystemObject")
version = allInfo.GetFileVersion(r"C:\Program Files (x86)\Google\Chrome\")
我们也可以通过注册表的⽅式来获取chrome的版本号:
import winreg
def get_Chrome_version():
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon')
version, types = winreg.QueryValueEx(key, 'version')
return version
  接下来,我们在cmd或者powershell⾥,CD到chromedriver所在⽬录,可以这样得到版本号:.\ --V  ,返回结果⼤概这样:“ChromeDriver 2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73)”,该字符串按照空格符进⾏分段,第⼆段就是我们要的版本信息了。那么在python的世界⾥,我们⼜该如何去跟终端交互拿到这个chromedriver版本号呢,其实很简单:
import os
def get_version():
'''查询系统内的Chromedriver版本'''
outstd2 = os.popen('chromedriver --version').read()
return outstd2.split('')[1]
有了这些⼿段,我们还需要定义个⽅法来⾃动下载”“上的chromedriver:
import requests
def download_driver(download_url):
'''下载⽂件'''
file = (download_url)
with open("chromedriver.zip", 'wb') as zip_file:        # 保存⽂件到脚本所在⽬录
zip_file.t)
print('下载成功')
你也可以指定完整路径,让下载的chromedriver.zip⽂件放到指定⽬录。
紧接着,⼩爬再定义个⽅法来⾃动解压zip⽂件,拿到⾥⾯的⽂件,⾃动覆盖旧版本chrome driver:
import zipfile
def unzip_driver(path):
'''解压Chromedriver压缩包到指定⽬录'''
f = zipfile.ZipFile("chromedriver.zip",'r')
for file in f.namelist():
⼩爬将这些功能做成⼀个py⽂件,可以import到我们的任何其他相关项⽬中,完整的⽰例代码如下:
import requests,winreg,zipfile,re,os
url='/mirrors/chromedriver/'# chromedriver download link
def get_Chrome_version():
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon')
version, types = winreg.QueryValueEx(key, 'version')
return version
def get_latest_version(url):
'''查询最新的Chromedriver版本'''
rep = (url).text
time_list = []                                          # ⽤来存放版本时间
time_version_dict = {}                                  # ⽤来存放版本与时间对应关系
result = repile(r'\d.*?/</a>.*?Z').findall(rep)    # 匹配⽂件夹(版本号)和时间
for i in result:
time = i[-24:-1]                                    # 提取时间
version = repile(r'.*?/').findall(i)[0]        # 提取版本号
time_version_dict[time] = version                  # 构建时间和版本号的对应关系,形成字典
time_list.append(time)                              # 形成时间列表
latest_version = time_version_dict[max(time_list)][:-1] # ⽤最⼤(新)时间去字典中获取最新的版本号
return latest_version
def get_server_chrome_versions():
'''return all versions list'''
versionList=[]
url="/mirrors/chromedriver/"
rep = (url).text
result = repile(r'\d.*?/</a>.*?Z').findall(rep)
for i in result:                                # 提取时间
version = repile(r'.*?/').findall(i)[0]        # 提取版本号
versionList.append(version[:-1])                  # 将所有版本存⼊列表
return versionList
def download_driver(download_url):
'''下载⽂件'''
file = (download_url)
with open("chromedriver.zip", 'wb') as zip_file:        # 保存⽂件到脚本所在⽬录
zip_file.t)
print('下载成功')
def get_version():
'''查询系统内的Chromedriver版本'''
outstd2 = os.popen('chromedriver --version').read()
return outstd2.split('')[1]
def unzip_driver(path):
'''解压Chromedriver压缩包到指定⽬录'''
f = zipfile.ZipFile("chromedriver.zip",'r')
for file in f.namelist():
def check_update_chromedriver():
chromeVersion=get_Chrome_version()
chrome_main_version=int(chromeVersion.split(".")[0]) # chrome主版本号
driverVersion=get_version()
driver_main_version=int(driverVersion.split(".")[0]) # chromedriver主版本号
download_url=""
if driver_main_version!=chrome_main_version:
print("chromedriver版本与chrome浏览器不兼容,更新中>>>")
versionList=get_server_chrome_versions()
if chromeVersion in versionList:
download_url=f"{url}{chromeVersion}/chromedriver_win32.zip"
else:
for version in versionList:
if version.startswith(str(chrome_main_version)):
download_url=f"{url}{version}/chromedriver_win32.zip"
break
chrome浏览器最新版
if download_url=="":
print("暂⽆法到与chrome兼容的chromedriver版本,请在/mirrors/chromedriver/ 核实。")        download_driver(download_url=download_url)
path = get_path()
unzip_driver(path)
print('更新后的Chromedriver版本为:', get_version())
else:
print("chromedriver版本与chrome浏览器相兼容,⽆需更新chromedriver版本!")
if__name__=="__main__":
check_update_chromedriver()
有了这套⽅法,任由你的本地chrome如何更新,我们的项⽬中的chromedriver总能⾃动更新,兼容浏览器的版本,可谓是⼀劳永逸了~~有这类困扰的童鞋,赶紧⽤上⾯的⽅法动⼿试试吧!
快来扫码关注我的获取更多爬⾍、数据分析的知识!