今天讲猿人学第三题,这道题为难度为简单,但说真的我只做得出更新前的,目前的版本我一开始是做不出来的,我也是依据大佬的讲解才懂的。
地址:
http://match.yuanrenxue.com/match/3
目录:
1、环境
2、分析请求
3、实现爬取
1、环境
Python3.7、requests
2、分析网站
先找到数据接口
很容易通过测试就知道是cookie加密(先不带cookie请求一次就知道),关于cookie加密的类型我之前已经讲过几次了这里就不讲了可以看猿人学第二题
这题的cookie为服务器返回的,如图2-2每次请求数据接口前都会请求一次logo这个接口,那这就简单了,用session保持会话它怎么请求我们就怎么请求就好了。
这是最开始的版本的解决方案,但是现在不行了,解决方案看第三节吧。
3、代码实现
- 1、有些反爬采用的是检测headers的顺序,且不能使用headers=headers进行赋值,原因为get/post会改变顺序,所以只能使用自定义的items方法
- 2、之所以定义为items方法,是因为系统在获取headers值的时候会自动调用items方法,所以需要自定义一个类,实例化的时候自动调用items方法
- 3、headers中的属性值的顺序需要按F12中Headers标签的Request Headers中选择view source,整个复制过来即可
- 4、items的返回值必须为元组格式,get/post会自动转成字典格式的headers
import requests
from collections import Counter
class MyHeaders(object):
def items(self):
return (('Host', 'match.yuanrenxue.com'),
('Pragma', 'no-cache'),
('Connection', 'keep-alive'),
('Accept', 'application/json, text/javascript, */*; q=0.01'),
('User-Agent', 'yuanrenxue.project'),
('X-Requested-With', 'XMLHttpRequest'),
('Referer', 'http://match.yuanrenxue.com/match/3'),
('Origin', 'http://match.yuanrenxue.com'),
('Cache-Control', 'no-cache'),
('Accept-Encoding', 'gzip, deflate'),
('Accept-Language', 'zh-CN,zh;q=0.9,en;q=0.8'),)
def get_json(page):
logo_url = "http://match.yuanrenxue.com/logo"
api_url = "http://match.yuanrenxue.com/api/match/3?page={}".format(page)
resp = requests.get(logo_url, headers=MyHeaders())
response = requests.get(api_url, cookies=resp.cookies.get_dict(), headers=MyHeaders())
return response.json()
if __name__ == '__main__':
data_list = []
for page in range(1, 6):
json = get_json(page)
data = json.get('data')
for d in data:
data_list.append(d['value'])
top_1 = Counter(data_list).most_common(1)[0]
print("出现频率最高的申请号:", top_1[0])