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函数,将下载的文件解压到指定的目标文件夹中。

相关推荐
2301_819287122 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la2 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息2 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20152 小时前
STUN服务器实现NAT穿透
运维·服务器
月如琉璃2 小时前
1.gitlab 服务器搭建流程
服务器·gitlab
Ren_xixi2 小时前
redis和mysql的区别
数据库·redis·mysql
Kika写代码2 小时前
【微信小程序】页面跳转基础 | 我的咖啡店-综合实训
服务器·微信小程序·小程序
PieroPc2 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
州周3 小时前
Ftp目录整个下载
linux·服务器·数据库
冷曦_sole3 小时前
linux-19 根文件系统(一)
linux·运维·服务器