如何通过Selenium实现带重定向链接的文件下载?(附具体测试场景与配置问题)
解决Selenium中带重定向的文件下载问题
我来帮你搞定这个点击后先跳转再下载的棘手问题!这种场景确实容易让常规的下载配置失效,咱们分几个方案来解决,你可以根据实际情况选最适合的:
方案1:模拟完整用户操作(处理页面跳转+触发下载)
很多时候,点击目标链接会跳转到文件详情页,需要在新页面里再次点击下载按钮才能触发下载。这时候要处理窗口切换和元素等待:
步骤&代码示例
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 # 完善浏览器下载配置 options = webdriver.ChromeOptions() options.add_experimental_option('prefs', { 'credentials_enable_service': False, 'profile.password_manager_enabled': False, 'download.default_directory': '你的本地下载路径', # 替换成你的实际路径 'download.prompt_for_download': False, # 禁止弹出下载确认框 'download.directory_upgrade': True, # 允许升级下载目录 'safebrowsing.enabled': True # 避免安全拦截自动下载 }) driver = webdriver.Chrome(options=options) driver.get("https://www.foundationforintermediaries.co.uk/document-library/") # 1. 点击目标文件链接前,保存当前窗口句柄 main_window = driver.current_window_handle # 2. 定位并点击目标文件链接 target_link = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, 'Buy To Let Individual Product Guide')) ) target_link.click() # 3. 等待新窗口/标签页打开,并切换过去 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) for handle in driver.window_handles: if handle != main_window: driver.switch_to.window(handle) break # 4. 在新页面中定位下载按钮并点击(根据实际页面调整选择器) download_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//a[contains(text(), "Download") or contains(@href, ".pdf")]')) ) download_btn.click() # 5. 可选:等待下载完成(可以通过检查下载目录文件是否存在、大小是否稳定实现) # 最后关闭窗口 driver.quit()
方案2:绕过跳转,直接获取真实下载链接(更高效)
如果不想处理页面跳转,可以直接找到文件的真实下载URL,跳过中间页面直接下载。步骤如下:
操作思路
- 先访问文档库页面,定位目标链接的跳转地址
- 打开跳转地址对应的页面,提取真实的下载链接
- 直接请求该链接完成下载(可以用Selenium或requests)
代码示例(结合requests复用会话)
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 requests options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=options) driver.get("https://www.foundationforintermediaries.co.uk/document-library/") # 1. 获取目标链接的跳转地址 target_link = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.LINK_TEXT, 'Buy To Let Individual Product Guide')) ) redirect_url = target_link.get_attribute('href') # 2. 访问跳转页面,提取真实下载链接 driver.get(redirect_url) download_url = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//a[contains(@href, ".pdf")]')) ).get_attribute('href') # 3. 复用Selenium的会话(避免登录/权限问题),用requests下载 session = requests.Session() for cookie in driver.get_cookies(): session.cookies.set(cookie['name'], cookie['value']) response = session.get(download_url) with open('Buy_To_Let_Individual_Product_Guide.pdf', 'wb') as f: f.write(response.content) driver.quit()
关键配置补充
你之前的配置缺少了几个关键项,导致可能无法自动下载:
download.prompt_for_download: 设置为False,禁止浏览器弹出下载确认框download.directory_upgrade: 设置为True,确保下载目录生效safebrowsing.enabled: 设置为True,避免浏览器因安全拦截阻止自动下载
这些已经加到方案1的配置里了,记得替换成你自己的本地下载路径。
内容的提问来源于stack exchange,提问作者Oksana Ok
相关产品推荐
相关产品推荐

