网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言

我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。

前几天我已经发了一篇日志(网络爬虫学习:应用selenium从搜*狐搜索爬取新闻结果的数据)记录了应用中使用的爬虫技术。

这篇日志记录另外一个问题的解决。

二、问题描述

我在完成软件的初步开发后,曾将软件打包成exe文件后,拷贝到两位同事的电脑上进行检测,软件可以正常打开,但是在输入关键字,点击搜索按钮后,Edge浏览器却一直没有弹出。之后通过研究和对比,找出了原因。

我安装的selenium 库版本号是4.27.1,这个版本的selenium在执行 webdriver.Edge() 方法时,如果没有指定“msedgedriver.exe”,会自动下载msedgedriver.exe文件并保存到C盘  > 用户 > 用户名(如Administer、Lenovo等) > .cache > selenium > msedgedriver > win64 > 驱动版本号 文件夹下。且下载的msedgedriver文件的版本号能够兼容用户电脑上的Edge浏览器。

(selenium自动下载的msedgedriver.exe)

回忆我学习selenium 库的时候,好像刚开始也出现过隔了好一会才打开Edge浏览器的情况。并且在研究如何解决问题的过程中,我曾打开Edge浏览器检查版本号,发现浏览器在更新,并且在浏览器更新后我在进入pycharm调试我开发的软件时,同样出现了打开Edge浏览器等待时间长的情况,基本可以判断造成长时间不打开Edge浏览器的原因是软件正在下载msedgedriver.exe,由于我公司的内部网络有限速,导致下载时间长。

找到原因后,我一开始尝试的方法是:下载好与使用者电脑Edge浏览器版本号一致的msedgedriver.exe,并copy到使用者电脑C盘的 “.cache” 目录中对应的子文件夹下。再次运行我开发的爬虫软件,这次可以较快速的打开Edge浏览器了。

不过这种手动添加的方法,很不方便,不太可取。首先是,我的同事大多不精通电脑,这个操作对他们来说有难度。而如果都由我一个个的设置,则比较麻烦。其次,我发现我开发的电脑与软件测试的2台电脑中的Edge浏览器版本号都不一样,且我的电脑Edge用得比较多,版本都升级了好几次了, “.cache” 目录内已经下载了好几个版本的msedgedriver.exe了。查询 Microsoft Edge Driver官网 可以看到msedgedriver的版本号非常多,在无法确定使用者电脑中Edge浏览器的版本号时,难道要把这些版本的驱动都下载?那也太麻烦了,且占用的存储空间也很大。

否定了手动添加msedgedriver.exe的方法后,就需要寻找更有效的方法让使用者可以方便的下载和配置msedgedriver.exe了。

三、借助DeepSeek获取解决办法

正好这几天DeepSeek上了热搜,看到相关的文章,让我对DeepSeek产生了兴趣,就尝试了用DeepSeek来解决问题,结果从DeepSeek给的答案中找到了解决问题的方法。

我一共向DeepSeek提了2个问题。

第1问:“使用selenium库,如何获取edge浏览器的版本号”。

这一问的目的是希望通过自己开发的应用获取到Edge浏览器的版本号,为下一步下载对应版本的msedgedriver.exe做准备。DeepSeek思考了64秒,给了我一份详细的答案。在这份答案中给出了“通过driver.capabilities获取浏览器的详细信息”的方法。

这个方法也确实可以获取到Edge浏览器的版本号,不过此法仍需通过webdriver.Edge() 方法打开Edge浏览器,才能获取到浏览器的版本信息(同时还能获取到msedgedriver.exe的版本号信息),但我之前遇到的问题是在使用者的电脑上并没有下载和配置好msedgedriver.exe,导致了打开Edge浏览器需要很长的时间,而我又暂时无法在软件中给出足够有效的提示,因此,这个办法不适合我遇到的问题。

(第1问)

(第1问的答案)

接着我又提出了第2问:“使用python进行爬虫软件开发,如果没有提前下载msedgedriver驱动,在软件中执行webdriver.Edge()方法,无法打开Edge浏览器,如何处理。”

这一问的描述更详尽一些,且是接着上一问提的,DeepSeek这次比较给力,只思考了34秒,最终给了我三个解决方法,从中,我选择了第二个方法。另外两个方法我并未尝试。

(第1问)

(第2问给的第一个方法)

(第2问给的第二个方法)

(第2问给的第三个方法)

四、功能实现

我基于DeepSeek给的方案完善了自己的爬虫软件,在应用中,添加了检查浏览器版本号和msedgedriver.exe的版本号的功能,一旦发现版本号不一致,或信息缺失,就会提示用户下载msedgedriver.exe。软件会将msedgedriver.exe下载到应用工作目录的drivers文件夹下。另外,我在所有调用webdriver.Edge() 方法的代码块,都添加了指定msedgedriver.exe文件路径的语句,使webdriver.Edge() 方法可以直接到指定目录下找到msedgedriver.exe,这样就可以加快Edge浏览器的启动了。解决问题的代码分以下几个部分(具体代码见“五、代码展示”):

1. get_edge_version()方法:

从注册表中获取Edge浏览器的版本号

