猿人学 — 第1届第13题(解题思路附源码)
-
发现在翻页过程中,只要中途有几秒的间隔,那么就会显示拉取数据失败,然后网页重新加载回到刚进来显示的第一页的情况
-
重新加载时,会发送一系列的请求,发现其中向地址
https://match.yuanrenxue.cn/match/13
发送一前一后两个请求,
在前一个请求中,发现响应头中有Set-Cookie
,因此猜测若想访问各个页面则需要先访问这个请求获取sessionid
-
另外还发现,后一个请求中携带的
Cookie
中的yuanrenxue_cookie
与前一个请求中携带的不一样,并且在目标页面访问过程中
携带的yuanrenxue_cookie
和后一个请求中携带的是一样的
-
那么后面请求中的yuanrenxue_cookie是从哪里来的呢?这个Cookie值的改变发生在第一次向
https//match.yuanrenxue.cn/match/13
请求后,
但是在chrome中又没有看到这个请求的返回值,猜想是不是返回值在chrome中不支持显示,因此用Fildder抓包再看一看各个请求的具体情况,验证一下猜想
-
果然发现这个请求其实是有返回值的,我们把关键信息放入Console面板一输出再比对请求,发现这就是我们想要的
yuanrenxue_cookie
-
源码如下
import re import requests # 创建会话并设置请求头和cookie obj = requests.session() obj.headers={ 'Referer':'https://match.yuanrenxue.cn/list', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36', } # 设置成自己的sessionid obj.cookies.set('sessionid','k0tkqbv28g7ubtjyr1e5a3mjcyzz98uf') # 获取更新后的yuanrenxue_cookie值 res = obj.get(url='https://match.yuanrenxue.cn/match/13') cookie_list = eval(re.findall('\(.*\)',res.text)[0]).split('=') obj.cookies.update( {cookie_list[0]:cookie_list[1]} ) # 访问具体页面时一定要注意先更新请求头信息中的Referer obj.headers.update({'Referer':'https://match.yuanrenxue.cn/match/13'}) # 向各个页面发送请求并获取数据 total_value = 0 for pid in range(1,6): res = obj.get(url=f'https://match.yuanrenxue.cn/api/match/13?page={pid}') data = res.json()['data'] print(f"第{pid}页数据:{data}") for item in data: total_value += int(item['value']) print(f"前5页数字总和:{total_value}")
-
运行结果
-
笔者为刚接触逆向的小白,若上面有错误、不合理和值得优化的地方,欢迎各位大佬批评指正!