python一招完美搞定Chromedriver的自動更新

2022-09-16 06:00:37

   日常的web自動化過程中,我們常常用python selenium庫來操縱Chrome瀏覽器實現網頁的自動化。這其中有個比較頭疼的問題:Chrome的更新頻率非常頻繁,與之對應的Chromedriver版本也必須相應更新。如果兩者版本的主版本號相差超過1,selenium則會報異常,大概錯誤資訊如下:

發生異常: 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
  那有沒有好的辦法解決這個問題呢?方法當然有,首先我們需要知道哪裡可以下載到不同版本的Chromedriver檔案。這裡推薦兩個網站,國內首選chromedriver淘寶的映象倉庫:http://npm.taobao.org/mirrors/chromedriver/。其存取和下載速度很快,僅有如下幾個缺點:
1、資料更新會比谷歌官方稍慢;
2、可供下載的版本有時不全;
3、網站域名和介面有時會變化,這間接影響到了自動下載的方法。
 
其網站介面如下:

 

 

  如果希望穩定獲取對應版本的chromedriver,這裡更加推薦谷歌官方的源倉庫(莫慌張,該域名在國內可以正常存取),網址為:https://chromedriver.storage.googleapis.com/index.html。介面與淘寶映象倉庫的別無二致:

 

   那麼問題來了,如何讓python指令碼自動幫我們下載和更新chromedriver,使其與chrome瀏覽器版本相一致呢?這就體現出python第三方庫遍地開花的優勢了。webdriver-manager庫,沒錯,我們只需要通過pip install webdriver-manager來安裝該三方庫。通過庫名也不難看出,該工具可以有效管理主流瀏覽器所需的webdriver:chrome、Edge、chromium、firefox、IE、Opera的支援都不在話下。本文以chrome來舉例。

假設我們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會灰常貼心地自動檢查本地快取路徑,確認有無該版本的chromedriver,如果確認沒有,它才會聯網下載最新版本的chromedriver,控制檯中還會顯示下載速度和進度,極其用心。如果我們覺得webdriver的紀錄檔多餘,官方也提供了方法供我們關閉相關紀錄檔,程式碼如下:

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引數,程式碼範例如下:

from webdriver_manager.chrome import ChromeDriverManager

ChromeDriverManager(version="106.0.5249.21").install()

 

  這裡引出了真正的問題,假使我們本機上使用的chrome不是最新版,我們又該如何去實現自動更新chromedriver呢?這就是小爬在本文中要重點解決的問題:

細細思考後不難看出,我們只需要分以下幾個步驟來實現:

1、自動獲取當前電腦的chrome瀏覽器版本;

2、提取瀏覽器版本的主版本號,如chrome版本為106.0.5249.21,那麼其主版本號就是」106「;

3、利用requests庫請求chromedriver的映象倉庫,解析返回的html原始碼,獲得每個版本的chromedriver連結;

4、從步驟3獲得的所有下載連結中,找到主版本與chrome一致的,從中隨意取出一個即可滿足要求(我們不妨取出第一個滿足要求的chromedriver版本);

5、將該版本號傳入ChromeDriverManager範例,即可下載使用對應的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") # 獲取當前系統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"映象網站上沒有找到主版本號為{mainBrowserVersion}的chromedriver檔案,請核實!")
    time.sleep(10)
    os._exit(0)
else:
    availableVersion=availableVersionList.group(1)
driver_path=ChromeDriverManager(version=availableVersion).install() # 找到映象網站中主版本號與chrome主版本一致的,將匹配到的第一個完整版本號的chromedriver下載使用

  有了這段程式碼,chromedriver與chrome版本同步的問題,就再也不會困擾螢幕前的你了!(●'◡'●)

 歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!