Python爬虫之Js逆向案例(2)-知乎搜索

声明:某乎加密逆向分析仅用于研究和学习

大家好,今天继续分享关于某乎关键词搜索接口为案例的Js逆向实战。如果你是一名新手,而且还没有来得及看上一篇《Python爬虫之Js逆向案例(1)-某乎搜索》的话,建议你先去看完再来看这一篇,因为里面有很多有利于新手实操的高能总结,还包含了一些js调试技巧,上一篇里中总结的内容在后续案例中不会再那么详细的讲了,不然有些冗余,见谅哈!;

今天的内容是在昨天的基础上继续深入。通常情况下,我们的爬虫肯定不只是取第一页的数据,例如,我们需要获取前20页的数据,该怎么办呢?下面演示,使用爬虫获取翻页数据;

下面会进行以下几步进行分析(下方演示过程全部使用chrome浏览器);

  1. 锁定关键字段;
  2. 破解关键字段;
  3. python爬虫结果演示;

一.锁定关键字段

昨天我们已经定位到搜索接口,所以今天的获取翻页数据就是在昨天的接口上继续处理。

根据昨天的“高能总结”,锁定关键字段只需要比对连续几次接口请求时的不同点即可,对比之后,很容易得到答案:

  1. handers里的x-zse-96,这个我们上一篇已经破解了,扣好的加密文件直接用即可得到;
  2. 请求参数上多了2个字段,变了2个字段,如下图:

上拉刷新后第二页的请求参数里面多的字段:search_hash_id、vertical_info,第二次之后这俩字段都一样;
第一页基础上改变的字段:lc_idx、offset,这俩字段每次请求都相同;

综上:今天只需要解出search_hash_id的值就行了。老方法,直接在接口上找到字段search_hash_idjs文件出现的位置,如下图:

python 爬虫教程 逆向 爬虫逆向js_爬虫

定睛一看,哦呵!就两个地方出现了,这是不是有点简单呀???跑偏了?出现这种情况不要慌,仔细分析一下,这两个地方既然都不是给search_hash_id赋值的,那说明什么?说明这个东西看似一个md5加密的值,但又不是在前端加密完成的值,那又能来自哪呢?

高能总结:
技巧:如果关键值在前端没有出现赋值语句,那只能来自三种地方:

  1. 该值在前端某个地方写死的,是个定植一直都不变;
  2. 来自cookies里取的;
  3. 接口返回的,直接根据这个键名在某个地方取出来的,比如obj.a.b[‘XXX’];

二.破解关键字段;

根据上面的情况,我们一个个的排查,第一种情况能直接排除,因为换个关键词再翻页的话,这个值就变了,说明这里并不是前端写死的;第二种情况,我们翻看cookies发现里面并没有这个值;只剩下第三种情况了,那我们就在接口上搜索一下呗,如下图:

python 爬虫教程 逆向 爬虫逆向js_字段_02

还真有命中项,这个关键字我只请求了三次,这个关键字在三次接口里既然都有出现,那第一次出现的地方不就是后面接口的来源了吗?我们点开第一个,然后在右下方再搜索,如下图:

python 爬虫教程 逆向 爬虫逆向js_python_03

我们发现上面分析到的值这里貌似都能找到,所以翻页的时候,只需要把第一次的这个值保存下来,拼接到url参数里就行了呗,这次的内容是不是比上一篇的要简单多了;

这里再分析一个小技巧,如何快速定位请求头里的字段哪些是关键字段呢?

python 爬虫教程 逆向 爬虫逆向js_python 爬虫教程 逆向_04

高能总结:
技巧:

  1. 如上图,在接口上右键,拷贝当前接口的curl版,放在编辑器中的控制台去请求一下,在能请求通的前提下,每次都减少一些字段,直到不能再减少为止;
  2. 上面的的方式对curl来说能找到少请求头参数,但是如果用python的request包请求的话,可能略有字段差异,大家试一下就知道了;

三.python爬虫结果演示

在上一篇基础上微改,抓取请求前三页数据就很轻松了吧:

python 爬虫教程 逆向 爬虫逆向js_爬虫_05