如何用Selenium Python指定位置下载无直接URL的PDF?
解决Selenium点击下载按钮后PDF在新标签页预览无法下载的问题
方法1:修改浏览器配置,直接下载PDF而非预览
通过配置浏览器偏好设置,跳过PDF预览步骤,让文件直接下载到指定目录。以Chrome为例:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By # 配置Chrome选项 chrome_options = Options() chrome_options.add_experimental_option("prefs", { # 替换为你的本地下载路径 "download.default_directory": "/Users/yourname/Downloads", # 关闭下载提示弹窗 "download.prompt_for_download": False, # 强制直接下载PDF,不打开预览 "plugins.always_open_pdf_externally": True, # 禁用Chrome内置PDF查看器 "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}] }) # 初始化驱动 driver = webdriver.Chrome(options=chrome_options) # 访问目标页面并点击下载按钮 driver.get("https://your-target-page.com") download_btn = driver.find_element(By.XPATH, "//button[contains(text(), '下载')]") download_btn.click() # 等待下载完成(可根据文件大小调整等待时长) driver.implicitly_wait(10) driver.quit()
方法2:切换到新标签页,提取真实PDF URL并下载
如果浏览器配置无法生效,可切换到PDF预览的新标签页,提取真实PDF地址后,携带登录Cookie完成下载:
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 driver = webdriver.Chrome() driver.get("https://your-target-page.com") # 记录原窗口句柄 original_window = driver.current_window_handle # 点击下载按钮 download_btn = driver.find_element(By.XPATH, "//button[contains(text(), '下载')]") download_btn.click() # 等待新标签页加载并切换过去 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) for handle in driver.window_handles: if handle != original_window: driver.switch_to.window(handle) break # 提取PDF真实URL(根据页面结构调整,以下是两种常见场景) # 场景1:PDF嵌入在iframe中 pdf_iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "iframe"))) pdf_url = pdf_iframe.get_attribute("src") # 场景2:预览页URL直接指向PDF(需携带Cookie维持登录态) # pdf_url = driver.current_url # 用requests携带Selenium的Cookie下载PDF session = requests.Session() for cookie in driver.get_cookies(): session.cookies.set(cookie["name"], cookie["value"]) response = session.get(pdf_url) with open("downloaded_file.pdf", "wb") as f: f.write(response.content) # 清理操作:关闭新标签页,切回原窗口 driver.close() driver.switch_to.window(original_window) driver.quit()
方法3:拦截网络请求,捕获PDF下载链接
如果PDF通过API接口返回,可监听浏览器网络日志,直接捕获PDF的请求URL:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By import json import requests # 配置Chrome开启性能日志 chrome_options = Options() chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"}) driver = webdriver.Chrome(options=chrome_options) driver.get("https://your-target-page.com") # 点击下载按钮 download_btn = driver.find_element(By.XPATH, "//button[contains(text(), '下载')]") download_btn.click() # 遍历网络日志,筛选PDF请求 logs = driver.get_log("performance") pdf_url = None for log in logs: msg = json.loads(log["message"])["message"] if "Network.responseReceived" in msg["method"]: url = msg["params"]["response"]["url"] if url.endswith(".pdf"): pdf_url = url break # 携带Cookie下载PDF if pdf_url: session = requests.Session() for cookie in driver.get_cookies(): session.cookies.set(cookie["name"], cookie["value"]) response = session.get(pdf_url) with open("captured_pdf.pdf", "wb") as f: f.write(response.content) driver.quit()
注意事项
- 替换代码中的页面URL、下载按钮定位方式、本地下载路径为实际值;
- 若网站有反爬机制,需添加合理等待时间、模拟用户行为(如滚动、随机点击)避免被拦截;
- Firefox浏览器可参考
browser.download.folderList、browser.download.dir等偏好参数进行配置。
内容的提问来源于stack exchange,提问作者André Sousa
相关产品推荐
相关产品推荐

