爬取 pdf 电子书,节省毛爷爷_java

爬取 pdf 电子书,节省毛爷爷_java_02



前言

小编为了省钱,找到了一个电子书网站,“书香”,小编搜了搜,有 “书香清华”

​http://sxqh.chineseall.cn/org/show/1455​



但不是唯一的,还有 “书香北京师范大学珠海分校”,应该是以学校为后缀。

​http://bnuz.chineseall.cn/org/show/index​


爬取 pdf 电子书,节省毛爷爷_java_03


我们注册一个账号后,就准备开始爬取想要的电子书了。

这两个网站的结构差不多的。




爬取分析

小编选取了这个 url 作为爬取

​http://bnuz.chineseall.cn/org/show/index​

我们以爬取 “Android移动开发基础案例教程” 为例


爬取 pdf 电子书,节省毛爷爷_java_04


打开开发者工具,翻几页发现是动态的加载的,且 url 如下



爬取 pdf 电子书,节省毛爷爷_java_05


我们看到 url 中有一个参数 t,说明请求时,我们需要构造出这个参数 t,拼接 url 去请求才可以



爬取 pdf 电子书,节省毛爷爷_java_06


目测可能是时间戳,我们用 time.time() 即可生成时间戳



爬取 pdf 电子书,节省毛爷爷_java_07


与参数 t 对比,python 代码生成的是有小数的且取的长度不一样,乘以 1000 再使用 int() 函数可以使其与参数 t 长度一样,但 int() 是直接舍弃小数点后面的,我们不知道 t 是不是四舍五入,所以为了保证一次性请求成功,小编直接执行生成参数 t 的 js 代码,生成对应的参数 t,就绝对不会错。

小编写好了 js 生成时间戳的代码如下



爬取 pdf 电子书,节省毛爷爷_java_08


在 python 中使用 execjs 执行 js 代码



爬取 pdf 电子书,节省毛爷爷_java_09


这样我们爬取请求必要的参数就解决了。

其他的就直接按照爬虫逻辑写下来就好了。

注意 pdf 只能浏览前十页,想要浏览全部,需要登录,在请求头带上 cookie。




pdf 合并

爬取下来后,是一张张的 pdf 文件,文件名是以页码命名的,我们需要把全部合并为一份 pdf,代码如下:



爬取 pdf 电子书,节省毛爷爷_java_10


合并后的结果如下:



爬取 pdf 电子书,节省毛爷爷_java_11


合并完成后,我们就获得了一本电子书。

自己丰衣足食感觉真好,可以省钱买皮肤了。