当今互联网时代,网页已成为我们获取信息、传递知识的重要媒介。然而,有时我们可能需要将网页保存为PDF格式,以便于离线阅读、打印或分享给他人。幸运的是,利用Python编程语言,我们可以轻松地将网页转换为PDF文件。
在本篇博客中,我将介绍如何使用Python实现将网页转换为PDF的功能,并且加上了自动长截图的特性。这意味着,无论网页有多长或多么复杂,我们都能够一次性截取整个页面并保存为PDF文件。
为了实现这一目标,我们将使用pdfkit
和selenium
两个Python库。pdfkit
是一个强大的工具,可以将HTML文件或URL直接转换为PDF文件。而selenium
则是一个自动化Web测试工具,它提供了浏览器模拟和页面操作的功能。
在具体实现方面,我们首先需要安装相应的库和工具。然后,我们将使用selenium
来加载网页并进行自动长截图,获取完整页面的截图。接下来,我们将使用pdfkit
将截图保存为PDF文件。
通过阅读本篇博客,你将学习到如何使用Python编程语言将网页转换为PDF,并且自动截取整个页面的技巧。这将为你提供一种方便、高效的方式,以便在离线环境中浏览和分享网页内容。
无论是希望保存重要文章、学习资料,还是需要打印保存网页内容,本教程都将为你提供实用的解决方案。让我们开始吧,探索Python如何帮助我们将网页转换为PDF文件的奇妙能力!
初次实践:python网页自动截图
步骤如下:
(1) 安装python selenium 库,推荐使用pip快速安装最新版本 pip install selenium
(2) 检查Chrome浏览器的版本,下载对应版本的chromedriver。
(3) 通过地址栏里输入命令 chrome://version/
在 CNPM Binaries Mirror 的网址上下载对应的chromedriver,下载下来的文件是一个压缩包,然后解压就会有一个exe文件,把exe文件copy下来放到chrome的同一路径下(也可直接放在python路径下),然后复制这个路径在环境配置里的系统环境path添加chromedriver的路径配置环境变量。
(4) 编写测试代码:
from selenium import webdriver
import threading
import time
import os
import datetime
def road_situation():
# 每隔30秒截屏一次
t = threading.Timer(30, road_situation)
t.start()
# start = datetime.datetime.now()
# print(start)
# 初始化一个谷歌浏览器实例
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.sohu.com/")
# driver.refresh()
driver.get_screenshot_as_file(r"E:\PyCharm2017project\Atest\maintest\picture\%s.png" %time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())))
print(os.getcwd())
# end = datetime.datetime.now()
# print(end)
# print(end - start)
driver.quit()
if __name__ == "__main__":
road_situation()
但截取的是打开网页后的全屏,后面下拉的页面没有截取到,没有达到想要的效果,
如果页面较大,页面会产生上下翻页的效果,屏幕截图无法应对此种页面,截图看到的网页只有一部分。后使用selenium + phantomjs实现网页长截图可以解决这一问题。
法一:使用 selenium + phantomjs实现网页长截图
步骤如下:
(1) 安装python selenium 库,推荐使用pip快速安装最新版本 pip install selenium
(2) 下载phantomjs.exe,将其添加到环境变量 path 中 。方便起见可以直接放在python的安装目录根目录下。下载链接:https://phantomjs.org/download.html
(3) 编写测试代码
from selenium import webdriver ##从selenium库导入webdirver
import threading
import time
import os
import datetime
def road_situation():
# 每隔30秒截屏一次
t = threading.Timer(30, road_situation)
t.start()
# start = datetime.datetime.now()
# print(start)
# 初始化一个谷歌浏览器实例
##使用webdirver.PhantomJS()方法新建一个phantomjs的对象,这里会使用到phantomjs.exe,环境变量path中找不到phantomjs.exe,则会报错
driver = webdriver.PhantomJS()
driver.maximize_window() #设置phantomjs浏览器全屏显示
#使用get()方法,打开指定页面。注意这里是phantomjs是无界面的,所以不会有任何页面显示
driver.get("https://www.sohu.com/")
# driver.refresh()
driver.get_screenshot_as_file(r"E:\PyCharm2017project\Atest\maintest\picture\%s.png" %time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())))
print(os.getcwd())
# end = datetime.datetime.now()
# print(end)
# print(end - start)
#关闭phantomjs浏览器,不要忽略了这一步,否则你会在任务浏览器中发现许多phantomjs进程
driver.quit()
if __name__ == "__main__":
road_situation()
网页转PNG图片(截取的png图片):
法二:python将网页转化为pdf:
(1) 安装python pdfkit 库,推荐使用pip快速安装最新版本,pip install pdfkit
(2) 下载wkhtmltopdf安装包,并且安装到电脑上,在系统Path变量中添加wkhtmltopdf的bin路径,以便于pdfkit的调用。
(3) 编写测试代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:ZSW
@file:htmltopdf.py
@time:2020/09/14
"""
import pdfkit
import time
import datetime
def save_to_pdf(url):
'''
根据url,将文章保存到本地
:param url:
:return:
'''
start = datetime.datetime.now()
print(start)
# 本来直接调用pdfkid的from方法就可以了,但是由于我们的wkhtmltopdf安装包有点问题,一直没法搜到,所以只能用本办法,直接配置了wk的地址
# wkhtmltopdf下载链接: https://wkhtmltopdf.org/downloads.html
config = pdfkit.configuration(wkhtmltopdf=r'E:\htmltopdf\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_url(url, r"E:\PyCharm2017project\Atest\maintest\picture\%s.pdf"
%time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())), configuration=config)
end = datetime.datetime.now()
print(end)
print(end - start)
if __name__ =='__main__':
url = "https://www.sohu.com/"
save_to_pdf(url)
网页转PDF文件:
法三:
注:如果不是有特别的需求,可以用Chrome浏览器将网页页面另存为PDF的功能,步骤如下:
(1) 打开需要转为PDF的网页;
(2) 右击鼠标按键——选择‘打印’——再选择‘另存为PDF’——点击‘保存即可’。
(3) 打开保存的pdf查看,其效果和法二实现的一样。
小结:经过简单实践,两种方法都能够实现网页自动长截图,但使用方法二的效率更高些,运行时间较法一短。但对于像搜狐首页这种长下拉的网页,截取的pdf(图片)中 有些图片未加载出来。