
需求:我们公司的营销部门需要把每日的订单生成为PDF,以便物流专员使用。每个订单是一个PDF,订单量巨大,手动下载耗时、不方便,需要开发程序进行自动下载。
分析:这是爬虫任务的后续工作,简而言之就是如何把网页保存为PDF。大家请注意,从技术层面讲,它不是单单只说把requests请求到的信息保存为PDF,这种类似于用python下载文件。我们的订单网站有的是不提供下载功能的,人工是怎么操作呢?打开订单网页,Ctrl + P,另存为PDF。简而言之,我的需求是把网页保存为PDF。
这里按照我学习的过程提供三种思路(代码)给大家参考。
方法一:pdfkit
相信大家在网上搜索“如何用python把网页保存为pdf”之类的关键信息,弹出最多的就是这种方法。这个pdfkit包的思路是,我们访问网页,获取网页的html脚本代码,然后根据html脚本还原网页,逆向生成pdf。这种方法的缺点官网上说得很清楚了:只支持标准的html。比如网页有些奇怪的标签,或者有组件等,pdfkit它就解析不了。同时,如果有图片,在html代码里,图片其实是网址,pdfkit去生成pdf的时候它会去访问网址,如果图片的网址不需要认证信息就能访问,那就没关系,如果你的图片是在登录后的网页中,由于pdfkit无法传递header,所以这种图片是获取不到的。
总而言之,pdfkit方法适合保存简单的网页,它的代码量很小,速度一般。
使用方法示例:
安装:
然后安装一个软件:wkhtmltopdf.exe
官网下载地址:https://wkhtmltopdf.org/downloads.html
安装时请记得安装路径,会有用到。
编写python代码:
打印的百度、知乎网址如下:
以上演示的是把url生成pdf的例子,除此之外,pdfkit还支持把html和字符串生成pdf,这里不再演示,有需要可以查看相关资料或者在公众号内留言。
方法二:selenium
使用selenium下载pdf的本质是,利用selenium控制浏览器执行pdf打印功能,与人工在浏览器执行Ctrl + P效果相同。这种方法的好处一是我们可以登录一些网站,二是所见即所得。那么,难点在于通过浏览器执行打印功能的代码如何编写。请参考如下:
方法三:Pyppeteer
不少文章都说Pyppeteer是比selenium更厉害的爬虫利器。笔者对Pyppeteer研究不多,只测试了它打印pdf的功能,发现代码更加简洁,效率等其他指标没有进行测试,建议大家在后续的工作中进行一些研究。
Pyppeteer其实是Puppeteer的Python版本,下面简单介绍下Pyppeteer的两大特点,chromium浏览器和asyncio框架:
1).chromiumChromium是一款独立的浏览器,是Google为发展自家的浏览器Google Chrome而开启的计划,相当于Chrome的实验版,Chromium的稳定性不如Chrome但是功能更加丰富,而且更新速度很快,通常每隔数小时就有新的开发版本发布
2).asyncio
asyncio是Python的一个异步协程库,自3.4版本引入的标准库,直接内置了对异步IO的支持,号称是Python最有野心的库,官网上有非常详细的介绍。由于Pyppeteer是基于asyncio实现的,所以它本身就支持异步操作,执行效率得到大幅提升。
打印pdf的代码如下:
对python的并发、协程不了解的读者,上述代码理解起来会有点困难,对asyncio、await关键词十分陌生。正如上文所说,Pyppeteer是基于asyncio实现的,这是它的优点,本身就支持异步操作,await、asyncio就是一些实现异步的代码,去掉还不行。笔者最近正在研究python异步编程,实现了异步下载网页中的文件的功能,以后整理下分享给大家。
以上就是用python把网页保存为pdf的方法,代码仅作示范,实现了基础的打印功能。对于浏览器登录、数据获取,与以往的爬虫方法相同,按需添加代码即可。
