日常的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版本同步的问题,就再也不会困扰屏幕前的你了!(●'◡'●)

 欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

 

python一招完美搞定Chromedriver的自动更新的更多相关文章

  1. [转] Android:用GSON 五招之内搞定任何JSON数组

    [From] http://www.open-open.com/lib/view/open1472632967912.html 写在前面 关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 ...

  2. Python 五个知识点搞定作用域

    Python 五个知识点搞定作用域 1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = "lzl" print(na ...

  3. [转]用GSON 五招之内搞定任何JSON数组

    关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 <Google Gson的使用方法,实现Json结构的相互转换> ,写的很好,通俗易懂. 我为什么写这篇文章呢?因为前几晚跟 ...

  4. python技巧一行命令搞定局域网共享

    python超强玩法--一行命令搞定局域网共享 ​ 今天刷到python的一个新玩法,利用python自带的http服务,快速创建局域网共享服务,命令如下: python -m thhp.server ...

  5. python练习:一行搞定-统计一句话中每个单词出现的个数

    一行搞定-统计一句话中每个单词出现的个数 >>> s'i am a boy a bood boy a bad boy' 方式一:>>> dict([(i,s.spl ...

  6. 简单案列完美搞定Mvc设计模式

    一个小列子搞定Mvc模式,包括数据库以及如何提高用户体验度 1.首先来web.xml配置servlet的访问路径: <?xml version="1.0" encoding= ...

  7. python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!

    你好 由于你是游客 无法查看本文 请你登录再进 谢谢合作 当你在爬某些网站的时候 需要你登录才可以获取数据 咋整? 莫慌 小帅b把这几招传授给你 让你以后从容应对 那么 接下来就是 学习 python ...

  8. 【Python selenium自动化环境配置】4步搞定ChromeDriver版本选择

    很多刚做自动化的小伙伴,会在ChromeDriver版本选择时犯难,看来大家都被坑过,真正掌握独门绝技,都不是难事儿. 看好了主要步骤就4部 1.确定谷歌浏览器版本 2.找到谷歌浏览器版本与Chrom ...

  9. 当文件目录变得杂乱不堪怎么办,python帮你轻松搞定

    这几天和几个小伙伴,在一起合做一个ppt. 做ppt之前有原版的ppt,和一个word大纲,在制作过程中,又不断添加图片.视频等素材,最终,整个目录变得杂乱不堪(见下图-处理之前) 那我想,可不可以做 ...

随机推荐

  1. C++库的随机数生成

    C++库为我们提供了很多生成随机数的方法. 使用C的随机数生成法 先学过C语言,或者仅仅用C++做算法的人.对rand()是非常熟悉了.这个函数没有参数,生成0到RAND_MAX的随机数(RAND_M ...

  2. Python列表解析式的正确使用方式

    先来逼逼两句: Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法.在本文中,将会展示列表解析式 (List Comprehension).我们将讨论如何使用它?什 ...

  3. Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法

    SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = ...

  4. 跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)

    论文介绍:Negative-Aware Attention Framework for Image-Text Matching (基于负感知注意力的图文匹配,CVPR2022) 代码主页:https: ...

  5. Collections集合工具类的方法_sort(List)和sort(List,Comparator)方法

    Comparator比较器 我们还是先研究这个方法 public static <T> void sort(List<T> list):将集合中元素按照默认规则排序. 不过这次 ...

  6. ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群

    本次 Apache ShardingSphere 5.1.2 版本更新为大家带来了三大全新功能,其中之一即为使用 ShardingSphere-Proxy chart 在云环境中快速部署一套 Shar ...

  7. JetBrains系列软件激活

    1.将以下记录加入hosts文件 0.0.0.0 account.jetbrains.com0.0.0.0 www.jetbrains.com 2.激活方式选择licence server,填写以下激 ...

  8. 04 MySQL_数据相关的SQL

    字符编码问题: 如果使用Windows电脑SQL语句中写中文报错的话,通过以下指令解决 set names gbk; 判空NULL问题: 判值用=,判空用is xxx = 非空值; xxx is nu ...

  9. Oracle,SAP等暂停俄所有业务,国产化刻不容缓,无代码又该如何发力

    国产化刻不容缓 "如果不是自主可控的产品,我们这个行业可能有一天就瘫痪了."这句话最早是中国工程院院士倪先生预言的.然而,2022年的今天,由于俄乌战争,包括Oracle.SAP等 ...

  10. 非root源码安装gcc和cmake

    一.安装cmake 1.下载cmale 下载地址:https://cmake.org/files tar -zxvf cmake-3.19.8.tar.gz cd cmake-3.19.8/ ./co ...