郑重声明:本项目的全部代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,由于滥用技术产生的风险与本人无关。前端
这篇文章是公众号《云爬虫技术研究笔记》的《2019年底逆向复习系列》的第三篇:《百度指数Data加密逆向破解》python
本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,你们能够Fork
一波。 git
你们若是是作行业分析或者用户画像的话,会常常用到XX指数
这个东西,相似于百度指数
,微信指数
,微博指数
等等,这些指数用以反映不一样关键词在过去一段时间里的“用户关注度”和“媒体关注度”,反馈面广、覆盖时间长。咱们此次分析的是百度指数
,主要是由于它返回的数据是加密的,咱们看看如何来分析得到破解以后的数据。 github
咱们首先打开百度指数的页面,打开开发者工具->从新选择日期,搜索->查看网络请求。 算法
xhr顺序:index->ptbk->checkapi
数据估计是从index这个api返回的,咱们跟进这个请求查看。 bash
uniqid
和
data
参数,
uniqid
咱们暂时不知道有什么意义,
data
参数是加密的,咱们须要获取它的解密逻辑。
已知如今这个index请求是个xhr请求,咱们就给这个请求下个xhr断点,如图 微信
/api/Searchapi/index
,咱们打下断点以后根据以前的逻辑,重选时间,再次请求
n.send(t.getBody())
这里,咱们能够看到右侧有
Call stack
调用栈列表,说明在达到这个断点以前调用了哪些函数和对象,咱们顺着这个调用栈一个个往回追溯。
e.chartData
的结果很像咱们刚才看到的index接口返回的数据,从代码上看,应该是首先初始化,而后对部分的数据进行加密,加密的方法是
P.a.decrypt
,那么咱们就对这个方法下个断点跟进去
decrypt
,里面的代码没有额外的混淆,很好理解逻辑,这个方法有两个参数,
e
和
t
,下面咱们看看这两个参数怎么得到的
从decrypt的逻辑上看,这两个参数应该是秘钥和秘文网络
uniqid
参数
uniqid
参数,发现这个参数是咱们一开始请求的index那个接口中返回的一个字段的数据。咱们再重头理清一下思路,根据网络请求的顺序,咱们大体能够理出这样一个请求的思路: 框架
到此为止,咱们分析好了整个算法的流程,下面咱们重写decrypt
算法。
# Js版本
decrypt: function(t, e) {
for (var n = t.split(""), i = e.split(""), a = {}, r = [], o = 0; o < n.length / 2; o++)
a[n[o]] = n[n.length / 2 + o];
for (var s = 0; s < e.length; s++)
r.push(a[i[s]]);
return r.join("")
},
复制代码
算法比较简单,咱们改写成Python
版本
# python版本
def decrypt(t: str, e: str) -> str:
n, i, a, result = list(t), list(e), {}, []
ln = int(len(n)/2)
start, end = n[ln:], n[:ln]
a = dict(zip(end, start))
return ''.join([a[j] for j in e])
复制代码
思路如上面的流程图所示
有了上面这个分析流程,咱们就能够开始Coding
了,如下是decrypt
解密的流程。
从这个复习的案例咱们能够总结下思路:
network
搜搜是否是先后文中返回的多年反爬虫破解经验,AKA“逆向小学生”,沉迷数据分析和黑客增加不能自拔,虚名有CSDN博客专家和华为云享专家。
呕心沥血从浩瀚的资料中整理了独家的“私藏资料”,公众号内回复“私藏资料”便可领取爬虫高级逆向教学视频以及多平台的中文数据集