• 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
    ')
    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())

    测试一下:
    在这里插入图片描述
    收工。

  • 相关阅读:
    2022年论文阅读日志
    Powerful Discount Tickets(贪心,数学)
    Teleporter Setting(最短路,思维)
    Who Says a Pun?(exKMP)
    Face Produces Unhappiness(贪心)
    笛卡尔树(递归,二叉树)
    TortoiseGit使用视频教程的实践
    TortoiseGit使用视频教程的启发
    备案未接入导致无法访问
    流水文之访问速度慢
  • 原文地址:https://www.cnblogs.com/haiya2019/p/10627739.html
Copyright © 2020-2023  润新知