保存网页为PDF

最近在做一个项目,需要爬取一个系统的所有(动态)页面,并将每个网页都存为一个PDF文件。由于是内部系统,没有反爬,所以爬虫编写并不复杂,保存网页支持Python的工具搜了下,主要有两个:

1,PdfKit,基于wkhtmlpdf,后者是c语言编写的;

2,Weasyprint,好像是一个纯Python的工具。

在实际使用中,基于wkhtmlpdf的pdfkit功能更为全面,支持选项很多,支持较为复杂的js和css,保存下来的pdf文件和原网页比较类似。Weasyprint则比较弱,cookie和authentication都不支持,不过可以通过自定义url_fetcher来作为workaround,Weasyprint转换pdf的效果也比较差,基本都是白板,css渲染不如前者。不过我也用浏览器的打印成pdf功能测试了下,chrome和safari打出来也都是白板。

PdfKit使用得比较顺利,不过在下载某个网页的时候,中间有一个表格,浏览器都能正常显示,但是pdf却显示不出来,经过分析,原因可能是wkhtmlpdf不支持在元素上直接设置style="width=xxx"来设定表格宽度,也不支持aria-describedby这样的属性标签,修改css文件后基本能显示。

修改css文件的方式也值得一记,因为不能对系统本身修改,而wkhtmlpdf不支持替换css(user-style-sheet不好用!),所以只好采用charles代理+替换的方式。启动charles后,在目标css文件上点右键,选择map local...就可以用本地的css文件替换远程的css文件了,典型的中间人攻击,哈哈。

posted @ 2019-10-18 17:19  思翰爹  阅读(208)  评论(0编辑  收藏  举报