一、背景
目标链接:http://index.baidu.com/v2/index.html#/ ,百度指数,搜索关键字的搜索指数,可以指定时间区间和地域
二、过程
1、确定加密参数
搜索关键字,需要进行登录才可以进行搜索,先进行登录,然后搜索抓包,接口:http://index.baidu.com/api/SearchApi/index?area=0&word=爱奇艺奔跑吧&startDate=2019-04-26&endDate=2019-05-25 ,url中没有加密参数,复制url和请求头,可以正常返回数据,但是返回的数据,有部分数据,进行了加密
同时,因为必须登录才可以抓取数据,经测试,cookie中的“BDUSS”字段,对应着登录状态,请求时需要携带该参数
2、确定加密函数
一开始先在页面上搜索关键字,找了好几个js文件,但是没有发现对应的加密函数,这时我想着可以看看手机端web页面的,然后发现结果也是加密的
虽然加密,但是有对应关键字,就进行全局搜索,终于发现了一个函数
三个加密的数据都在这个函数中,可以确定该函数就是加密函数
3、处理js函数
- 确定参数b: 通过chrome的断点调试,发现有个参数b,该参数每次的值都是不一样的,并且全局搜索并没有发现该值,一开始以为是js加密生成的,但是找了好几个js文件依旧没有找到,然后想着会不会请求生成的,就查了下动态请求,在数据接口的下面发现了一个接口:https://index.baidu.com/Interface/api/ptbk?uniqid=5cea79ab25c3b7.89038226 , 请求该接口返回了个数据,和参数b的值比对了下,发现是一样的
- 实现加密过程
def decrypt_baidu_index_response(keys, encrypt_data):
"""百度指数返回结果解密"""
w_data = {}
for index in range(len(keys)//2):
w_data[keys[index]] = keys[len(keys)//2 + index]
decrypt_data = ''
for i in range(len(encrypt_data)):
decrypt_data += w_data[encrypt_data[i]]
return decrypt_data
重新请求电脑端web页面,同样可以解密返回结果
三、总结
- 破解加密问题时,PC端web页面的加密难以处理时,可以尝试从手机端的web页面进行突破
- 完整代码见:https://github.com/HLFYY/spiders/blob/master/spiders/baidu_index.py
转载自原文链接, 如需删除请联系管理员。
原文链接:百度指数-返回结果解密,转载请注明来源!