由于谷歌游覽器經(jīng)常自動(dòng)更新導(dǎo)致selenium驅(qū)動(dòng)失效需要重新下載,如何讓代碼自動(dòng)更新selenium驅(qū)動(dòng)的方法呢?
selenium連接谷歌游覽器拋出異常時(shí),會(huì)展示當(dāng)前谷歌游覽器的版本信息,我們可以到selenium驅(qū)動(dòng)下載的網(wǎng)站獲取全部版本信息,然后找個(gè)一個(gè)匹配的版本進(jìn)行下載并解壓即可。
為了更快的下載速度,這里我選擇國(guó)內(nèi)的鏡像站:http://npm.taobao.org/mirrors/chromedriver/
它會(huì)重定向到:https://registry.npmmirror.com/binary.html?path=chromedriver/
經(jīng)過開發(fā)者工具檢查,可以找到獲取最新的全部版本信息的接口:https://registry.npmmirror.com/-/binary/chromedriver/
我按照前三個(gè)號(hào)作為鍵進(jìn)行匹配,下載小版本號(hào)最大的作為驅(qū)動(dòng)。
最終完整代碼為:
from selenium import webdriver
from selenium.common.exceptions import SessionNotCreatedException
import re
import os
import requests
import zipfile
import itertools
def getChromeDriver(options=None):
"""代碼作者:小小明-代碼實(shí)體 xxmdmst.blog.csdn.net"""
try:
driver = webdriver.Chrome(options=options)
return driver
except SessionNotCreatedException as e:
driver_version = re.search(
"Chrome version ([\d.]+)", str(e)).group(1)
chrome_version = re.search(
"Current browser version is ([\d.]+) with", str(e)).group(1)
print(f"驅(qū)動(dòng)版本:{driver_version},谷歌游覽器版本:{chrome_version},不兼容\n開始更新驅(qū)動(dòng)...")
res = requests.get(
"https://registry.npmmirror.com/-/binary/chromedriver/")
versions = [obj["name"][:-1] for obj in res.json() if re.match("\d+",
obj["name"]) and obj["name"].count(".") == 3]
versions = {key: max(versions_split, key=lambda x: int(x[x.rfind(".")+1:]))
for key, versions_split in itertools.groupby(versions, key=lambda x: x[:x.rfind(".")])}
dest_version = versions[chrome_version[:chrome_version.rfind(".")]]
print("驅(qū)動(dòng)將更新到", dest_version)
file = f"chromedriver_{dest_version}_win32.zip"
if not os.path.exists(file):
url = f"https://registry.npmmirror.com/-/binary/chromedriver/{dest_version}/chromedriver_win32.zip"
print("驅(qū)動(dòng)下載地址:", url)
res = requests.get(url)
with open(file, 'wb') as f:
f.write(res.content)
else:
print(file, "文件已經(jīng)下載到當(dāng)前目錄,下面直接使用緩存解壓覆蓋...")
with zipfile.ZipFile(file) as zf:
zf.extract("chromedriver.exe", ".")
driver = webdriver.Chrome(options=options)
return driver
options = webdriver.ChromeOptions()
options.add_experimental_option(
'excludeSwitches', ['enable-logging', 'enable-automation'])
driver = getChromeDriver(options)
driver.get("https://www.baidu.com/")
驅(qū)動(dòng)不兼容時(shí)的打印示例:
驅(qū)動(dòng)版本:100,谷歌游覽器版本:102.0.5005.115,不兼容
開始更新驅(qū)動(dòng)...
驅(qū)動(dòng)將更新到 102.0.5005.61
驅(qū)動(dòng)下載地址: https://registry.npmmirror.com/-/binary/chromedriver/102.0.5005.61/chromedriver_win32.zip
上面自己開發(fā)的下載方法下載速度相對(duì)是比較快的,如果嫌棄代碼太長(zhǎng),可以使用webdriver_manager這個(gè)庫(kù),通過pip可以直接安裝:
pip install webdriver_manager
然后執(zhí)行以下代碼即可從 https://chromedriver.storage.googleapis.com自動(dòng)下載匹配的驅(qū)動(dòng),并返回下載位置:
from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager().install()
打印示例:文章來源:http://www.zghlxwxcb.cn/news/detail-699114.html
[WDM] - ====== WebDriver manager ======
[WDM] - Current google-chrome version is 102.0.5005
[WDM] - Get LATEST chromedriver version for 102.0.5005 google-chrome
[WDM] - There is no [win32] chromedriver for browser 102.0.5005 in cache
[WDM] - About to download new driver from https://chromedriver.storage.googleapis.com/102.0.5005.61/chromedriver_win32.zip
[WDM] - Driver has been saved in cache [C:\Users\ASUS\.wdm\drivers\chromedriver\win32\102.0.5005.61]
'C:\\Users\\ASUS\\.wdm\\drivers\\chromedriver\\win32\\102.0.5005.61\\chromedriver.exe'
這樣我們可以直接通過返回的字符串設(shè)置驅(qū)動(dòng)的位置:文章來源地址http://www.zghlxwxcb.cn/news/detail-699114.html
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install(), options=None)
到了這里,關(guān)于自動(dòng)更新Selenium驅(qū)動(dòng)chromedriver的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!