Python自動下載最新的chromedriver


 

前言

chromedriver是Web UI自動化必備的一個谷歌Chrome瀏覽器的驅動文件,需要和自己電腦上安裝的Chrome瀏覽器版本對應才能正常使用。
經常遇到新手裝的Chrome瀏覽器自動更新了,但是chromedriver沒更新,導致原本正常的腳本突然不能用了。
因此想做一個腳本自動下載最新的chromedriver。

代碼

 1 import requests
 2 import re
 3 
 4 url = 'http://npm.taobao.org/mirrors/chromedriver/'
 5 rep = requests.get(url).text
 6 
 7 time_list = []          # 用來存放版本時間
 8 time_version_dict = {}  # 用來存放版本與時間對應關系
 9 
10 result = re.compile(r'\d.*?/</a>.*?Z').findall(rep) # 匹配文件夾(版本號)和時間
11 
12 for i in result:
13     time = i[-24:-1]                                # 提取時間
14     version = re.compile(r'.*?/').findall(i)[0]     # 提取版本號
15     time_version_dict[time] = version               # 構建時間和版本號的對應關系,形成字典
16     time_list.append(time)                          # 形成時間列表
17 
18 latest_version = time_version_dict[max(time_list)]              # 用最大(新)時間去字典中獲取最新的版本號
19 download_url = url + latest_version + 'chromedriver_win32.zip'  # 拼接下載鏈接
20 
21 file = requests.get(download_url)
22 with open("chromedriver.zip", 'wb') as zip_file:                # 保存文件到腳本所在目錄
23     zip_file.write(file.content)

 

思路

1、訪問頁面,觀察規律
http://npm.taobao.org/mirrors/chromedriver/
打開頁面后,觀察發現我們需要的最新的Chromedriver版本,可以通過右邊的時間進行對比后找到,但需要排除最下方的幾個無用文件的干擾。
可以看出版本目錄的鏈接都是數字開頭,/結尾,容易想到用正則表達式提取,規則為\d.*?/
在這里插入圖片描述
2、查看頁面源碼(接口返回),選擇處理方法
查看接口,發現頁面直接返回的是HTML,因此無法使用json處理,考慮使用BeautifulSoup4處理html文件。
然而實踐中發現時間並沒有包在a標簽內,用bs4獲取所有的a標簽,並沒有辦法獲取到對應的時間,所以也不能考慮用bs4處理。
那么只能嘗試使用正則表達式對信息進行提取處理了,選用re庫。
在這里插入圖片描述
3、數據處理
每個a標簽的格式為:
<a href="/mirrors/chromedriver/70.0.3538.16/">70.0.3538.16/</a> 2018-09-17T20:50:43.843Z

我們需要的只是后半段就可以了:70.0.3538.16/</a> 2018-09-17T20:50:43.843Z
規律為數字開頭,中間是/</a>,結尾是Z,正則為:\d.*?/</a>.*?Z

代碼為:results = re.compile(r'\d.*?/</a>.*?Z').findall(html內容)

在提出取來的信息中二次提取版本號:re.compile(r'.*?/').findall(result)

時間也可以用正則提取,不過由於格式比較固定,可以直接用字符串切片result[-24:-1],即最后的24個字符

接下來就簡單了,找到最新的時間,然后把這個時間對應的版本號找到就行了

思路為在遍歷每個a標簽的同時:

  1. 收集所有時間組成一個列表time_list;
  2. 同時將時間和版本構造成字典time_version_dict;

最后用max函數找到time_list的最大值,把最大值作為key去找time_version_dict的版本。

PS:挖個坑,后續增加自動解壓至指定目錄的功能,方便直接替換系統環境內的舊Chromedriver文件。

2019.01.26更新

