一段時間沒有使用Chrome webdriver后,由於Chrome瀏覽器升級導致原有的chromedriver已經過期,所以決定寫個小程序來實現自動去更新Chrome webdriver,這樣就無后顧之憂了。
思路:
- 獲取Chrome瀏覽器的版本信息
- 獲取Chrome webdriver的版本信息
- 對比Chrome瀏覽器版本信息和webdriver版本信息是否一樣
- 如果一樣則無需更新
- 不一樣則去網上下載對應的webdriver放到python安裝路徑下
由於google網址無法訪問,這邊使用的是淘寶提供的鏡像網址:http://npm.taobao.org/mirrors/chromedriver/
代碼如下:
import os import re import sys import winreg import zipfile from pathlib import Path import requests python_root = Path(sys.executable).parent # python安裝目錄 base_url = 'http://npm.taobao.org/mirrors/chromedriver/' # chromedriver在國內的鏡像網站 version_re = re.compile(r'^[1-9]\d*\.\d*.\d*') # 匹配前3位版本信息 def get_chrome_version(): """通過注冊表查詢Chrome版本信息: HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\BLBeacon: version""" try: key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'SOFTWARE\Google\Chrome\BLBeacon') value = winreg.QueryValueEx(key, 'version')[0] return version_re.findall(value)[0] except WindowsError as e: return '0.0.0' # 沒有安裝Chrome瀏覽器 def get_chrome_driver_version(): try: result = os.popen('chromedriver --version').read() version = result.split(' ')[1] return '.'.join(version.split('.')[:-1]) except Exception as e: return '0.0.0' # 沒有安裝ChromeDriver def get_latest_chrome_driver(chrome_version): url = f'{base_url}LATEST_RELEASE_{chrome_version}' latest_version = requests.get(url).text download_url = f'{base_url}{latest_version}/chromedriver_win32.zip' # 下載chromedriver zip文件 response = requests.get(download_url) local_file = python_root / 'chromedriver.zip' with open(local_file, 'wb') as zip_file: zip_file.write(response.content) # 解壓縮zip文件到python安裝目錄 f = zipfile.ZipFile(local_file, 'r') for file in f.namelist(): f.extract(file, python_root) f.close() local_file.unlink() # 解壓縮完成后刪除zip文件 def check_chrome_driver_update(): chrome_version = get_chrome_version() driver_version = get_chrome_driver_version() if chrome_version == driver_version: print('No need to update') else: try: get_latest_chrome_driver(chrome_version) except Exception as e: print(f'Fail to update: {e}') if __name__ == '__main__': check_chrome_driver_update()