使用python将网页下载为pdf

news2024/11/28 15:38:14

背景:即使用 python 实现网页的打印,将网页下载为pdf

要求

安装ChromeDriver,并配置环境遍历,版本需要与chrome版本一致

下载地址:ChromeDriver - WebDriver for Chrome - Downloads (google.com)icon-default.png?t=N7T8https://sites.google.com/chromium.org/driver/downloads代码:

import os,json,time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


def print_url_to_pdf(url, save_root, 
                     file_name='demo.pdf', 
                     scroll_distance=500, 
                     scroll_interval=0.5, 
                     headless=False):
    """
    save_root: pdf 保存目录,建议绝对路径
    file_name:pdf保存名称
    scroll_distance:每次向下滑动距离,模拟浏览页面,获得全部页面元素
    scroll_interval:滑动一次后,间隔时间
    headless:是否可见窗口,True, 不可见;False,可见,调试时可设为可见
    """
    chrome_options = webdriver.ChromeOptions()

    settings = {
        "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": ""
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isHeaderFooterEnabled": False,

        # "customMargins": {},
        # "marginsType": 2,
        # "scaling": 100,
        # "scalingType": 3,
        # "scalingTypePdf": 3,
        "isLandscapeEnabled":False,#landscape横向,portrait 纵向,若不设置该参数,默认纵向
        "isCssBackgroundEnabled": True,
        "mediaSize": {
            "height_microns": 297000,
            "name": "ISO_A4",
            "width_microns": 210000,
            "custom_display_name": "A4 210 x 297 mm"
        },
    }


    chrome_options.add_argument('--enable-print-browser')

    if headless:
        chrome_options.add_argument('--headless') #headless模式下,浏览器窗口不可见,可提高效率

    prefs = {
        'printing.print_preview_sticky_settings.appState': json.dumps(settings),
        'savefile.default_directory': save_root #此处填写你希望文件保存的路径
    }
    chrome_options.add_argument('--kiosk-printing') #静默打印,无需用户点击打印页面的确定按钮
    chrome_options.add_experimental_option('prefs', prefs)


    driver = webdriver.Chrome(options=chrome_options)

    print('-'*100)
    print(f'now: url: {url}')
    driver.get(url)

    # 获取当前所有窗口的句柄
    handles = driver.window_handles
    # 切换到最后一个窗口(假设最后一个窗口是要操作的窗口)
    driver.switch_to.window(handles[-1])


    # 获取当前视口的高度
    viewport_height = driver.execute_script("return window.innerHeight;")
    # 获取滚动条的位置
    current_scroll_position = driver.execute_script("return window.scrollY;")

    # 定义滚动的距离和间隔时间
    # scroll_distance = 200 # 每次滚动的距离
    # scroll_interval = 0.5 # 每次滚动的间隔时间(秒)

    # 计算需要滚动的次数
    num_scrolls = int((driver.execute_script("return document.body.scrollHeight;") - current_scroll_position) / scroll_distance)

    print('scroll pages...')
    # 循环滚动页面
    for _ in range(num_scrolls):
        driver.execute_script(f"window.scrollBy(0, {scroll_distance});")
        time.sleep(scroll_interval)

    # 执行 JavaScript 代码,将页面滚动到底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待页面加载完成
    # 添加适当的等待时间或条件,确保页面已完全加载
    time.sleep(5)

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


def download_urls(url_list, name_list, save_root):
    for url, name in zip(url_list, name_list):
        print_url_to_pdf(url, save_root, name)
        time.sleep(5)



url_list =[
    'https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%B8%82/126069?fromModule=lemma_search-box&fromtitle=%E5%8C%97%E4%BA%AC&fromid=128981',
    'https://baike.baidu.com/item/%E5%A4%A9%E6%B4%A5%E5%B8%82/213824?fromModule=lemma_search-box&fromtitle=%E5%A4%A9%E6%B4%A5&fromid=132308'
]
name_list = [
    'beijing.pdf', 'tianjin.pdf'
]
save_root = 'C:\\data'
download_urls(url_list, name_list, save_root)