來填坑了
通過cmd命令查詢當前Chromedriver的目錄和版本
在這里插入圖片描述
自動解壓到系統環境內替換Chromedriver的代碼

 1 import requests
 2 import re
 3 
 4 url = 'http://npm.taobao.org/mirrors/chromedriver/'
 5 rep = requests.get(url).text
 6 
 7 time_list = []          # 用來存放版本時間
 8 time_version_dict = {}  # 用來存放版本與時間對應關系
 9 
10 result = re.compile(r'\d.*?/</a>.*?Z').findall(rep) # 匹配文件夾(版本號)和時間
11 
12 for i in result:
13     time = i[-24:-1]                                # 提取時間
14     version = re.compile(r'.*?/').findall(i)[0]     # 提取版本號
15     time_version_dict[time] = version               # 構建時間和版本號的對應關系,形成字典
16     time_list.append(time)                          # 形成時間列表
17 
18 latest_version = time_version_dict[max(time_list)]              # 用最大(新)時間去字典中獲取最新的版本號
19 download_url = url + latest_version + 'chromedriver_win32.zip'  # 拼接下載鏈接
20 
21 file = requests.get(download_url)
22 with open("chromedriver.zip", 'wb') as zip_file:                # 保存文件到腳本所在目錄
23     zip_file.write(file.content)
View Code

 

將兩段代碼合並一下,加入判斷是否已經為最新文件,再封裝一下:

 1 import requests
 2 import re
 3 import os
 4 import zipfile
 5 
 6 def get_latest_version(url):
 7     '''查詢最新的Chromedriver版本'''
 8     rep = requests.get(url).text
 9     time_list = []                                          # 用來存放版本時間
10     time_version_dict = {}                                  # 用來存放版本與時間對應關系
11     result = re.compile(r'\d.*?/</a>.*?Z').findall(rep)     # 匹配文件夾(版本號)和時間
12     for i in result:
13         time = i[-24:-1]                                    # 提取時間
14         version = re.compile(r'.*?/').findall(i)[0]         # 提取版本號
15         time_version_dict[time] = version                   # 構建時間和版本號的對應關系,形成字典
16         time_list.append(time)                              # 形成時間列表
17     latest_version = time_version_dict[max(time_list)][:-1] # 用最大(新)時間去字典中獲取最新的版本號
18     return latest_version
19 
20 def download_driver(download_url):
21     '''下載文件'''
22     file = requests.get(download_url)
23     with open("chromedriver.zip", 'wb') as zip_file:        # 保存文件到腳本所在目錄
24         zip_file.write(file.content)
25         print('下載成功')
26 
27 def get_version():
28     '''查詢系統內的Chromedriver版本'''
29     outstd2 = os.popen('chromedriver --version').read()
30     return outstd2.split(' ')[1]
31 
32 def get_path():
33     '''查詢系統內Chromedriver的存放路徑'''
34     outstd1 = os.popen('where chromedriver').read()
35     return outstd1.strip('chromedriver.exe\n')
36 
37 def unzip_driver(path):
38     '''解壓Chromedriver壓縮包到指定目錄'''
39     f = zipfile.ZipFile("chromedriver.zip",'r')
40     for file in f.namelist():
41         f.extract(file, path)
42 
43 if __name__ == "__main__":
44     url = 'http://npm.taobao.org/mirrors/chromedriver/'
45     latest_version = get_latest_version(url)
46     print('最新的chromedriver版本為:', latest_version)
47     version = get_version()
48     print('當前系統內的Chromedriver版本為:', version)
49     if version == latest_version:
50         print('當前系統內的Chromedriver已經是最新的')
51     else:
52         print('當前系統內的Chromedriver不是最新的,需要進行更新')
53         download_url = url + latest_version + '/chromedriver_win32.zip'  # 拼接下載鏈接
54         download_driver(download_url)
55         path = get_path()
56         print('替換路徑為:', path)
57         unzip_driver(path)
58         print('更新后的Chromedriver版本為:', get_version())

 

 

測試一下:
在這里插入圖片描述
收工。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM