selenium-自动更新谷歌浏览器驱动

article/2025/6/25 23:08:23

1、简介

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题,因为有些网页数据是通过JavaScript动态加载的。selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如输入、点击、跳转等,来拿到网页渲染之后的结果,可以支持多种浏览器。

2、环境安装

 2.1、安装selenium库

pip install selenium

2.2、安装浏览器驱动

我一般使用谷歌浏览器,因为谷歌浏览器的检查功能很好用。

1、查看本地Chrome浏览器版本

在浏览器的地址栏输入chrome://version,即可查看浏览器版本号

2、根据浏览器版本号下载对应的驱动程序

驱动程序下载地址:ChromeDriver 下载 - 最新版本 | ChromeDriver 驱动

 下载压缩包后解压到对应的文件夹

2.3、测试

运行下面的python脚本,观察到谷歌浏览器自动打开并且访问百度首页停留10s退出即表示selenium环境安装完成。

import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicechrome_options = Options()
# 设置浏览器窗口最大化
chrome_options.add_argument("--start-maximized")
# 设置驱动路径
chromedriver_path = '你的chromedriver.exe文件所在的路径'
service = Service(executable_path=chromedriver_path)driver = webdriver.Chrome(service=service, options=chrome_options)url = 'https://www.baidu.com/'driver.get(url)time.sleep(10)driver.quit()

3、自动更新谷歌浏览器驱动

selenium程序的正确运行需要谷歌浏览器和浏览器驱动版本号匹配,由于谷歌浏览器会自动更新导致需要经常手动更换浏览器驱动。

我在网上搜索尝试了很多关闭谷歌浏览器自动更新的办法,一直没有起作用。我们从另一个角度:编写程序自动更新浏览器驱动来解决需要手动更新的问题。

3.1、检查当前谷歌浏览器和浏览器驱动是否匹配

def test_chrome_driver():# 当前谷歌浏览器的驱动路径driver_path = '你的chromedriver.exe文件所在的路径'# 初始化chrome浏览器的选项chrome_options = Options()# 设置浏览器窗口最大化chrome_options.add_argument("--start-maximized")service = Service(executable_path=driver_path)driver = Nonetry:# 创建webdriver对象,传入配置好的options和servicedriver = webdriver.Chrome(service=service, options=chrome_options)url = "https://www.baidu.com/"driver.get(url)print("当前谷歌浏览器版本号和驱动版本号匹配")except Exception as e:# 使用正则表达式从异常信息中提取谷歌浏览器版本号pattern = r"Current browser version is (\d+\.\d+\.\d+\.\d+)"match = re.search(pattern, str(e))if match:browser_version = match.group(1)print(f"当前谷歌浏览器版本号和驱动版本号不匹配,谷歌浏览器版本号为:{browser_version}")return browser_versionfinally:if driver:driver.quit()

匹配运行结果:

不匹配运行结果:

3.2、自动下载对应的谷歌浏览器驱动程序

3.2.1、方法一

解析ChromeDriver 下载 - 最新版本 | ChromeDriver 驱动,找到对应版本的驱动程序下载地址

1、浏览器版本号和驱动版本号不一定完全相同,一般版本号前三部分相同即可。与浏览器版本号前三部分相同的驱动一般有多个,为了保险起见,我们通过一个列表存储可能匹配的驱动程序下载位置。

2、该网站提供适用于不同系统的驱动程序下载地址,我需要的是后缀为"chromedriver-win64.zip"的下载地址,你可以根据需求自行修改。因为可以下载的驱动版本号有多个,所以可以下载的地址也有多个,保存到一个列表中。

def find_chromedriver_url(browser_version):parts1 = browser_version.split('.')url = "https://www.chromedriverdownload.net/zh/"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}response = requests.get(url=url,headers=headers)# 检查请求是否成功if response.status_code == 200:tree = etree.HTML(response.text)# 存储满足浏览器版本号的驱动下标matching_indices = []chromedriver_download_url = []try:h2_div_list = tree.xpath('.//h2[@class="h3"]/text()')for index,h2_item in enumerate(h2_div_list):chromedriver_version = h2_itemmatch_version = re.search(r'\((\d+\.\d+\.\d+\.\d+)\)', chromedriver_version)if match_version:chromedriver_version = match_version.group(1)  # 获取匹配到的版本号parts2 = chromedriver_version.split('.')# 比较前三个部分if parts1[:3] == parts2[:3]:matching_indices.append(index)  # 如果满足条件,将索引添加到结果列表中for index in matching_indices:chromedriver_table = tree.xpath('/html/body//div[@class="row"]//div[@class="manual-article"]/div[@class="article-content"]')[0]target_table = chromedriver_table.xpath(f'./table[{index+1}]')[0]chromedriver_tr_list = target_table.xpath('./tbody/tr')for chromedriver_tr in chromedriver_tr_list:if "chromedriver-win64.zip" in chromedriver_tr.xpath('.//text()')[5]:chromedriver_download_url.append(chromedriver_tr.xpath('.//text()')[5])return chromedriver_download_urlexcept Exception as e:print(f"程序发生了异常:{e}")return Noneelse:print("请求chromedriver下载链接页失败")

