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

Selenium(Python+Chrome)无法下载无独立URL的PDF问题求助

处理Chrome PDF Viewer场景下的Selenium PDF下载问题

问题场景

  • 操作流程:
    1. 导航至目标页面
    2. 点击页面上的PDF下载按钮
    3. 页面通过JavaScript打开新标签页,用Chrome PDF Viewer渲染PDF,但PDF的URL始终固定,不指向实际文件,无法直接用requests下载
    4. 手动点击PDF Viewer内的下载按钮可以完成下载,但Selenium无法自动触发这个操作

已尝试的无效配置

if download_files:
    download_dir = os.getcwd()
    print(download_dir)
    prefs['download.default_directory'] = download_dir
    prefs['download.prompt_for_download'] = False
    prefs['download.directory_upgrade'] = True
    prefs['plugins.always_open_pdf_externally'] = True
    prefs['safebrowsing_for_trusted_sources_enabled'] = False
    prefs['safebrowsing.enabled'] = False
    # prefs['plugins.plugins_list'] = [{"enabled": False, "name": "Chrome PDF Viewer"}]
    # prefs['download.extensions_to_open'] = "applications/pdf"
prefs['profile.default_content_settings'] = {"images": 2}
print(prefs)
chrome_options.add_experimental_option("prefs", prefs)

可行解决方案

方案一:直接操作Chrome PDF Viewer的下载按钮

新标签页打开PDF后,切换到该标签页,定位并点击Viewer内的下载按钮:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 点击页面上的PDF下载按钮
pdf_page_btn = driver.find_element(By.XPATH, "//替换为页面下载按钮的XPATH")
pdf_page_btn.click()

# 切换到新打开的PDF标签页
driver.switch_to.window(driver.window_handles[-1])

# 等待PDF Viewer加载完成,定位下载按钮(根据实际元素调整选择器)
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='下载']"))
).click()

# 切换回原标签页继续后续操作
driver.switch_to.window(driver.window_handles[0])

方案二:调整Chrome配置,强制下载PDF

修改prefs配置,确保禁用Chrome PDF Viewer并强制外部打开(即直接下载):

import os
from selenium import webdriver

download_dir = os.getcwd()
chrome_options = webdriver.ChromeOptions()

prefs = {
    "download.default_directory": download_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True,
    "plugins.plugins_disabled": ["Chrome PDF Viewer"],
    "safebrowsing.enabled": False,
    "safebrowsing_for_trusted_sources_enabled": False
}
# 如果不需要禁用图片,可移除下面这行
prefs['profile.default_content_settings'] = {"images": 2}

chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=chrome_options)

注意:确保plugins.plugins_disabled正确禁用Chrome PDF Viewer,避免和其他冲突配置共存。

方案三:读取PDF的Blob URL下载

如果PDF是通过Blob渲染的,可通过执行JS获取Blob地址,再用requests下载(需带上会话Cookie):

import requests

# 执行JS获取PDF的Blob URL
blob_url = driver.execute_script("return window.PDFViewerApplication.url;")

# 提取当前会话的Cookie,确保请求权限
cookies = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}

# 下载PDF
response = requests.get(blob_url, cookies=cookies)
with open("target.pdf", "wb") as f:
    f.write(response.content)

内容的提问来源于stack exchange,提问作者qoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:13:11