前言
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标签的同时:
- 收集所有时间组成一个列表time_list;
- 同时将时间和版本构造成字典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)
将两段代码合并一下,加入判断是否已经为最新文件,再封装一下:
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 ') 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())
测试一下:
收工。