设计学校网站模板免费下载,购物网站建设合同,百度网站建设解决方案,wordpress远程命令一、前言
我从24年11月份开始学习网络爬虫应用开发#xff0c;经过2个来月的努力#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。
前几天我已经发了一篇日志#xff08;网络爬虫学习#xff1a;应用selenium从搜…一、前言
我从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, rSoftware\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_outputTrue, textTrue)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 fhttps://msedgedriver.azureedge.net/{version}/edgedriver_win64.zipelse:# 下载win32位的压缩包url fhttps://msedgedriver.azureedge.net/{version}/edgedriver_win32.zipprint(驱动器压缩包下载地址)print(url)response requests.get(url)print(开始获取驱动器压缩包)# 保存并解压驱动zip_path fedgedriver_win{architecture}.zipwith 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_pathpath_to_executable)driver webdriver.Edge(serviceservice)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)