如何用Python+Chrome+Selenium不落地文件直接获取PDF内容
无需下载直接获取PDF内容的两种方案
方案一:直接用requests获取(URL可直接访问时优先用)
如果PDF的URL可以直接访问(不需要通过Selenium处理登录、页面渲染等前置操作),直接用requests库是最简便高效的,和你提到的用法一致:
import requests pdf_url = "http://www.africau.edu/images/default/sample.pdf" pdf_content = requests.get(pdf_url).content # 获取二进制形式的PDF内容 # 后续可直接处理内容,比如保存到内存或解析 # 示例:保存到文件(可选) with open("sample.pdf", "wb") as f: f.write(pdf_content)
方案二:用Selenium+Chrome DevTools协议(CDP)拦截网络请求
如果必须通过Selenium完成前置操作(比如登录、页面动态生成PDF链接),可以利用Chrome的DevTools协议拦截PDF的网络请求,直接获取响应内容,无需下载到本地:
from selenium import webdriver options = webdriver.ChromeOptions() # 不需要下载相关配置,让Chrome在浏览器内打开PDF options.add_argument("--headless") # 无头模式可选 driver = webdriver.Chrome(options=options) # 启用Chrome DevTools的网络监控 driver.execute_cdp_cmd("Network.enable", {}) # 定义回调函数,监听响应完成事件 response_body = None def handle_response(event): global response_body # 判断请求的URL是否是目标PDF if event["response"]["url"] == "http://www.africau.edu/images/default/sample.pdf": # 获取响应体 body = driver.execute_cdp_cmd("Network.getResponseBody", {"requestId": event["requestId"]}) # 处理二进制内容:如果base64编码则解码 if body.get("base64Encoded", False): import base64 response_body = base64.b64decode(body["body"]) else: response_body = body["body"].encode("utf-8") # 添加事件监听 driver.execute_cdp_cmd("Network.responseReceived", {"listener": handle_response}) # 访问PDF URL driver.get("http://www.africau.edu/images/default/sample.pdf") # 现在response_body就是PDF的二进制内容,和requests.get的content一致 print("获取到PDF内容长度:", len(response_body)) # 后续处理示例:解析或保存 # with open("sample_from_cdp.pdf", "wb") as f: # f.write(response_body) driver.quit()
注意事项
- 如果PDF链接是页面动态生成的,需要先完成页面交互(比如点击按钮生成PDF),再拦截对应的请求;
- 确保Chrome版本和Selenium版本兼容,避免CDP命令不支持的问题;
- 若遇到跨域或权限问题,可临时添加
--disable-web-security选项(仅用于测试环境)。
内容的提问来源于stack exchange,提问作者fevar
相关产品推荐
相关产品推荐

