You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python Selenium如何下载Chrome原生查看器加载的.zul页面PDF?

解决ZUL页面通过JS加载的PDF下载问题

我来帮你搞定这个ZUL页面加载PDF的下载问题!你遇到的情况很常见——网站用Chrome原生PDF预览器展示文件,但实际入口是ZUL页面,PDF通过JS动态加载。结合你给出的代码片段,我整理了几个靠谱的解决方案:

方法1:拦截网络请求抓真实PDF链接

最直接的思路是抓浏览器加载PDF时的真实请求。可以用selenium-wire这个库(它是Selenium的扩展,能监听所有网络请求),找到返回application/pdf的那个请求URL,直接用requests下载,比Selenium模拟下载高效得多。

示例代码:

from seleniumwire import webdriver
import requests
import os

def download_pdf(url, idx, save_dir):
    # 确保保存目录存在
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    options = webdriver.ChromeOptions()
    # 禁用PDF预览,避免干扰请求拦截
    options.add_experimental_option("prefs", {
        "plugins.always_open_pdf_externally": True
    })
    
    driver = webdriver.Chrome(options=options)
    driver.get(url)
    
    # 遍历所有请求,筛选出PDF链接
    for request in driver.requests:
        if request.response and request.response.headers.get('Content-Type') == 'application/pdf':
            pdf_url = request.url
            # 带上浏览器的cookie,避免权限问题
            headers = {'Cookie': '; '.join([f"{c['name']}={c['value']}" for c in driver.get_cookies()])}
            response = requests.get(pdf_url, headers=headers)
            
            with open(os.path.join(save_dir, f"file_{idx}.pdf"), 'wb') as f:
                f.write(response.content)
            print(f"第{idx}个PDF下载完成")
            break
    
    driver.quit()

方法2:配置Chrome自动下载PDF

如果不想用额外库,直接配置Chrome的偏好设置,让它跳过预览直接下载PDF,然后等待下载完成后重命名文件即可。

示例代码:

from selenium import webdriver
import os
import time

def download_pdf(url, idx, save_dir):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    options = webdriver.ChromeOptions()
    prefs = {
        "plugins.always_open_pdf_externally": True,  # 直接下载不预览
        "download.default_directory": os.path.abspath(save_dir),
        "download.prompt_for_download": False,  # 关闭下载提示框
        "download.directory_upgrade": True,
        "safebrowsing.enabled": True  # 避免安全提示拦截下载
    }
    options.add_experimental_option("prefs", prefs)
    
    driver = webdriver.Chrome(options=options)
    driver.get(url)
    
    # 等待下载完成(文件大的话可以延长时间,或者写个循环检查文件是否存在)
    time.sleep(6)
    
    # 重命名下载的文件(处理Chrome默认的文件名)
    for file in os.listdir(save_dir):
        if file.endswith('.pdf') and 'crdownload' not in file:
            os.rename(
                os.path.join(save_dir, file),
                os.path.join(save_dir, f"file_{idx}.pdf")
            )
            break
    
    driver.quit()

方法3:分析JS逻辑手动提取链接

如果前两种方法遇到权限问题(比如PDF链接带时效token),可以打开浏览器开发者工具(F12),切换到Network标签刷新页面,找到加载PDF的请求。然后查看页面的JS代码,看看这个链接是怎么生成的——比如是不是调用了某个API接口,或者从页面的某个隐藏元素里读取的。

举个例子,如果发现JS是通过fetch('/api/get_pdf?doc_id=xxx')获取PDF链接,那你就可以直接用requests调用这个接口,带上必要的Cookie和请求参数,拿到真实的PDF地址后再下载。

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

火山引擎 最新活动