2. get_edgedriver_version()方法:

获取msedgedriver的版本号

3. download_edgedriver()方法:

下载Edge浏览器对应版本的msedgedriver

4. check_system_bit()方法:

检查操作系统是64位还是32位,根据此方法结果决定下载win64还是win32的msedgedriver

5. vrsion_comparison()方法:

比较浏览器和驱动的版本号

6. open_edge()方法:

用于展示执行webdriver.Edge方法时检查和设置msedgedriver

五、代码展示

最后放上功能实现的示例代码供参考,可以直接运行。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
import time
import re
import winreg  # Windows系统 用于从注册表中获取信息
import requests
import zipfile
import os
import subprocess  # 用于获取驱动器的版本号def get_edge_version():""" 从注册表中获取Edge浏览器的版本号 """try:key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Edge\BLBeacon")version, _ = winreg.QueryValueEx(key, "version")winreg.CloseKey(key)return versionexcept Exception:return Nonedef get_edgedriver_version():""" 获取Edge驱动器版本号 """# 指定msedgedriver的路径msedgedriver_path = os.path.abspath("drivers/msedgedriver.exe")try:# 尝试获取版本信息ver = subprocess.run([msedgedriver_path, '--version'], capture_output=True, text=True)if ver.returncode == 0:# 形如:Microsoft Edge WebDriver 120.0.2210.91 (f469d579f138ffc82b54354de66117c1cb1bb923)match = re.search(r'(\d+\.\d+\.\d+\.\d+)', ver.stdout.strip())if match:vrsion = match.group(1)return vrsionelse:return Noneelse:print("获取版本时出错:", ver.stderr.strip())return Noneexcept Exception as e:print("出现错误:", str(e))return Nonedef download_edgedriver(version: str):""" 下载对应版本的msedgedriver """# 检查操作系统位数architecture = check_system_bit()if architecture == 64:# 下载win64位的压缩包url = f'https://msedgedriver.azureedge.net/{version}/edgedriver_win64.zip'else:# 下载win32位的压缩包url = f'https://msedgedriver.azureedge.net/{version}/edgedriver_win32.zip'print('驱动器压缩包下载地址:')print(url)response = requests.get(url)print('开始获取驱动器压缩包')# 保存并解压驱动zip_path = f"edgedriver_win{architecture}.zip"with open(zip_path, 'wb') as f:f.write(response.content)print(f'驱动器压缩包已下载到当前工作目录内,文件名{zip_path}')with zipfile.ZipFile(zip_path, 'r') as zip_ref:zip_ref.extractall("drivers/")os.remove(zip_path)print('文件已解压,压缩包已删除')return os.path.abspath("drivers/msedgedriver.exe")def check_system_bit():""" 检查操作系统位数 """if 'PROGRAMFILES(X86)' in os.environ:print("你的电脑为 64-bit 操作系统")return 64else:print("你的电脑为 32-bit 操作系统")return 32def vrsion_comparison(edge_v: str, driver_v: str):""" 比较浏览器和驱动的版本号 """if edge_v == driver_v:return Trueelse:return Falsedef open_edge(url):""" 用于展示执行webdriver.Edge方法时检查和设置msedgedriver """# 获取浏览器版本edge_version = get_edge_version()# 获取驱动器版本,同时也是检查驱动器是否存在driver_version = get_edgedriver_version()if edge_version and driver_version:math = vrsion_comparison(edge_version, driver_version)if not math:print('浏览器和驱动器版本号不一致,但我们仍尝试打开浏览器')try:# 指定msedgedriver.exe的完整路径path_to_executable = os.path.abspath("drivers/msedgedriver.exe")service = Service(executable_path=path_to_executable)driver = webdriver.Edge(service=service)driver.get(url)# 等待页面加载完成time.sleep(30)except Exception as e:print(f'打开驱动器出错:{e}')else:print('浏览器或驱动器版本信息缺失,可能导致异常,故暂不能执行爬虫任务。')if __name__ == '__main__':# 1.获取edge浏览器版本号edge_version = get_edge_version()print("Edge浏览器版本号:", edge_version)# 2.获取驱动器版本driver_version = get_edgedriver_version()print("msedgedriver版本号:", driver_version)# 3.进行版本信息检查check_ok = Falseif driver_version:if edge_version:# 比较浏览器和驱动器的版本号result = vrsion_comparison(edge_version, driver_version)if result:print('浏览器和驱动的版本一致')check_ok = Trueelse:print(f'浏览器版本{edge_version} 和 驱动器版本{driver_version} 不一致')select = input('是否下载浏览器对应版本的驱动?(Y/N)?').strip()select = select.lower()if select == 'y':# 4.下载驱动器print('开始下载浏览器驱动,请稍候')driver_path = download_edgedriver(edge_version)print(f'驱动已下载,保存在 {driver_path}')check_ok = Trueelse:print('您未下载浏览器对应版本的驱动,可能会导致在软件中打开Edge浏览器出问题')else:print('未获取到Edge浏览器的版本信息')else:print('未获取到驱动版本信息')select = input('是否下载浏览器对应版本的驱动?(Y/N)?').strip()select = select.lower()if select == 'y':# 4.下载驱动器print('开始下载浏览器驱动,请稍候')driver_path = download_edgedriver(edge_version)print(f'驱动已下载,保存在 {driver_path}')check_ok = Trueelse:print('您未下载浏览器对应版本的驱动,可能会导致在软件中打开Edge浏览器出问题')# 4. 打开浏览器if check_ok:m_url = 'https://www.baidu.com/'open_edge(m_url)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于使用微服务的注意要点总结

