上一篇简单展示了我们将网页转化为PDF的成果,特别合适连载性网页文章,整理成册。 此篇也简单给大家讲解下技术要点,让大家可以快速上手,做出自己的电子书。
技术要点
一、抓取网页到本地保存
因为多数的网页都是带图片的,现在很多网页不是一般地静态网页,都是在浏览器加载过程中,随着浏览器滚动条的滚动,才加载对应的内容。
所以若想单纯地传一个网址,返回一个PDF文件,很多时候是会失败的。
使用代码控制浏览器,模拟浏览器的浏览操作,这里用到一个工具:selenium,相信一般关注网抓的人都对其不陌生。
笔者尝试搜索了一下selenium C#的关注词,没想到selenium是一个支持多种语言的工具,具体介绍百自行搜索,以下简单截取百度百科的介绍。
Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
所以,大家不要有错常见,觉得网抓就python好用,在C#里一样可以用到大家共同的工具,现在的工具也不会局限于只实现一种语言,相信dotNET随着开源的深入,生态越来越好时,会有更多便利的工具出现。
在C#代码里,通过Seenium控制浏览器行为,在浏览器上打开不同的网址,然后下载其对应的文件。
因我们想要图文版的数据,而不是单纯地一些结构化的数据,所以最简单的方式是类似浏览器行为的CTRL S保存为网页到本地。同样使用代码模拟发送键按键的方式实现。有兴趣的读者可参看以下代码。
网络上千篇一律是python的实现,笔者简单修改下成为dotNET版本的。
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)] public static extern void keybd_event(System.Windows.Forms.Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo); private static void SaveHtml(ChromeDriver driver) { uint KEYEVENTF_KEYUP = 2;¨K9K
二、将多个网页保存为PDF
虽然使用WORD也可以打开网页,但估计WORD对网页的渲染,使用的是IE的技术,许多的特性没法还原,所以,更科学地是直接转为PDF。
PDF的另一个好处是,几乎所有PDF阅读器都可以无差别地打开展示原效果,虽然说PDF编辑能力很有限,但我们的用途主要是阅读,所以将HTML转化为PDF,是比较理想的。
它可以将多个网页转成一个PDF文件,阅读时更连贯。
网页转PDF的工具为wkhtmltopdf,也是命令行工具,可以多语言调用,dotNET调用当然没问题,不过更好的体验,当属在PowerShell上使用。
wkhtmltopdf的安装方法,自行搜索资料学习,都是下一步完成,最后记得设置下环境变量让CMD、PowerShell可以识别即可。
通常可看到的python的html转pdf功能,其实底层也是用wkhtmltopdf完成。
多个网页转PDF,需要考虑排序问题,这时候,使用Excel催化剂可以轻松实现HTML的排版顺序问题。
一般来说,我们都是按顺序下载网页的,所以简单用Excel催化剂的遍历文件功能,将文件信息遍历出来,在Excel上做一下排序处理,对某些特殊的文件手动调整下顺序即可。
再来一个自定义函数stringjoin,快速将多个文件合并成一个字符串组合,中间用空格隔开,每个记录要用双引号括起来。
打开我们的PowerShell ISE软件,win10自带。其他系统也有,具体自行搜索相关教程打开。
相信不少读者也和笔者一样感受,觉得命令行好恐怖,都是一连串代码,特别是帮助文档也是看得晕晕的。
其实真正突破了心理的恐惧,命令行工具和我们在Excel上写函数一个原理,都是一个函数名传入各种参数,只是命令行的参数可以特别多而已。
下面就是我们在PowerShell上,通过一句命令就完成我们的多个html文件合并成一个PDF文件的操作。
笔者也是花了不少功夫去看帮助文档,才能写出更多的特性的命令,如加上页眉、页脚的功能。
开头的参数为全局参数,具体说明需要参照官方文档。
全局参数写完后,再将多个html文件铺开,最后加上pdf文件的名称,即可过多成。文件是使用相对路径,需要先将PowerShell的当前路径切换到html存放文件夹,切换命令就是CD。
最后激动人心的时刻到了,可以顺利生成一个pdf文件。
含页眉页脚信息,总共400多页的一个PDF文件电子书已经诞生。
有兴趣的读者们不妨将自己喜爱的网页专辑也做一份PDF文件,更方便查阅。之前一个错误的做法是追求PDF阅读器的精简,现在重新用回【福昕阅读器】(感谢上篇发文后读者朋友的推荐),老牌的免费PDF阅读软件,可以对文本类的PDF文件进行标注,做笔记。在此推荐大家使用。
同样地可以搜索关键词后,出现关键词清单。例如学习DAX过程中,想类似工具书一样查阅ALLSELECT函数的用法,全文搜索一下即可。比我们用搜索引擎来找强得多。学完还可以高亮做下笔记记录。
结语
在研究此篇的功能实现过程中,重新发现了dotNET的威力,不需要太羡慕python的网抓,在dotNET里仍然很够用。
同时在Windows环境下,没有什么比dotNET的开发更具生产力,python再牛,一遇到共享、交互也是个头痛事,但dotNET的桌面端开发,天然地最大优势。
在OFFICE环境下做的开发,优势就更明细了,其实本篇的功能,亦可完成搬到Excel环境中无痛执行,后期有空时再慢慢优化全过程。
html转PDF,带来了极大的便利性,内容在网络上,不是自己的资料,随时有可能被删除和不可访问(本篇所采集回来的DAX2中文译本,在版权方的施压下,肯定不能长久的,所以笔者未雨绸缪,先下载到本地来,呵呵)。