You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:03:37