一、防止过度设计 微服务的拆分一定要结合团队人员规模来考虑,笔者就曾遇到过一个公司的项目,是从外部采购回来的,微服务划分为十几个应用,我们在此项目基础上进行自行维护和扩展。由于公司业务规模不大,而且二次开发的…

CSS Fonts(字体)

CSS Fonts(字体) 在网页设计中,字体是传达信息情感和风格的关键元素。CSS(层叠样式表)提供了丰富的字体样式和属性,使得网页设计者能够根据需求选择合适的字体,从而提升用户体验。本文将详细介绍CSS字体相关的知识,包括字体的选择、加载、样式设置等。 字体的选择 选…

week08_文本匹配任务

1、文本匹配任务概述 狭义: 给定一组文本,判断其是否语义相似 今天天气不错 match 今儿个天不错呀 √ 今天天气不错 match 你的代码有bug 以分值形式给出相似度 今天天气不错 match 今儿个天不错呀 0.9 今天天气不错 match…

Deepseek技术浅析(一)

DeepSeek 是北京深度求索人工智能基础技术研究有限公司推出的人工智能技术品牌,专注于大语言模型(LLM)的研发与应用。其技术涵盖了从模型架构、训练方法到应用部署的多个层面,展现出强大的创新能力和应用潜力。以下将详细介绍 Dee…

火出圈的DeepSeeK R1详解

各位宝子们,新年好! 模型特性 DeepSeek-R1是一款创新的AI推理模型,具有多项独特特性: 高性能推理能力 :在数学、代码和自然语言推理等任务上表现出色,性能对标OpenAI o1正式版。 强化学习驱动的训练 :采用大规模强化学习技术,仅需极少量标注数据,显著提升推理能力。…

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)1. 副本的基本概念2. 副本同步和一致性2.1 AR(Assigned Replicas)2.2 ISR(In-Sync Replicas)2.3 OSR(Out-of-Sync Replicas&#xf…

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式,详见下文: 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次,点…

CAPL与外部接口

CAPL与外部接口 目录 CAPL与外部接口1. 引言2. CAPL与C/C++交互2.1 CAPL与C/C++交互简介2.2 CAPL与C/C++交互实现3. CAPL与Python交互3.1 CAPL与Python交互简介3.2 CAPL与Python交互实现4. CAPL与MATLAB交互4.1 CAPL与MATLAB交互简介4.2 CAPL与MATLAB交互实现5. 案例说明5.1 案…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图,本文采用了3组实验对比的效果展示图,代码已调试好,只需替换数据即可生成相关柱状图,为科研加分。通过获得Nature配色的柱状图,让你的论文看起来档次更高&#xff0…

随机森林例子

完整代码: # 导入必要的库 from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np# 加载鸢尾花数…

【QT】 控件 -- 显示类

🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…

SpringBoot中@Valid与@Validated使用场景详解

SpringBoot中Valid与Validated使用场景详解 在实际开发中,参数校验是保证接口安全性和数据完整性的重要手段。Spring Boot提供了Valid和Validated两个核心注解来实现参数校验,但许多开发者对它们的区别和使用场景存在疑惑。本文将深入解析二者的差异&am…

基于PyQt设计的智能停车管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】设计意义【4】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】VSCODE【2】python【3】ptqt【4】HyperLPR31.5 参考文献二、安装Python环境1.1 环境介绍**1.2 Python版本介…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

数仓ETL测试

提取,转换和加载有助于组织使数据在不同的数据系统中可访问,有意义且可用。ETL工具是用于提取,转换和加载数据的软件。在当今数据驱动的世界中,无论大小如何,都会从各种组织,机器和小工具中生成大量数据。 …

策略模式 - 策略模式的使用

引言 在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端…

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要:随着互联网技术的飞速发展,网络直播作为一种新兴的、极具影响力的媒体形式,正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示,网络直播用户规模已达到3.25亿,占网民总数的45.8…

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段。 一、什么是pr…

设计模式:春招面试的关键知识储备

在之前的文章中,我们深入探讨了分布式事务,了解了它在分布式系统中的重要性以及常见的解决方案。而在软件开发领域,设计模式是提升代码质量、可维护性和可扩展性的关键要素。设计模式是对软件开发中反复出现的问题的通用解决方案,…

上位机知识篇---Linux的shell脚本搜索、查找、管道

文章目录 前言第一部分:什么是shell?1. 基本结构脚本声明注释命令和表达式例子 2.变量控制结构条件判断 3.函数输入输出重定向 4.执行命令5.实际应用 第二部分:Linux的搜索、查找、管道命令1.搜索命令2.查找命令3.管道操作 总结 前言 以上就…