3、解压到本地指定文件夹

def download_chromedriver(chromedriver_download_url,browser_version):if chromedriver_download_url:for url in chromedriver_download_url:# 指定保存压缩文件的本地路径zip_file_path = f"chromedriver{browser_version}-win64.zip"# 指定解压后的文件夹路径extract_folder_path = f"chromedriver{browser_version}"try:# 发起请求下载文件headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}response = requests.get(url=url,headers=headers)response.raise_for_status()  # 检查请求是否成功# 将下载的文件写入本地with open(zip_file_path, "wb") as file:file.write(response.content)# 创建解压文件夹(如果不存在)if not os.path.exists(extract_folder_path):os.makedirs(extract_folder_path)# 解压文件with zipfile.ZipFile(zip_file_path, "r") as zip_ref:zip_ref.extractall(extract_folder_path)# 获取解压文件夹的子文件夹subfolders = [f for f in os.listdir(extract_folder_path) ifos.path.isdir(os.path.join(extract_folder_path, f))]# 获取子文件夹的路径subfolder_path = os.path.join(extract_folder_path, subfolders[0])# 构造chromedriver.exe的绝对路径chromedriver_path = os.path.join(subfolder_path, "chromedriver.exe")# 检查chromedriver.exe文件是否存在if os.path.exists(chromedriver_path):print("chromedriver.exe的绝对路径为:", chromedriver_path)else:print("子文件夹下没有找到chromedriver.exe文件")print(f"文件已成功下载并解压到 {extract_folder_path} 文件夹中,路径为{chromedriver_path}。")break # 有一个压缩包下载成功即跳出循环except requests.exceptions.RequestException as e:print(f"下载文件时出错:{e}")print("请检查网页链接的合法性,适当重试。")except zipfile.BadZipFile:print("下载的文件不是有效的zip文件。")print("请检查网页链接的合法性,适当重试。")except Exception as e:print(f"发生错误:{e}")

之后将chromedriver_path写入到项目的配置文件中,提供给使用selenium的脚本读取。

3.2.2、方法二

使用webdriver_manager,它的核心功能是自动检测已安装的浏览器版本,并下载匹配的驱动程序。

1、安装方法

pip install webdriver-manager

2、基本使用

from webdriver_manager.chrome import ChromeDriverManager# 安装 ChromeDriver
driver_path = ChromeDriverManager().install()print(driver_path)

此时下载的浏览器驱动、下载位置均为默认,一般情况下直接在selenium创建driver对象时使用,但是会拖慢程序运行速度。

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver# 自动下载并配置ChromeDriver
driver = webdriver.Chrome(ChromeDriverManager().install())# 使用driver进行测试
driver.get("https://www.baidu.com/")
print(driver.title)
driver.quit()


http://www.hkcw.cn/article/pJmJxYpvFj.shtml

相关文章

高效视频倍速播放插件推荐

软件介绍 本文介绍一款名为Global Speed的视频速度控制插件,该插件在插件市场评分极高,被公认为目前最好用的视频倍速插件之一。 插件安装与基本功能 安装Global Speed插件后,用户只需点击插件图标即可选择播放倍数,最高支持16…

60、Polly瞬态故障处理

Polly 是一个.NET 弹性和瞬态故障处理库,在分布式系统和微服务架构中,可有效处理网络不稳定、服务依赖故障或资源限制等引发的瞬态故障,保障系统的稳定性和可靠性,以下是其常见策略及应用说明: 核心策略 1.重试策略 …

vulnyx loweb writeup

信息收集 arp-scan nmap 这里也可以接其它选项进行深入的扫描,因为我是打完后再写的wp,第一次做的时候我是扫了的,但是我没有得到什么有用的信息,所以写wp的时候我就没放出来了。这里直接去web 获取userFlag 一个默认的apache2 …

学员匿名举报教练骚扰后怀疑店长泄密:这两个教练在找她!

学员匿名举报教练骚扰后怀疑店长泄密。小孙反映,她感觉被健身房的两位教练骚扰了,她给记者看了聊天记录,对方曾说“从你身上让我能感受到你无比强大的力量”,“果然是顶级白月光”。最近让她倍感困扰的是,店长把她匿名举报的事告诉了涉事教练,导致这两个教练在找她,她要…

距2025高考还有4天 家长准备了什么礼物?

距2025高考还有4天 家长准备了什么礼物?!今天已经是6月2号,距离高考只剩下4天。每年高考结束后,许多高三学生都迫不及待地想要收到家长为他们准备的礼物,比如手机或电脑。高中三年对学生来说确实很辛苦,无论是在身体上还是精神上都付出了很多。高考结束后,学生们确实需要…

深圳天气 六一“不下雨通知”逗乐众人

深圳天气 六一“不下雨通知”逗乐众人!上海入汛首日遭遇了持续整天的大雨。截至18时,累计降水量显示普降大雨,市区徐家汇站在下午三点前几乎未曾停歇。雨雾和低云导致垂直能见度极低,全市最高气温仅在18-20℃之间,许多市民穿起了长袖甚至羊毛衫,这种天气让全国网友感到惊…

