selenium利用javascript进行自动打印网页为PDF

需求

selenium爬取页面的时候有时需要保持页面为PDF格式 并且不能使用pdfkit 模块(有的网址限制必须浏览器打开)

思路步骤

  1. 一:导入模块
  2. 二:在初始化driver对象的时候设定,浏览器静默保存(即保存时不弹出另存为按钮)和默认保存位置
  3. 三:打开所需网页
  4. 四:调用js打开打印窗口
  5. 修改当前页面标题(因为保存文件名就是标题名)并静默下载

具体代码


import json
from selenium.webdriver.common.by import By
from seleniumwire import webdriver

chrome_options = webdriver.ChromeOptions()
settings = {
    "recentDestinations": [{
        "id": "Save as PDF",
        "origin": "local",
        "account": ""
    }],
    "selectedDestinationId": "Save as PDF",
    "version": 2,  # 另存为pdf,1 是默认打印机
    "isHeaderFooterEnabled": True,  # 是否勾选页眉和页脚
    # "customMargins": {},
    # "marginsType": 2,#边距(2是最小值、0是默认)
    # "scaling": 100, # 缩放比例  100 表示不缩放
    # "scalingType": 3,
    # "scalingTypePdf": 3,
    # "isLandscapeEnabled": True,  # 若不设置该参数,默认值为纵向
    "isCssBackgroundEnabled": True,
    "mediaSize": {
        "height_microns": 297000,
        "name": "ISO_A4",
        "width_microns": 210000,
        "custom_display_name": "A4"
    },
}
chrome_options.add_argument('--enable-print-browser')
# chrome_options.add_argument('--headless') #headless模式下,浏览器窗口不可见,应当可提高效率
save_path = r'C:\Users\Administrator\Desktop'
prefs = {
    'printing.print_preview_sticky_settings.appState': json.dumps(settings),
    'savefile.default_directory': save_path,
}

chrome_options.add_argument('--kiosk-printing')  # 静默打印,无需用户点击打印页面的确定按钮
chrome_options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(chrome_options=chrome_options)  # 初始化浏览器

# 打开需要保持的网址并等待加载完成图片
driver.get('https://alifei04.cfp.cn/creative/vcg/800/version23/VCG41175510742.jpg')
driver.implicitly_wait(10)
element = driver.find_element(by=By.XPATH, value='/html/body/img')

# 调用js 保持PDF
save_file_name = 'test.pdf'
driver.execute_script(
    f'document.title="{save_file_name}";window.print();')  # 利用js修改网页的title,该title最终就是PDF文件名,利用js的window.print可以快速调出浏览器打印窗口,避免使用热键ctrl+P

input('*----')  # 可以做其他事情 但是不嫩立即qiut 否则关闭浏览器了后就不能下载了
driver.quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值