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




