Python反爬之破解动态页面(二)

前言

上次我们讲到了破解一个简单的动态页面,post的元素是可以直接在源码里边找到的,然而大多数的时候,想服务器post的数据是需要经过复杂的加密逻辑生成的。这次我们就来分析一个经过加密的算法生成数据的页面。

正文

这次选取的目标是小说网站书旗,不过被阿里收购后,已经叫阿里文学了。


我们到书库里边用文字的形式查看一下书籍列表,这就是我们今天的分析对象了,如何获取这个列表的信息。


首先右键查看一下页面源码,果然是找不到这些信息的。于是F12,转到network界面,按照上一篇文章介绍的思路,很容易就找到了这样一个XHR,url结尾是“?r=pcapi/pcbook/librarysearch”,记住这个值我们等下会用到:


正好就是我们所需要的内容的json格式,只要获得了这些信息,书籍列表也就好说了。我们继续查看一下headers,发现是用post形式传送的数据,参数有四个:


其中同样前三个都好说,但是第四个sign显然是一个经过加密后产生的结果,而且刷新一下页面,这个sign的值还会变,所以直接复制下来作为参数肯定不行。我们必须找到对应的加密逻辑反推出来这个值。一般加密逻辑是藏在js当中的,也会有一些更复杂的情况,比如藏在页面的flash中的,比如许多直播网站的视频rtmp地址,这里我们先不讨论。我们以sign为关键字在js中搜索,很快,在第一个js中我们就找到了很可疑的东西,但是这个页面不好看,是js混淆后的结果,我们用Chrome自带的工具pretty print一下,按下那个花括号{}。


然后这个js代码可读性就大大提高了,我们分析一下,页面中sign出现了三次,分别对应了三个Ajax请求,分别对应三个接口,加密算法都差不多,都是pageID+时间戳+key的md5算法,不过其中两个key是public.pagekey,另一个key是public.bookkey。

-----------------------------------sign图一-----------------------

-----------------------------------sign图二-----------------------


-----------------------------------sign图三-----------------------


这个时候我们要找到我们所需要的前边要记住的那个url对应的接口,“?r=pcapi/pcbook/librarysearch”,在js的最开头发现了这个Ajax请求,但是没找到加密算法?不对啊,明明是三个Ajax,三个sign应该一一对应呀,怎么会没有呢?我们再仔细一分析,原来你这么狡猾,把算法与Ajax分开写了,差了好远。其实就是这个function t(){}

然后我们看看上边第二个sign的图,会发现刚刚下边倒数第二行有function t的调用,参数是o,o刚好是那个sign的出来的一大堆数据。那么我们就可以确定了,书籍列表页面Ajax请求的加密算法是

sign: md5(e + n + public.timestamp + public.bookKey)

那么接下来就是分析bookkey了,我们以bookkey为关键字,在js中继续搜索。很容易就在第二个js里边找到了,顺带还发现了pagekey。


至此,一切逻辑清楚了。整个任务过程是这样:

  • 取合适的page和pageSize,默认是1和18,再获取时间戳。
  • 由bookkey和以上三个参数利用md5算法得出所需的sign
  • 以post方式向接口发送四个参数。获得返回的书籍列表json
  • 分析返回的json,提取数据,数据存储,数据分析。

既然逻辑清楚了,那么代码也手到擒来:

# -*- coding: utf-8 -*-
import requests
from hashlib import md5
import time
import json

# sign: md5(t + public.timestamp + public.pageKey)
pageKey = "aaf50af46621010e7fbeda2b1fe8ef8e"
bookKey = "f2850e634f85f485d719314ae3cfe252"
# sign: md5(page + pagesize + public.timestamp + public.bookKey)
def get_sign(page,pagesize,timestamp,key=bookKey):
    m=md5()
    m.update((str(page)+str(pagesize)+str(timestamp)+key).encode("utf-8"))
    return m.hexdigest()


def get_json(page,pagesize):
    timestamp=int(time.time())
    url="https://ognv1.sqreader.com/index.php?r=pcapi/pcbook/librarysearch"
    sign = get_sign(page,pagesize,timestamp)
    param={
        'page' : page,
        'pageSize' : pagesize,
        'timestamp' : timestamp,
        'sign' : sign,
    }

    response=requests.post(url=url,data=param)
    jsonObj = json.loads(response.text)
    return jsonObj

print(get_json(1,18))

输出结果:


由于重在分析思路,所以博主只实现了前3步,后边都是常规编程,大家自由发挥就好~

结束语

这是系列文章第二篇,分析了一个js处理的md5加密算法,爬取了一个由Ajax产生的动态页面。都已经看到这里了,不给博主一个赞嘛~

源码已上传github,喜欢的朋友求个star,欢迎前来吐槽。

后续还会继续更新更复杂的加密过程的分析方法文章,敬请关注!

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页