男子迷路拒绝救援后又求助 自信误判险酿祸

5月31日端午节,在北京房山一处野山中,一名男子登山迷路。他给警方打电话询问下山道路,警方随后联系了房山蓝天救援队。晚上8点多,当救援队员询问男子详细信息时,男子表示不想麻烦救援队,称自己能找到路下山。尽管如此,为了安全起见,房山蓝天救援队还是启动了救援程序。…

印度一游客摸老虎自拍遭袭击 触摸禁忌区引攻击

泰国普吉岛知名观光景点“老虎王国”近日发生了一起惊险事件。一名印度游客在与老虎合影时,因触摸老虎遭到攻击,现场画面在社交媒体上引发了广泛关注。该景点以“一生仅有一次的与虎互动体验”为卖点,吸引了众多游客。事发时,这名游客手持链条与老虎并排站立,驯兽师正用棍…

李亚鹏宣布将幼儿园无偿移交 为社会做贡献

6月1日,知名演员李亚鹏现身北京培德书院幼儿园六一活动。在活动现场,他宣布将把培德书院幼儿园无偿移交给一位资深教育家管理。他表示,人来到这个世界上总要为社会做点什么,这与个人财富无关,而是个人的价值观。培德书院幼儿园由李亚鹏于2011年前后创办,定位高端民办教育…

男子为省30元钱不幸离世 高原缺氧悲剧引发关注

46岁的河南卡车司机常志荣近日在青藏线因高原缺氧离世。他的骨灰及车辆由多名爱心司机跨越2400多公里,从五道梁地区送回老家安阳林州。其中一位司机表示:“不让家属承担一切费用,中国人就该互相帮助”。青海五道梁地区海拔4665米,含氧量不足海平面50%。5月27日,常志荣在此…

Spring框架学习day6--事务管理

Spring事务管理 Spring事务管理是在AOP的基础上,当我们的方法完全执行成功后,再提交事务,如果方法中有异常,就不提交事务 Spring中的事务管理有两种方式: ​ 1.编程式事务 ​ 需要我们在业务代码中手动提交 ​ 2.声明式…

【C盘瘦身】Docker安装目录占用C盘过大,一键移动给C盘瘦身

文章目录 前言一、Docker移动3步骤1. 进入docker的设置页面2. 点击“Browse”,选择D盘新建的目标目录3. 点击“Apply & restart”,选择Yes4. 移动完毕 二、结果检查 前言 最近安装了Dify,由于是Docker安装,不想安装完后&…

百度golang研发一面面经

输入一个网址,到显示界面,中间的过程是怎样的 IP 报文段的结构是什么 Innodb 的底层结构 知道几种设计模式 工厂模式 简单工厂模式:根据传入类型参数判断创建哪种类型对象工厂方法模式:由子类决定实例化哪个类抽象工厂模式&#…

CTF:网络安全的实战演练场

文章目录 每日一句正能量前言一、CTF简介(一)什么是CTF?(二)CTF的历史 二、CTF比赛形式(一)线上赛(Online CTF)(二)线下赛(Offline CT…

Javaweb学习——day1(JavaWeb 介绍与开发环境搭建)

文章目录 1. 什么是 JavaWeb?2. HTTP 协议与请求响应流程2.1 HTTP 概述:2.2 请求响应流程:2.3 常见 HTTP 方法: 3. 开发环境搭建3.1 安装 Tomcat3.1.1 我的是win11 64位版,选择下载如图:3.1.2 解压 Tomcat3…

【沉浸式求职学习day52】【初识Mybaits】

沉浸式求职学习 什么是Mybatis1.持久化2.持久层3.为什么需要Mybatis?4.第一个Mybatis程序 CRUD1、namespace2、select3、Insert4、update5、Delete6、万能Map7、模糊查询 配置解析1、核心配置文件2、环境配置(environments)3、属性&#xff0…

mapStruct实体类属性映射工具实现

mapStruct实体类属性映射实现 1. 概述对比 BeanUtils.copyProperties场景对比 快速入门lombok mapStructmaven 依赖代码实现1. 定义两个要转换的实体类2. 定义转化接口测试 mapStruct Spring1. 注册成bean需要使用bean 转化规则1. 成员变量名不同时2. 子对象映射3. 数据类型映…

PostgreSQL 安全纵深防御:从权限到加密

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

马斯克说不想为美政府所作一起担责 拒绝成为替罪羊

美国企业家马斯克在接受采访时表达了他对美国政府的一些看法。他表示不愿为政府所做的一切承担责任,并提到他之前领导的“政府效率部”成为了各种问题的替罪羊,这让他感到不公平。马斯克还谈及了与美国总统特朗普的关系,承认两人在一些问题上存在分歧。他强调自己不想公开反…

花105万买基金亏30万 状告银行 二审驳回全部诉求

一位年过八旬的投资者在2021年投入105万元购买了一只公募基金产品,两年多时间亏损约30万元。该投资者将相关代销银行告上法庭,要求其承担赔偿责任。案件经过两次审理,一审法院判决银行承担70%损失赔偿责任并支付损失利息。二审法院则认为,投资者自主决定购买理财产品,且产…