網(wǎng)站首頁 編程語言 正文
日常的web自動化過程中,我們常常用python selenium庫來操縱Chrome瀏覽器實現(xiàn)網(wǎng)頁的自動化。這其中有個比較頭疼的問題:Chrome的更新頻率非常頻繁,與之對應(yīng)的Chromedriver版本也必須相應(yīng)更新。如果兩者版本的主版本號相差超過1,selenium則會報異常,大概錯誤信息如下:
發(fā)生異常: SessionNotCreatedException
Message: session not created: This version of ChromeDriver only supports Chrome version 95 Current browser version is 105.0.5195.102 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
那有沒有好的辦法解決這個問題呢?方法當(dāng)然有,首先我們需要知道哪里可以下載到不同版本的Chromedriver文件。這里推薦兩個網(wǎng)站,國內(nèi)首選chromedriver淘寶的鏡像倉庫:http://npm.taobao.org/mirrors/chromedriver/。其訪問和下載速度很快,僅有如下幾個缺點:
1、數(shù)據(jù)更新會比谷歌官方稍慢;
2、可供下載的版本有時不全;
3、網(wǎng)站域名和界面有時會變化,這間接影響到了自動下載的方法。
其網(wǎng)站界面如下:
如果希望穩(wěn)定獲取對應(yīng)版本的chromedriver,這里更加推薦谷歌官方的源倉庫(莫慌張,該域名在國內(nèi)可以正常訪問),網(wǎng)址為:https://chromedriver.storage.googleapis.com/index.html。界面與淘寶鏡像倉庫的別無二致:
那么問題來了,如何讓python腳本自動幫我們下載和更新chromedriver,使其與chrome瀏覽器版本相一致呢?這就體現(xiàn)出python第三方庫遍地開花的優(yōu)勢了。webdriver-manager庫,沒錯,我們只需要通過pip installwebdriver-manager來安裝該三方庫。通過庫名也不難看出,該工具可以有效管理主流瀏覽器所需的webdriver:chrome、Edge、chromium、firefox、IE、Opera的支持都不在話下。本文以chrome來舉例。
假設(shè)我們Chrome總是自動更新至最新版,我們自然每次使用selenium前需要確保chromedriver處于最新版(latest_release),此時我們只需要寥寥幾行代碼即可搞定:
# selenium 4
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
driver_path=ChromeDriverManager().install() #下載latest release版本的chromedriver,并返回其在本機的下載存儲路徑
driver = webdriver.Chrome(service=Service(driver_path))
有了這段腳本webdriver-manager會灰常貼心地自動檢查本地緩存路徑,確認(rèn)有無該版本的chromedriver,如果確認(rèn)沒有,它才會聯(lián)網(wǎng)下載最新版本的chromedriver,控制臺中還會顯示下載速度和進(jìn)度,極其用心。如果我們覺得webdriver的日志多余,官方也提供了方法供我們關(guān)閉相關(guān)日志,代碼如下:
import logging
import os
os.environ['WDM_LOG'] = str(logging.NOTSET)
我們還可以方便地指定chromedriver的本地下載和保存路徑,它既可以支持相對路徑,也可以支持絕對路徑的寫法,代碼示例如下:
from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager(path = r".\\Drivers").install()
如果我們希望下載指定版本的chromedriver,可以給上面的ChromeDriverManager實例傳入version參數(shù),代碼示例如下:
from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager(version="106.0.5249.21").install()
這里引出了真正的問題,假使我們本機上使用的chrome不是最新版,我們又該如何去實現(xiàn)自動更新chromedriver呢?這就是小爬在本文中要重點解決的問題:
細(xì)細(xì)思考后不難看出,我們只需要分以下幾個步驟來實現(xiàn):
1、自動獲取當(dāng)前電腦的chrome瀏覽器版本;
2、提取瀏覽器版本的主版本號,如chrome版本為106.0.5249.21,那么其主版本號就是”106“;
3、利用requests庫請求chromedriver的鏡像倉庫,解析返回的html源碼,獲得每個版本的chromedriver鏈接;
4、從步驟3獲得的所有下載鏈接中,找到主版本與chrome一致的,從中隨意取出一個即可滿足要求(我們不妨取出第一個滿足要求的chromedriver版本);
5、將該版本號傳入ChromeDriverManager實例,即可下載使用對應(yīng)的chromedriver。
小爬直接帶著各位童鞋開整啦,下面全是干貨。示例代碼如下:
from webdriver_manager.core.utils import get_browser_version_from_os
from webdriver_manager.chrome import ChromeDriverManager
import requests,re,time,os
browserVersion=get_browser_version_from_os("google-chrome") # 獲取當(dāng)前系統(tǒng)chrome瀏覽器的版本號
mainBrowserVersion=browserVersion.split(".")[0] # 獲取瀏覽器的主版本號
resp=requests.get(url="https://chromedriver.storage.googleapis.com/")
content=resp.text
availableVersionList=re.search(f"<Contents><Key>({mainBrowserVersion}\.\d+\.\d+\.\d+)/chromedriver_win32\.zip</Key>.*?",content,re.S)
if availableVersionList==None:
print(f"鏡像網(wǎng)站上沒有找到主版本號為{mainBrowserVersion}的chromedriver文件,請核實!")
time.sleep(10)
os._exit(0)
else:
availableVersion=availableVersionList.group(1)
driver_path=ChromeDriverManager(version=availableVersion).install() # 找到鏡像網(wǎng)站中主版本號與chrome主版本一致的,將匹配到的第一個完整版本號的chromedriver下載使用
有了這段代碼,chromedriver與chrome版本同步的問題,就再也不會困擾屏幕前的你了!(●'?'●)
原文鏈接:https://www.cnblogs.com/new-june/p/16698204.html
相關(guān)推薦
- 2022-04-19 一起來了解c語言的str函數(shù)_C 語言
- 2022-07-26 golang中slice切片使用的誤區(qū)
- 2022-10-22 C#?設(shè)置Chart的X軸為時間軸???????詳情_C#教程
- 2022-07-08 python?根據(jù)csv表頭、列號讀取數(shù)據(jù)的實現(xiàn)_python
- 2022-08-26 教你用python從日期中獲取年、月、日和星期等30種信息_python
- 2022-11-18 Python?數(shù)據(jù)清洗刪除缺失值替換缺失值詳情_python
- 2022-07-08 C#實現(xiàn)IDisposable接口釋放非托管資源_C#教程
- 2022-04-07 淺談C++11中=delete的巧妙用法_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支