python一招完美搞定Chromedriver的自动更新问题

  日常的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 installwebdriver-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的自动更新的文章就介绍到这了,更多相关python Chromedriver自动更新内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python+Selenium+ChromeDriver的配置和问题解决

    安装前的准备 1.python的安装和配置 在Window下:在开始菜单中找到运行输入cmd或直接搜索cmd点击进入,输入python,如果出现下图中的>>>则证明Python安装成功. 检测Chrome的版本号安装Chromedriver 记录版本号: 87.0.4280.88 打开ChromeDirver网址:http://chromedriver.storage.googleapis.com/index.html 选择对应版本号的文件夹并打开 ChromeDriver的环境配置 C

  • selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)

    使用WebDriver在Chrome浏览器上进行测试时,需要从http://chromedriver.storage.googleapis.com/index.html网址中下载与本机chrome浏览器对应的驱动程序,驱动程序名为chromedriver: chromedriver的版本需要和本机的chrome浏览器对应,才能正常使用: 第一步:下载对应版本的chromedriver驱动文件,具体版本请对照文章底部的对应关系表: 如本机的chrome浏览器版本为:版本 61.0.3163.100

  • Python利用PyAutoGUI轻松搞定图片上传

    目录 实时获取鼠标的当前坐标 开始上传了 完整脚本 运行过程 最近用vuepress建了个博客,音乐的背景图片需要网络地址. 还有博客自动复用的摘要图片也需地址 开始用的阿里云的免费对象存储oss,但又是登录又是设置读写权限的,稀碎的操作令人疲惫.能不能简单点,自动上传,并且马上能得到文件的网络地址. 于是开始探索轻量级的方案,手动给自己搞一个,一键复制开箱即用的的上传页面: 把文件传到自己的云服务器上,传完后自带文件地址和copy按钮,流程顿时清爽了许多. 接下来的问题是,图片准备好了,十几张

  • SQL Server数据汇总五招轻松搞定

    本文我们将讨论如何使用GROUPBY子句来汇总数据. 使用单独列分组 GROUP BY子句通过设置分组条件来汇总数据,在第一个例子中,我在数据库AdventureWork2012中的表 Sales.SalesOrderDetail.中的一列上进行数据分组操作.这个例子以及其他例子都使用数据库AdventureWorks2012,如果你想使用它运行我的代码,你可以点击下载. 下面是第一个示例的源码,在CarrierTrackingNumber列上使用group by子句进行数据分组操作 USE A

  • 在python中利用pycharm自定义代码块教程(三步搞定)

    当我们在使用pycharm时,输入特殊的关键字会有提示,然后按enter就可以自动补全,如果我们经常需要输出重复的代码时,能否也利用这种方法来自动补全呢? 下面我们就来利用pycharm自定义代码块: 1.打开pycharm中file下的setting,找到Editor下面的Live Templates ,右侧就会出现各种语言的代码块,我们选择Python,点击右侧的"+",选择Live Template 2.Abbreviation就是你自定义代码块的名字,Description是描

  • idea一招搞定同步所有配置(导入或导出所有配置)

    目录 intellij idea同步所有配置[导入或导出所有配置] [补充]intellij idea将自己的设置同步到账号中 intellij idea同步所有配置[导入或导出所有配置] IDEA版本:2020.1 [原因]使用intellij idea很长一段时间,软件相关的配置也都按照自己习惯的设置好,如果需要重装软件,还得需要重新设置 [操作]: 1.首先将本地的设置上传到云端[其中可能会修改写插件-在右下角点击云朵修改即可] 2.在另一台电脑上同步设置[同步在右下角小云朵] 同时要将s

  • python调用文字识别OCR轻松搞定验证码

    今天带你们去研究一个有趣的东西,文字识别OCR.不知道你们有没有想要识别图片,然后读出文字的功能.例如验证码,如果需要自动填写的话就需要这功能.还有很多种情况需要这功能的. 我们可以登录百度云,然后看看里面的接口文档.接口功能还是有比较丰富的应用场景的. # encoding:utf-8 import requests import base64 ''' 通用文字识别 ''' request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/gene

  • Python轻松搞定视频剪辑重复性工作问题

    目录 01 安装 02 剪辑 01 安装 对视频进行批量剪辑,需要三个库,分别是Moviepy库和Pathlib库,还有Tkinter库. 首先我们对这两个库进行安装,命令如下: pip install moviepy pip install pathlib 02 剪辑 上面我们已经安装好所需要的库了,现在开始来对视频进行剪辑操作. 视频剪辑: Moviepy库有一个VideoFileClip函数,将视频传入这个函数后,会返回一个VideoFileClip实例对象,该对象可以被subclip()

  • 一篇文章带你搞定Python多进程

    目录 1.Python多进程模块 2.Python多进程实现方法一 3.Python多进程实现方法二 4.Python多线程的通信 5.进程池 1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象.这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线

  • Python 中的 Counter 模块及使用详解(搞定重复计数)

    文章目录 参考描述Counter 模块Counter() 类Counter() 对象字典有序性KeyError魔术方法 \_\_missing\_\_ update() 方法 Counter 对象的常用方法most_common()elements()total()subtract() Counter 对象间的运算加法运算减法运算并集运算交集运算单目运算 Counter 对象间的比较>== 参考 项目 描述 Python 标准库 DougHellmann 著 / 刘炽 等 译 搜索引擎 Bing

  • VSCode配合pipenv搞定虚拟环境的实现方法

    VSCode指定Python路径快捷运行py脚本之前写过了,这样配置有一个问题:所有的python脚本都使用的同一个python来执行的.现在是虚拟环境的天下,怎样做到不同的项目使用的不同的Python环境呢? 想做到这个也简单,关键三点 一.使用不同的VSCode打开不同的项目 二.虚拟环境以同样的文件夹名放在项目根目录如.venv 三.之前的python路径设置相对路径 .venv/bin/python 预期目标两个: 一 使用Command+Shift+b运行时使用当前虚拟环境的pytho

  • JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查

    正文 前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue也确实挺火,各种入门博文眼花缭乱,博主也不敢说写得多好,就当是个学习笔记,有兴趣的可以看看. 一.MVVM大比拼 关于MVVM,原来在介绍knockout.js的时候有过讲解,目前市面上比较火的MVVM框架也是一抓一大把,比如常见的有Knockout.js.Vue.js.AvalonJS.An

随机推荐