Python爬虫 | 猿人学第四题

今天讲猿人学第四题

地址:

http://match.yuanrenxue.com/match/4

目录:

1、环境
2、分析请求
3、实现爬取

1、环境

Python3.7、requests、lxml

2、分析请求

这道题的题目叫“雪碧图、样式干扰”,一开始我还没发现这些数字都是图片,看到返回的数据才知道这些数字都是一个个照片组成。
Python爬虫 | 猿人学第四题_第1张图片图2-1

最开始想到的方法是用ocr直接识别,但是这个网站禁用ocr,那肯定有其他方法,经过多次验证后发现同意数字的图片对应的base64编码是一样的,这样的话就用字典映射就好了。

先请求一次看看返回的json中的info内容是什么。
Python爬虫 | 猿人学第四题_第2张图片图2-2

返回的是一段HTML代码,td标签有10正好匹配10个数字,那第一页应该是39张照片,对应39个img标签。
Python爬虫 | 猿人学第四题_第3张图片图2-3

但是返回了79个img标签,这是怎么回事呀?
打开开发者工具进入Elements,可以看到最后一个数字8898只有4个数字但是有6个img标签。

Python爬虫 | 猿人学第四题_第4张图片图2-4

仔细观察可以发现有些img标签的属性是display: none,这就是不展示的意思。这里还有一个坑,展示的明明是8898但是HTML的顺序是8889,这个就要观察img标签中的left属性。
8898如果不打乱的话应该是每个照片的left都是0px,现在HTML展示的8889的left,是11.5、23.0、-23.0、-11.5,翻译过来的话就是第一个数向右偏移1位数、第二个数向右偏移2位数、第三个数向左偏移2位数、第四个数向左偏移1位数。
Python爬虫 | 猿人学第四题_第5张图片图2-5

8898,这个数字太多相同的数字了可能就不好理解换一个数字来解释,如图2-5页面展示的是3807,HTML展示的是顺序是3087,对应的left是0px、11.5 px、-11.5 px、0 px,3对应的是0px所以不用移,0对应的是11.5px所以应该向右偏移一位数,8对应的是-11.5px所以向左偏移一位数,最后一位7对应的是0不用偏移,最后得出3807,这些数都是以自身为原点。
数字排序问题解决了,那display: none该如何判断,查看数据接口呗。
图2-6

Python爬虫 | 猿人学第四题_第6张图片 图2-7

Python爬虫 | 猿人学第四题_第7张图片图2-8

var j_key = '.' + hex_md5(btoa(data.key + data.value).replace(/=/g, ''));
$(j_key).css('display', 'none');

data就是请求返回的data,如图2-8,btoa()是JavaScript的base64编码方法,内容就是data中的key与value相加,base64编码完后将=号替换为空,最后用MD5加密。
查看返回的数据中的info内容。
Python爬虫 | 猿人学第四题_第8张图片图2-9

每个img标签内的有一个class属性这个一看就大概知道是MD5加密。
Python爬虫 | 猿人学第四题_第9张图片图2-10

如图2-10,先查看返回了多少张照片呢,再查查MD5加密出来的密文有多少条。
Python爬虫 | 猿人学第四题_第10张图片
图2-11

27条减去一条,65-26=39,刚符合第一页有39个数字,那估计加密处理的密文就是代表不展示,经过过次测试果然是这样。
分析到这里就已经结束了,赶紧动手试试看吧,试完可以关注我公众号【python爬虫与数据分析】回复【猿人学第四题

你可能感兴趣的:(爬虫,逆向,python,爬虫)