神器:用 pyppeteer 转换公众号文章为 PDF

2024-05-15 12:18

本文主要是介绍神器:用 pyppeteer 转换公众号文章为 PDF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是「进击的Coder」的第 368 篇技术分享

作者:刘志军

来源:Python 之禅

阅读本文大概需要 8 分钟。

之前介绍过一些将 html 转换为 PDF 文件的库,比如 wkhtmltopdf、WeasyPrint,今天再介绍另一个神器 Pyppeteer 可将 html 页面转换为 PDF。

Pyppeteer 是什么

介绍 Pyppeteer 之前,有必要先介绍一下 Puppeteer,Puppeteer 是谷歌官方出的一个通过 DevTools 协议控制 headless Chrome 的 Node 库。通过 Puppeteer 可以直接控制 Chrome 浏览器模拟大部分用户操作。

所谓 Headless Chrome 就是 Chrome 浏览器的无界面形态。

而 Pyppeteer 就是 Puppeteer 的 Python 版本非官方实现,它是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。

Pyppeteer 采用了 Python 的 async 机制,需要 Python3.5 及以上版本才支持。

Pyppeteer 能做什么

但凡是需要通过 Chrome 浏览器手动完成的操作都可以通过 Pyppeteer 自动完成,例如:

  • 生成页面截图

  • 生成 PDF 文件

  • 抓取单页面应用并生成预先呈现的内容

  • 从网站抓取你需要的内容

  • 自动表单提交,UI 测试,键盘输入等

截图

例如将页面生成截图可以直接调用 page.screenshot 方法

import asyncio
from pyppeteer import launchasync def main():browser = await launch()page = await browser.newPage()await page.goto('https://foofish.net')await page.screenshot({'path': 'example.png'})await browser.close()asyncio.get_event_loop().run_until_complete(main())

截图功能在海报分享等场景用的多,有看过有赞工程师分享的一篇文章,就有用到 Puppeteer 来做海报分享,性能比 Canvas 高。


而将网页转换为 PDF 的应用场景更多,比如将网站博客、专栏,或者公众号文章批量导出 PDF,方便离线阅读,比如我们最近做的一个医疗项目需要将用户填写的资料支持 PDF 形式批量导出,就是用的 Pyppeteer

导出 PDF

导出 pdf 直接调用 page.pdf  方法就可以, 代码非常简洁

import asyncio
from pyppeteer import launchasync def main():browser = await launch()page = await browser.newPage()await page.goto('https://foofish.net')await page.pdf({"path": "example.pdf", "format": 'A4'})await browser.close()asyncio.get_event_loop().run_until_complete(main())

接下来我们以公众号文章为例,将 html 页面制作成一个 PDF 文件。

公众号链接导出 PDF 示例

安装 pyppeteer

pip install pyppeteer

任意找一篇公众号的文章链接

 url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"

完成代码:

    browser = await launch()page = await browser.newPage()url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"await page.goto(url)file_name = "test.pdf"await page.pdf({"path": file_name, "format": 'A4'})await browser.close()

第一次运行的时候,会自动下载 chromium 浏览器,chromium 是 chrome 的开源版本, 需要几分钟才能下载完

[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 127496521/127496521 [00:20<00:00, 6268578.80it/s]
[W:pyppeteer.chromium_downloader] 
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\lzjun\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458

执行完成后,我们来预览下 pdf  文件

和原文链接对比,发现文章中的图片丢失了。

通过分析,原来是页面源代码中,img 标签没有 src 属性,只有个 src 属性,默认情况下图片是无法正常显示的,图片之所有能在浏览器能正常展示出来,是有个 js 脚本动态地修改了 dom 元素为 <img src='xxxx'>

这个网页使用的是一种叫懒加载的技术展示图片内容,所谓懒加载就是图片不会一次全部下载完,而是当前浏览到什么位置,就加载该处的图片,这样能提高页面的响应速度,同时减轻服务器性能。

所以,我们也可以通过js代码模拟真人浏览网页一样,滚动鼠标,不停地往下滑动,将图片动态加载出来。

最后,完整代码就变成了这样:

async def main():browser = await launch()page = await browser.newPage()url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"await page.goto(url)await page.evaluate('''async () => {await newPromise((resolve, reject) => {vartotalHeight = 0;vardistance = 100;vartimer = setInterval(() => {varscrollHeight = document.body.scrollHeight;window.scrollBy(0, distance);totalHeight += distance;if (totalHeight >= scrollHeight){clearInterval(timer);resolve();}}, 100);});}''')await page.pdf({"path": "test.pdf", "format": 'A4'})await browser.close()if __name__ == '__main__':asyncio.get_event_loop().run_until_complete(main())

将 js 代码封装成一个字符串当作参数传给 page.evaluate 函数, 该代码就是不断滚动页面,直到页面底部为止。这样整个页面的图片就全部加载出来了。

效果看起来还不错,和原页面的样式是一样的(点击图片放大查看)

在 Pyppeteer 实践应用过程中,也遇到不少坑,最后都逐个解决了,这可以单独写一篇文章,如果你在使用过程中遇到任何问题欢迎与我交流。

End

「进击的Coder」专属学习群已正式成立,搜索「CQCcqc4」添加崔庆才的个人微信或者扫描下方二维码拉您入群交流学习。

看完记得关注@进击的Coder

及时收看更多好文

↓↓↓

赶紧动手试一试

这篇关于神器:用 pyppeteer 转换公众号文章为 PDF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991817

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H