headless True时,即不显示窗口,不会下载为pdf(代码能正常运行),这个问题暂时未解决,稍后解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】多线程的学习笔记——白话文版(bushi

目录 为什么要使用多线程 例子 代码 结果 首先要先学的库——thread库 thread的简介 thread的具体使用方法 基本变量的定义 注意(小重点) join函数的解读(重点) detach函数的解读 注意 关于vector和thread是联合使用 …

【ZSH】zsh自定义命令行提示符

这是默认的 这是添加了用户名 具体做法: 1、sudo vim ~/.zshrc 查看当前主题 2、sudo vim ~/.oh-my-zsh/themes/robbyrussell.zsh-theme 修改主题文件 3、%{$fg_bold[green]%}%n 添加用户名显示 4、source ~/.zshrc 刷新zsh

Qt多线程实现方式-moveToThread及其注意事项

Qt多线程实现方式-moveToThread及其注意事项 Chapter1 Qt多线程实现方式-moveToThread一、Qt下使用线程主要有两种方法。二、Qt下创建多线程也有两种方法。三、其它问题。 Chapter2 QT多线程接收串口数据1.前言2.功能作用3.软件测试效果4.基本步骤 Chapter3 利用Qt多线程机制实…

Redis与分布式-分布式锁

接上文 Redis与分布式-集群搭建 1.分布式锁 为了解决上述问题,可以利用分布式锁来实现。 重新复制一份redis,配置文件都是刚下载时候的不用更改,然后启动redis服务和redis客户。 redis存在这样的命令:和set命令差不多&#xff0…

《数据结构》之栈和堆结构及JVM简析

导言: 在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 一.程序在内存中的分布 作为一个程序猿,我们应该会常常跟代码打交道,那么我们…

【Java】医院智能导诊小程序源码,springboot框架

智能导诊 可以根据用户症状描述精准推荐科室及医生智能学习医院历史数据及自动进行科室对照,与医院的系统连接后,患者可直接完成预约。 一、系统概述 “智能导诊”以人工智能手段为依托,为人们提供智能分诊、问病信息等服务,在一定程度上满足了人们自我…

Spring框架中如何解决日志输出类型的问题

问题的描述 在学习Spring框架的过程中,运行应用程序时,会出现非常详细的日志输出,影响我对于最终输出结果的观察,具体情况见下图: 解决办法 在resource文件夹下,创建log4j.xml配置文件,Spring …

算法-排序算法

0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间…

【vue3】toRef与toRefs的使用,toRef与ref的区别

假期第四篇,对于基础的知识点,我感觉自己还是很薄弱的。 趁着假期,再去复习一遍 1、toRef与toRefs 创建一个ref对象,其value值指向另一个对象中的某个属性 语法:const name toRef(person,‘name’&#xf…

【c++随笔07】常量、变量、static

【c随笔07】常量、变量、static 1、常量、变量1.1、声明变量1.2、使用常量 2、static介绍2.1、static 局部变量2.2、static 全局变量2.3、C static静态成员变量2.4、C static静态成员函数详解 原创地址,https://zhengjunxue.blog.csdn.net/article/details/13167770…

偏微分方程的人工智能

9 偏微分方程的人工智能 在本节中,我们详细介绍了用于解决偏微分方程(Partial Differential Equations,PDEs)的人工智能领域的进展。我们在第9.1节中概述了PDE建模的一般形式,并阐述了在这个背景下使用机器学习方法的…

前端两年半,CSDN创作一周年

文章目录 一、机缘巧合1.1、起因1.2、万事开头难1.3、 何以坚持? 二、收获三、日常四、憧憬 五、总结 一、机缘巧合 1.1、起因 最开始接触CSDN,还是因为同专业的同学,将计算机实验课的实验题,记录总结并发在了专业群里。后来正式…

Airtest1.2.7新增断言API介绍

1. 前言 1.2.7版本的Airtest中,一个很重要的功能是 新增了非常丰富的断言API ,今天我们就来详细看一下Airtest都给我们提供了哪些断言语句。 2. 旧版Airtest提供的断言语句 先回顾下,旧版Airtest一直以来,都只给我们提供了2种断言…

软件工程与计算(一)软件工程基础

国庆快乐,今天开始更新《软件工程与计算(卷二)》的重要知识点内容~ 一.软件 1.软件独立于硬件 早期的软件是为了计算机硬件在研究型项目中而开发制造的,人们使用专门针对于硬件的指令码和汇编语言编写,这也是最早软件…

中文符号雨python

参考地址 字体地址也可以自己找一下资源 import pygame import randomdef main():# 初始化pygamepygame.init()# 默认不全屏fullscreen False# 窗口未全屏宽和高WIDTH, HEIGHT 1000, 600init_width, init_height WIDTH, HEIGHT# 字块大小,宽,高sufac…

【计算机网络】网络层-控制平面(学习笔记)

一、路由原理 1、网络层功能 1)数据平面 转发:将分组从路由器的一个输入端口移到合适的输出端口 2)控制平面 路由:确定分组从源到目标的路径 2、路由算法 路径长度可靠性延迟带宽负载通信代价 3、路由的原则 1&#xff0…

2021-06-11 51蛋骗鸡用小数点作秒指示,分钟计时.(怎么用二个数码管做分的倒计时,DP亮灭来计秒)

缘由怎么用二个数码管做分的倒计时,DP亮灭来计秒,求思路 - 24小时必答区 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit BUZ1P1^0; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsign…

4. 条件查询

首先区分下match,match_phrase,term, 参考:https://zhuanlan.zhihu.com/p/592767668?utm_id0 1、全量查询分页指定source 示例:请求地址为http://127.0.0.1:9200/students/_search,请求体为: {"query":…

git使用,一点点

查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错: 所以这个时候你要同步一下git pull

MATLAB中d2d函数用法

目录 语法 说明 示例 重新采样离散时间模型 重新采样已识别的离散时间模型 d2d函数的功能是重新采样离散时间模型。 语法 sys1 d2d(sys, Ts) sys1 d2d(sys, Ts, method) sys1 d2d(sys, Ts, opts) 说明 sys1 d2d(sys, Ts)将离散时间动态系统模型 sys 重新采样&#…