抓取机票价格,计算平均值。
先说一下自己的思路,价格源码没有毫无疑问肯定是向服务器发送了一个请求,然后返回回来价格列表,我们只需要将返回的数据,取出我们所需要的价格计算即可。
首先,打开开发者工具,进行抓包。
debug直接跳过就可以不影响我们后面的操作。
刷新,通过简单的分析我们看到了这条请求,看一下返回的数据。
是我们需要的价格,看一下这个链接:http://match.yuanrenxue.com/api/match/1?m=42532d8cc5d339a5b8a434a7c282e53d%E4%B8%A81609426851
后面参数m有一个简单的加密,经验告诉我去解码看一下这条链接。
%E4%B8%A8
是符号“|”,多次抓包发现每次都携带这个符号,开发者工具中搜索这个符号。
可以看到只有一条包含这个符号,进入js文件分析一下。
这是一整行代码,观察分析起来非常不方便,了解到notepad++里面自带插件jstool对它进行格式化,之后进行观察。
这样观察起来就方便很多。
找到了m所在位置。
var m = oo0O0(timestamp.toString()) + window.f;
oo0O0()猜测是一个函数
timestamp.tostring()时间戳转字符串
window.f 窗口调用f,f是啥玩意....我也不知道,先不管。先分析都是圈圈的那个函数。
搜素oo0O0这个函数 找到了两处 一处是function oo0O0() 另外一处就是我们m调用的这个函数
花里胡哨的返回了一个空.....
var m = window.f;
源码中搜索window.f
源码中没有找到这个window.f具体是什么东西....搜索方式可能不对,但是肯定不可能单独搜索f不然太多了。。
oo0O0()返回一个空,多少有点不太正常,我们回去重新看一下,发现在返回空上面那一行出现了
eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
eval中有一个函数atob()
atob() 方法用于解码使用 base-64 编码的字符串。
我们将atob(window[’b‘])在console里面跑一下
稍微有点经验都可以看出来这是md5加密的算法
md5算法的最后我们看到了window.f ,window.f就是将“mwqqppz”进行md5加密之后的值,mwqqppz这是啥玩意....我也不知道
将eval函数后面的J('0x0', ']dQW')扔进console看一下。
j是在oo0O0函数里面定义的,我们先运行oo0O0函数的代码定义一下这个J 然后再去跑这个J('0x0', ']dQW')
我们看到window.f里面进行md5计算的字符串出来了 是这个代码J('0x1', 'GTu!')
'\x27' + mw + '\x27'
这个为什么会找不出来值呢
我们可以看到'\x27'就是个单引号 至于mw是OOOOOO函数传进来的参数,
我们知道eval函数里面各种东西的意思之后,我们把我们取出来的值替换观察一下。
eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
eval(atob(window['b'])['replace']('mwqqppz', 'mw'
));
这个的大概意思就是....将atob(window['b']里面的'mwqqppz'文本替换为 'mw'
,也就是替换成传入的参数--时间戳。
我们捋一下思路看一下,
var timestamp = Date.parse(new Date()) + 100000000;
var m = oo0O0(timestamp.toString()) + window.f;
var m = window.f
var m =hex_md5(mwqqppz)
var m = hex_md5(mv)
var m = hex_md5(timestamp)
放进调试工具调试看看。
我们的初始链接:http://match.yuanrenxue.com/api/match/1?m=42532d8cc5d339a5b8a434a7c282e53d%E4%B8%A81609426851
带入我们刚才的时间戳验证一下 经过计算 m的值得到了。
剩下的就是写代码了,用e 的话可能5分钟可以搞定,但是为了练习自己的python用python尝试写一下看看。
根据了解python可以用过execjs来执行js文件,我们讲创建js文件然后调用这个js得到加密后的数据使用即可。
计算成功python代码不做解释代码如下:
import requests
import execjs
import time
def Get_md5_value():
#读取JS文件
with open('JS/JS.js',encoding='utf-8',mode='r') as f:
JSdata = f.read()
#加载JS文件,通过call()传入我们需要调用的函数
psd = execjs.compile(JSdata).call('get_cipher')
psd = psd.replace('丨','%E4%B8%A8')
return psd
def Get_data(page_number,md5):
url = 'http://match.yuanrenxue.com/api/match/1?page='+str(page_number)+'&m='+md5
headers = {
'Host': 'match.yuanrenxue.com',
'Referer': 'http://match.yuanrenxue.com/match/1',
'User-Agent': 'yuanrenxue.project',
}
res = requests.get(url=url,headers=headers)
return res.json()
if __name__ == '__main__':
sum_num = 0
index_number = 0
for page_number in range(1,6):
info = Get_data(page_number,Get_md5_value())
price_list = [i['value'] for i in info['data']]
print(f'第{page_number}的价格表{price_list}')
sum_num += sum(price_list)
index_number += len(price_list)
time.sleep(1)
average_price = sum_num/index_number
print(f'机票的平均价格为{average_price}')
注:借鉴了大佬思路.