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

标签: python Ajax 动态页面 爬虫
14人阅读 评论(0) 收藏 举报
分类:

前言

上次我们讲到了破解一个简单的动态页面,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,欢迎前来吐槽。

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

查看评论

Python网络爬虫反爬破解策略实战

我们经常会写一 些网络爬虫,想必大家都会有一个感受,写爬虫虽然不难,但是反爬处理却很难,因为现在大部分的网站都有自己的反爬机制,所以我们要爬取这些数据会比较难。但是,每一种反爬机制其实我们都会有相应的...
  • DEL5202587
  • DEL5202587
  • 2017-09-21 17:42:39
  • 557

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

前言可能很多同学看到关于动态页面的反爬(比如基于Ajax的网页)第一反应就是selenium+headless browser,这个方法好是好,然而是基于真实的浏览器,虽然没有界面,但是也占用很多内存...
  • Fourierrr_
  • Fourierrr_
  • 2018-04-13 16:29:04
  • 17

用Python破解有道翻译反爬虫机制

破解有道翻译反爬虫机制web端的有道翻译,在之前是直接可以爬的。也就是说只要获取到了他的接口,你就可以肆无忌惮的使用他的接口进行翻译而不需要支付任何费用。那么自从有道翻译推出他的API服务的时候,就对...
  • huangyong1314
  • huangyong1314
  • 2017-07-18 12:53:12
  • 6093

Python反爬虫系列方法

如何反爬虫 cookies池,更换cookie意味着更换用户 proxies池,更换proxy意味着更换IP header中伪装浏览器,加入User-Agent及Referer 设置延迟,ti...
  • tengxing007
  • tengxing007
  • 2017-10-10 18:24:42
  • 329

如何应付重度反爬虫的网站

http://ae.yyuap.com/pages/viewpage.action?pageId=919721 摘要: 网站为什么要反爬虫 网站反爬虫的方...
  • oMingZi12345678
  • oMingZi12345678
  • 2016-05-05 17:55:28
  • 5975

<20>python学习笔记——爬虫2——反反爬

新手参考学习了http://cuiqingcai.com/3256.html,原版写的真的很好!感谢! 会遇到网站反爬虫策略下面几点: 1 / 限制IP访问频率,超过频率就断开连接。(这种方法解决...
  • xiexiecm
  • xiexiecm
  • 2017-02-28 22:31:14
  • 569

反网络爬虫策略(转自Javaeye)

有些爬虫真不是什么好东西: http://www.javaeye.com/topic/718874中国爬虫界:        http://www.javaeye.com/topic/53075  r...
  • dadoneo
  • dadoneo
  • 2010-11-08 11:08:00
  • 5042

Python爬虫之爬取动态页面数据

很多网站通常会用到Ajax和动态HTML技术,因而只是使用基于静态页面爬取的方法是行不通的。对于动态网站信息的爬取需要使用另外的一些方法。 先看看如何分辨网站时静态的还是动态的,正常而言含有“查看更多...
  • SKI_12
  • SKI_12
  • 2017-11-01 12:39:00
  • 2387

python scrapy爬取动态页面

preface:最近学习工作之外,有个朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明。以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用...
  • u010454729
  • u010454729
  • 2015-06-17 23:10:57
  • 6190

python3 网络爬虫(一)反爬虫之我见

环境:python3.4 win7 框架:scrapy首先,在此只讲解基于scrapy的种种案例或者方法, 为啥。。。因为我只会用这个框架,所以请大家莫见笑python3爬虫...
  • Fight_Huang
  • Fight_Huang
  • 2017-06-30 14:12:39
  • 1205
    个人资料
    等级:
    访问量: 207
    积分: 89
    排名: 147万+
    文章分类
    文章存档
    最新评论