MENU

记录一次爬虫笔记(二)

January 28, 2021 • Read: 196 • Python

上一章我们讲了我是如何获取下载链接的,但是道高一尺魔高一丈,道客巴巴的程序猿的反爬虫技术还是相当厉害的,为什么?你试试爬取一些其他的文件,是不是会玄学出错?为什么?

这个文档你肯定下载不下来

答案很简单,因为他们拥有多种渲染文档的方式:

  1. 通过最简单的gif方式渲染
  2. 需要访问某个接口获取一张完整图片+通过最简单的gif方式渲染
  3. 需要访问某个接口获取四张图片合并成一张

我们上一章只讲了第一种,理论上第一种能解决大部分的文档(道客中的文档获取方式是随机的,也就是说随着时间的改变,第一种和第三种会交换,离谱吧),所以使用第一种守株待兔就能下载很多文档,但是当文档体积过大,这个方法就不能凑效了,我们就只能使用第二种方法

凑巧的是,第二种方法也是被写在mreading.js里的,大致的思路就是:

获取接口的数据 -> 当请求的数量超过十个的时候,前十个用第一种方法,后面的就要去访问另外的接口了

关键代码

它构造了一个新的链接,用于请求十个后面的文档,内容其实和上一章差不多,就最后的多一个hour变量和一个width变量,width变量直接填1024,这个好像是写死的,hour变量就是请求数据时的北京时间(取小时部分),比如现在17:40,那么我们的hour就是17

但是当你构造好请求的时候,你却发现,请求不了,没有返回的数据!这是怎么回事?构造的链接错了?还是说这里代码写错了?

其实不是,你会发现一件神奇的事情,当你在浏览器刷新一下当前需要爬取的页面的数据,再去请求文档的时候,这个文档居然神奇的被请求到了!这是怎么回事???

其实很简单,秘密就藏在和他一起发出的另一个请求里面

当访问超过十页以后的内容时,浏览器会发送一个看似没有意义的get请求,

image-20210128174721256

返回数据:

image-20210128174737428

我最开始忽略了这个请求,知道无法请求到文档数据的时候才开始重视它,它的作用很简单:就是访问这个端口,让后台的服务器提前准备好这篇文档,如果准备好了,就返回上面的这种返回值,反之就返回e=0的一个数据,为了获取这个数据,我们理应先访问这个链接,当e=0以后,再访问获取文档的链接

那这段逻辑有没有再mreading.js中体现出来呢?当然有!

mreading中的代码

参照mreading.js即可轻易写出python爬虫代码

Archives Tip
QR Code for this page
Tipping QR Code