作者:虚坏叔叔
博客:https://xuhss.com
早餐店不会开到晚上,想吃的人早就来了!
日常的web自动化过程中,我们常常用python selenium库来操纵Chrome浏览器实现网页的自动化。这其中有个比较头疼的问题:Chrome的更新频率非常频繁,与之对应的Chromedriver版本也必须相应更新。如果两者版本的主版本号相差超过1,selenium则会报异常.
那有没有好的办法解决这个问题呢?方法当然有,首先我们需要知道哪里可以下载到不同版本的Chromedriver
文件。这里推荐两个网站,国内首选chromedriver
淘宝的镜像仓库:
http://npm.taobao.org/mirrors/chromedriver/
其访问和下载速度很快,仅有如下几个缺点:
其网站界面如下:
如果希望稳定获取对应版本的chromedriver
,这里更加推荐谷歌官方的源仓库(莫慌张,该域名在国内可以正常访问),网址为:https://chromedriver.storage.googleapis.com/index.html。界面与淘宝镜像仓库的别无二致:
webdriver-manager
库及原理那么问题来了,如何让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呢?这就是小爬在本文中要重点解决的问题:
细细思考后不难看出,我们只需要分以下几个步骤来实现:
直接带着各位童鞋开整啦,下面全是干货。示例代码如下:
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"( {mainBrowserVersion}\.\d+\.\d+\.\d+)/chromedriver_win32\.zip.*?",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实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ | 难度偏高 | 分享学习QT成品的视频播放器源码,需要有扎实的C++知识! |
游戏爱好者九万人社区 | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
Python零基础到入门 | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!