如何使用Selenium Python获取无直链按钮对应的最新下载文件链接
Selenium Python获取无直接暴露链接的下载地址实现方案
场景说明
你当前遇到的情况为页面下载按钮未直接暴露可直接访问的下载链接,对应按钮的DOM结构如下:
<button id="download_mi_button" class="btn btn-success btn-pill btn-lg w-50"> Download File</button>
该按钮对应文本为「下载小米服务器文件」,点击后才会触发实际下载流程,你需要在触发下载后获取到下载链接,同时无需实际下载文件到本地。
实现思路
- 借助Chrome DevTools协议(CDP)监听浏览器下载事件,无需等待文件下载完成就能拿到下载链接
- 拿到链接后立即调用CDP接口取消下载任务,避免占用本地存储和带宽
- 无需解析页面复杂的加密逻辑,直接通过浏览器行为获取真实下载地址
核心实现代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 配置Chrome浏览器参数 chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("prefs", { # 关闭下载确认弹窗 "download.prompt_for_download": False, # 下载路径指向空设备,避免临时文件残留 "download.default_directory": "/dev/null", # Windows系统替换为 "NUL" "safebrowsing.enabled": False }) driver = webdriver.Chrome(options=chrome_options) # 开启CDP下载域权限 driver.execute_cdp_cmd("Downloads.enable", {}) try: driver.get("https://mifirm.net/download/5612") # 显式等待下载按钮加载完成 download_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "download_mi_button")) ) download_btn.click() # 监听下载开始事件,获取下载链接 download_url = None for _ in range(10): # 拉取下载列表 download_list = driver.execute_cdp_cmd("Downloads.getDownloads", {})["downloads"] if download_list: # 按开始时间倒序取最新的下载任务 latest_download = sorted(download_list, key=lambda x: x["startTime"], reverse=True)[0] download_url = latest_download["url"] # 取消下载任务 driver.execute_cdp_cmd("Downloads.cancelDownload", {"downloadId": latest_download["downloadId"]}) break time.sleep(0.5) if download_url: print(f"获取到的真实下载链接:{download_url}") else: print("未获取到下载链接,请检查页面加载情况") finally: driver.quit()
注意事项
- 部分站点的下载链接存在有效期、请求头校验限制,拿到链接后要尽快使用,请求时需携带和浏览器一致的UA、Referer等请求头
- 可进一步通过CDP的
downloadWillBegin事件监听,无需轮询下载列表,执行效率更高 - 该方案兼容Chrome、Edge等基于Chromium内核的浏览器,Firefox需要调整对应的CDP调用逻辑
内容的提问来源于stack exchange,提问作者Sharyar Vohra
相关产品推荐
相关产品推荐

