猿⼈学第⼀届爬⾍⽐赛第四题(雪碧图、样式⼲扰)
猿⼈学第⼀届爬⾍⽐赛第四题(雪碧图、样式⼲扰)
概况
本题与前⾯⼏题要求⼀致,依旧是采集5页的全部数字,计算加和并提交结果。
可以发现,数据是以图⽚形式展⽰,并且第四第五页是⽆法通过页⾯查看的,
查看⽹页源码发现数据并不在源码中,抓包分析发现请求了两个⽂件,其中logininfo返回了登录信息,⽂件4返回了⼀串json数据。
拷贝其中的info信息,在浏览器中执⾏,发现info包含的是渲染图⽚的html代码,与题⽬第⼀页的数据⽐较,可以发现这些图⽚的顺序与⽹页展⽰的顺序不同,数量也不⼀致。
通过对⽹页的元素分析可以发现,⽹页通过display:none和left对某些图⽚进⾏了隐藏和移动。
通过initiator溯源请求,
可以看到,此处对j_key通过css进⾏了隐藏,⽽j_key=’.’ + hex_md5(btoa(data.key + data.value).replace(/=/g, ‘’));。
前⾯抓包时已经知道key和value都来⾃json数据,此处通过btoa函数进⾏了base64加密,然后再将=替换成空字符串后进⾏了md5加密,可以通过浏览器打印分析⼀下j_key.
得到了⼀个32位的字符,在info信息中进⾏匹配,发现有23处匹配到了⼀样的字符.
仔细研究后发现,在第⼀页出现了39张数字图⽚,⽽info中包含了62张图⽚,⽽62-39刚好等于23,所以这23张图⽚应该就是⽹页隐藏的图⽚。
刷新⼏次⽹页发现,每次的j_key都不相同,所以要动态⽣成。通过python构造如下:
def get_res(page):
url ='match.yuanrenxue/api/match/4?page='+str(page)
res = (url, headers=headers).json()
k = res['key']
v = res['value']
pat ='<td>(.*?)</td>'
td_list = repile(pat).findall(res['info'])
return k, v, td_list
def make_js(k, v, td_list):
kv = k + v
b64_kv = debytes(de('utf-8'))).decode('utf-8')
b64_kv = b64_kv[:-2]
hash= hashlib.md5()
hash.update(bytes(b64_kv, encoding='utf-8'))
a =hash.hexdigest()
获取到j_key后就可以筛选info信息了,代码如下:
def make_js(k, v, td_list):
kv = k + v
b64_kv = debytes(de('utf-8'))).decode('utf-8')
b64_kv = b64_kv[:-2]
hash= hashlib.md5()
hash.update(bytes(b64_kv, encoding='utf-8'))
a =hash.hexdigest()
pat ='<img src=".*?">'
img_list2 =[[],[],[],[],[],[],[],[],[],[]]js获取json的key和value
for i in range(0,len(td_list)):
img_list = repile(pat).findall(td_list[i])
# print(img_list)
for j in range(0,len(img_list)):
# print(img_list[j])
if a in img_list[j]:
pass
else:
img_list2[i].append(img_list[j])
return img_list2
得到展⽰的图⽚信息后就要进⾏排序,代码如下:
def get_num(l):
num =[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] for i in range(0,len(l)):
# print(l[i]) #⽆问题
for j in range(0,len(l[i])):#遍历4/3个数
if''in l[i][j]:
num[i][j]= l[i][j]
elif''in l[i][j]:
num[i][j+1]= l[i][j]
elif''in l[i][j]:
num[i][j+2]= l[i][j]
elif''in l[i][j]:
num[i][j+3]= l[i][j]
elif''in l[i][j]:
num[i][j-1]= l[i][j]
elif''in l[i][j]:
num[i][j-2]= l[i][j]
elif''in l[i][j]:
num[i][j-3]= l[i][j]
elif''in l[i][j]:
num[i][j]= l[i][j]
elif''in l[i][j]:
num[i][j+2]= l[i][j]
elif''in l[i][j]:
num[i][j-2]= l[i][j]
可以看到图⽚已经排序完毕,接下来就是把图⽚转换成数字了。
(待续)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。