透过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 winregdef 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 valueexcept FileNotFoundError:print("未找到Edge浏览器安装信息。")return Nonedef 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_pathelse:print("未找到edgedriver_win64.zip的下载链接。")else:print("获取版本页面失败,状态码:", response.status_code)return Nonedef 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
函数,将下载的文件解压到指定的目标文件夹中。