网络爬虫学习:应用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的版本号

  1. 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"SoftwareMicrosoftEdgeBLBeacon")
        version, _ = winreg.QueryValueEx(key, "version")
        winreg.CloseKey(key)
        return version
    except Exception:
        return None


def 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 vrsion
            else:
                return None
        else:
            print("获取版本时出错:", ver.stderr.strip())
            return None
    except Exception as e:
        print("出现错误:", str(e))
        return None


def 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 64
    else:
        print("你的电脑为 32-bit 操作系统")
        return 32


def vrsion_comparison(edge_v: str, driver_v: str):
    """ 比较浏览器和驱动的版本号 """
    if edge_v == driver_v:
        return True
    else:
        return False


def 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 = False
    if driver_version:
        if edge_version:
            # 比较浏览器和驱动器的版本号
            result = vrsion_comparison(edge_version, driver_version)
            if result:
                print('浏览器和驱动的版本一致')
                check_ok = True
            else:
                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 = True
                else:
                    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 = True
        else:
            print('您未下载浏览器对应版本的驱动,可能会导致在软件中打开Edge浏览器出问题')

    # 4. 打开浏览器
    if check_ok:
        m_url = 'https://www.baidu.com/'
        open_edge(m_url)
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习