Python 网页控制自动化 getEdgeDriver

透过python 使用 edge 执行自动化时,原来的代码 出现报错了

执行报错啦:message info 如下显示 HTTPSConnectionPool(host='msedgedriver.azureedge.net', port=443): Max retries exceeded with url: /130.0.2849/edgedriver_win64.zip (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000020BBB749250>: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。'))

因为 这个网站已经不再为何 对照关系,新的edge 版本就会报错

代码修正如下

根据 edge版本号 直接引用 Microsoft 的 dirver 网页

这段代码首先通过winreg模块获取 Edge 浏览器的版本号,然后根据版本号拼凑出下载edgedriver_win64.zip的链接并下载该文件,最后将下载的文件解压到指定的文件夹(这里是当前目录下的EdgeDriver文件夹)。请注意,代码中的路径假设和正则表达式匹配是基于给定的网页结构,如果网页结构发生变化,可能需要相应调整代码。

复制代码
import requests
import re
import zipfile
import os
import winreg


def get_edge_version():
    """
    获取Edge浏览器版本号
    """
    try:
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Edge\BLBeacon")
        value, _ = winreg.QueryValueEx(key, "version")
        winreg.CloseKey(key)
        return value
    except FileNotFoundError:
        print("未找到Edge浏览器安装信息。")
        return None


def download_edge_driver(version):
    """
    根据版本号下载edgedriver_win64.zip
    """
    base_url = "https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix={}/".format(version)
    response = requests.get(base_url)
    if response.status_code == 200:
        html_content = response.text
        # 使用正则表达式匹配edgedriver_win64.zip的下载链接
        match = re.search(r'href="([^"]*edgedriver_win64.zip)"', html_content)
        if match:
            download_url = "https://msedgewebdriverstorage.z22.web.core.windows.net/" + match.group(1)
            print("下载链接:", download_url)
            download_path = "edgedriver_win64.zip"
            with requests.get(download_url, stream=True) as r:
                r.raise_for_status()
                with open(download_path, 'wb') as f:
                    for chunk in r.iter_content(chunk_size=8192):
                        f.write(chunk)
            print("下载完成。")
            return download_path
        else:
            print("未找到edgedriver_win64.zip的下载链接。")
    else:
        print("获取版本页面失败,状态码:", response.status_code)
    return None


def unzip_file(zip_path, extract_path):
    """
    解压下载的压缩文件
    """
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        zip_ref.extractall(extract_path)
    print("解压完成。")


if __name__ == "__main__":
    edge_version = get_edge_version()
    if edge_version:
        downloaded_file = download_edge_driver(edge_version)
        if downloaded_file:
            # 假设解压到当前目录下的EdgeDriver文件夹中
            extract_folder = os.path.join(os.getcwd(), "EdgeDriver")
            os.makedirs(extract_folder, exist_ok=True)
            unzip_file(downloaded_file, extract_folder)

以下是对上述代码的逐行详细说明:

复制代码
import requests
import re
import zipfile
import os
import winreg
  • 导入了必要的 Python 库。requests用于发送 HTTP 请求来获取网页内容和下载文件;re用于使用正则表达式进行字符串匹配;zipfile用于处理 ZIP 压缩文件;os用于操作系统相关的操作,如创建文件夹;winreg用于读取 Windows 注册表信息,这里用于获取 Edge 浏览器的版本号。

    def get_edge_version():
    """
    获取Edge浏览器版本号
    """
    try:
    key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Edge\BLBeacon")

  • 定义了一个函数get_edge_version,用于获取 Edge 浏览器的版本号。首先尝试打开 Windows 注册表中存储 Edge 浏览器相关信息的键。这里的winreg.HKEY_CURRENT_USER表示当前用户的注册表根键,r"Software\Microsoft\Edge\BLBeacon"是 Edge 浏览器版本信息在注册表中的路径。

    value, _ = winreg.QueryValueEx(key, "version")

  • 使用winreg.QueryValueEx函数从打开的注册表键中查询名为version的值,这个值就是 Edge 浏览器的版本号。查询结果返回一个包含值和类型的元组,这里使用_忽略类型信息,只获取版本号的值。

    winreg.CloseKey(key)
    return value

  • 关闭打开的注册表键,以释放系统资源。然后返回获取到的 Edge 浏览器版本号。

    except FileNotFoundError:
    print("未找到Edge浏览器安装信息。")
    return None

  • 如果在尝试打开注册表键时发生FileNotFoundError异常,说明没有找到 Edge 浏览器的安装信息,打印相应提示信息并返回None

    def download_edge_driver(version):
    """
    根据版本号下载edgedriver_win64.zip
    """
    base_url = "https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix={}/".format(version)

  • 定义了函数download_edge_driver,用于根据给定的版本号下载edgedriver_win64.zip文件。首先根据版本号拼凑出下载页面的基础 URL,用于后续获取下载链接。

    response = requests.get(base_url)

  • 使用requests.get函数发送 HTTP GET 请求到下载页面的 URL,获取页面内容。

    if response.status_code == 200:
    html_content = response.text

  • 检查响应的状态码是否为200,表示请求成功。如果成功,获取响应的文本内容(即下载页面的 HTML 代码)。

    使用正则表达式匹配edgedriver_win64.zip的下载链接

    match = re.search(r'href="([^"]*edgedriver_win64.zip)"', html_content)

  • 使用正则表达式在 HTML 内容中搜索edgedriver_win64.zip的下载链接。正则表达式r'href="([^"]*edgedriver_win64.zip)"的含义是查找以href="开头,接着是任意字符([^"]*)直到edgedriver_win64.zip,最后以"结尾的字符串,并捕获其中的下载链接部分(括号内的内容)。

    if match:
    download_url = "https://msedgewebdriverstorage.z22.web.core.windows.net/" + match.group(1)

  • 如果找到了匹配的下载链接,将基础 URL 和匹配到的相对链接部分组合成完整的下载 URL。

    print("下载链接:", download_url)
    download_path = "edgedriver_win64.zip"

  • 打印出下载链接,并指定下载文件的本地路径为edgedriver_win64.zip,即在当前工作目录下保存下载的文件。

    with requests.get(download_url, stream=True) as r:
    r.raise_for_status()

  • 使用requests.get再次发送请求,这次是下载文件,并且设置stream=True以便分块读取响应内容。同时检查下载请求的状态码,如果不是200,则抛出异常。

    with open(download_path, 'wb') as f:
    for chunk in r.iter_content(chunk_size=8192):
    f.write(chunk)

  • 打开本地文件(以二进制写入模式wb),然后循环读取下载请求的响应内容(每次读取8192字节),并将其写入本地文件,实现文件的下载。

    print("下载完成。")
    return download_path

  • 打印下载完成的提示信息,并返回下载文件的本地路径。

    else:
    print("未找到edgedriver_win64.zip的下载链接。")

  • 如果在 HTML 内容中没有找到匹配的下载链接,打印相应提示信息。

    else:
    print("获取版本页面失败,状态码:", response.status_code)
    return None

  • 如果最初获取下载页面的请求失败(状态码不是200),打印状态码并返回None

    def unzip_file(zip_path, extract_path):
    """
    解压下载的压缩文件
    """
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:

  • 定义函数unzip_file用于解压下载的 ZIP 压缩文件。首先使用zipfile.ZipFile打开指定路径的 ZIP 文件,以只读模式r

    zip_ref.extractall(extract_path)

  • 使用extractall方法将 ZIP 文件中的所有内容解压到指定的目标文件夹。

    print("解压完成。")

  • 打印解压完成的提示信息。

    if name == "main":

  • 这是 Python 脚本的主入口点,只有当脚本直接运行时(而不是被导入为模块时),以下代码才会执行。

    edge_version = get_edge_version()

  • 调用get_edge_version函数获取 Edge 浏览器的版本号。

    if edge_version:

  • 检查获取到的版本号是否不为None,如果不为None,表示成功获取到版本号,继续执行下载和解压操作。

    downloaded_file = download_edge_driver(edge_version)

  • 根据获取到的版本号调用download_edge_driver函数下载edgedriver_win64.zip文件,并获取下载文件的本地路径。

    if downloaded_file:

  • 检查下载文件的路径是否不为None,如果不为None,表示下载成功,继续执行解压操作。

    假设解压到当前目录下的EdgeDriver文件夹中

    extract_folder = os.path.join(os.getcwd(), "EdgeDriver")

  • 使用os.path.join函数构建解压目标文件夹的路径,这里假设解压到当前工作目录下的EdgeDriver文件夹中。os.getcwd获取当前工作目录。

    os.makedirs(extract_folder, exist_ok=True)

  • 使用os.makedirs创建解压目标文件夹,如果文件夹已经存在(exist_ok=True表示如果文件夹存在则不抛出异常)。

    unzip_file(downloaded_file, extract_folder)

  • 调用unzip_file函数,将下载的文件解压到指定的目标文件夹中。

相关推荐
wadesir7 分钟前
当前位置:首页 > 服务器技术 > 正文Linux网络HSRP协议(实现路由器热备份与高可用性的实用指南)
linux·服务器·网络
稻谷君W9 分钟前
Ubuntu 远程访问 Win11 WSL2 并固定访问教程
linux·运维·ubuntu
泡沫·9 分钟前
4.iSCSI 服务器
运维·服务器·数据库
胡八一13 分钟前
解决PHP未检测到您服务器环境的sqlite3数据库扩展报错
服务器·数据库·php
不解不惑24 分钟前
OpenAI whisper 语音识别服务器搭建
服务器·whisper·语音识别
gaize121332 分钟前
适合业务规模较大的场景的服务器测评
服务器
悠悠121381 小时前
告别Zabbix?我用Netdata只花10分钟就搞定了50台服务器的秒级监控(保姆级实战)
运维·服务器·zabbix
天庭鸡腿哥1 小时前
大小只有4K的软件,可让系统瞬间丝滑!
运维·服务器·windows·microsoft·everything
虚伪的空想家1 小时前
华为昇腾Atlas 800 A2物理服务器开启VT-d模式
运维·服务器·ubuntu·kvm·vt-d·直通
学渣676562 小时前
服务器端口映射
运维·服务器