小能豆

Selenium chromedriver 下载网页未保存为 PDF

py

我正在使用 selenium 的 chrome webdriver 打开一个网页,然后将该网页保存到本地驱动器上的文件位置。出于某种原因,脚本 (‘window.print();’) 将打开另存为网页选项,但不会继续单击“打印”并在本地保存文件。JavaScript 似乎永远无法完成并且会超时。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
chrome_options.add_argument("--disable-gpu")

pdf_path = "C:\\Test_Data\\output.pdf"

driver = webdriver.Chrome(options=chrome_options)

driver.get("https://www.google.com")

time.sleep(5)

driver.set_script_timeout(5)
driver.execute_script('window.print();')

time.sleep(5)

driver.quit()

我尝试增加超时时间,但该过程并未真正完成。


阅读 14

收藏
2024-12-12

共1个答案

小能豆

Selenium 和 window.print() 的主要问题在于:
window.print() 依赖浏览器 UI 交互完成打印流程,而 Selenium 默认无法直接与打印对话框或系统 UI 进行交互。打印对话框的行为由操作系统和浏览器控制,而不是网页内容或 JavaScript 脚本。

要解决这个问题,可以使用以下几种方法来将网页保存为 PDF,而不需要使用 window.print()


方法 1:通过无头模式和 --print-to-pdf 标志

Chrome 提供了一个内置功能,可以直接将网页渲染为 PDF。

代码示例

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")  # 使用无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--print-to-pdf")  # 将页面保存为 PDF
chrome_options.add_argument(f"--print-to-pdf={pdf_path}")  # 保存的 PDF 文件路径

driver = webdriver.Chrome(options=chrome_options)

try:
    driver.get("https://www.google.com")
finally:
    driver.quit()

说明
- --print-to-pdf 是一个 Chrome 特有的标志,它会将网页直接保存为 PDF。
- 这种方法无需用户交互,适用于静态页面的直接保存。


方法 2:通过 DevTools Protocol 保存 PDF

使用 Chrome DevTools Protocol(CDP),可以更精确地控制 PDF 的生成过程。

代码示例

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=chrome_options)

pdf_path = "C:\\Test_Data\\output.pdf"

try:
    driver.get("https://www.google.com")

    # 通过 DevTools Protocol 执行 PDF 渲染
    result = driver.execute_cdp_cmd("Page.printToPDF", {
        "path": pdf_path,
        "printBackground": True,
        "paperWidth": 8.5,
        "paperHeight": 11.0
    })

    # 将生成的 PDF 内容保存到文件中
    with open(pdf_path, "wb") as file:
        file.write(result["data"].encode("latin1"))
finally:
    driver.quit()

说明
- Page.printToPDF 是 DevTools Protocol 的一个命令,用于生成网页的 PDF 渲染。
- 可以通过选项设置页面大小、背景颜色等。


注意事项

  1. 无头模式(headless):上述方法需要启用无头模式,因为打印功能仅在无头模式下可以自动化。
  2. 文件路径:确保 pdf_path 指定的路径是可写的,避免因权限问题导致错误。
  3. 动态页面:如果页面包含动态内容(例如 JavaScript 动态加载),可能需要在调用 printToPDF 之前等待页面完全加载。

通过以上两种方法,你可以轻松地将网页保存为 PDF,而无需通过交互式的打印对话框完成任务。

2024-12-12