最近公司需要旅行数据的抓取,研究了半天,发现首页很容易,没有任何限制,那就写程序吧,详情页发现不行解析不出来,抓取下发现是加速乐,真是麻烦,查了些资料,发现页面每个模块都是一个接口,接口有个_sn知不知道哪来的,看着不长,不是base64,搞不清楚啊。慢慢追吧(查到一个朋友些的方法,但是不是一个接口,搞不清楚代码的参数顺序,所以发现不通用)。
打断电,追,cA(cv, l, c, x); 还能看到明文。
最核心的就是断点的位置,进入正确的断电能看到一个大的数组。
一步步追踪能看到一个熟悉的字符了。
这个js里的变量名和调用的变量都是这个数组里的。慢慢研究,慢慢追能看到 加密前的字符串
追到最后能看到加密后的字符串,但是长度不够,后面获取一个 2,多少
运行完发现和前面的内容类似了。
最后这块可以还原成python的代码,但是重点在于 data字符串的顺序。
import hashlib
def get_params(page=1, Mddid=None):
"""
获取params参数
:param page: 页码
:param iMddid: 景点id
:return: params参数
"""
# 创建一个md5对象
m = hashlib.md5()
# 将字典转换为JSON格式的字符串并传入md5对象
ts = str(int(time.time() * 1000))
data = {
'_ts':str(int(time.time() * 1000)),
'mddid':f'{Mddid}',
'page':f'{page}',
'type':'2',
}
salt = "c9d6618dbc657b41a66eb0af952906f1"
u = (json.dumps(data, separators=(',', ':')) + salt).encode()
m.update(u)
# 获取md5加密后的十六进制字符串
data.update({"_sn": m.hexdigest()[2:12]})
return data
有问题可以一起谈论
微信号:liu_yue_yang