猿人学 — 第1届第17题
-
根据题目“天杀的Http2.0”大概知道,请求的协议应该遵照的是Http2.0协议,并且目标网站专门对此进行了检测,在Network面板中右键表头,勾选Protocol
-
果不其然,一堆请求都是遵照Http2.0协议。而
urllib
和request
只支持HTTP/1.1协议访问,因此面对强制使用HTTP/2.0协议访问的网站无法爬取数据,所以这里选择支持HTTP/2.0协议访问的httpx
-
继续抓包分析可知,
http://match.yuanrenxue.cn/match/17
请求的响应体中返回了Set-Cookie
,设置了sessionid
。可知必须先请求对其请求获取sessionid
后再进行后续请求 -
源码如下
import httpx # httpx和requests的很多API存在相似之处;httpx.Client()可以类比于requests.session();默认还是使用HTTP/1.1,需手动设置http2=True; client = httpx.Client(http2=True) client.headers = { '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', # Cookie中的sessionid设置成你自己的值 'Cookie': 'Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1728646875; HMACCOUNT=BD815CA35CFECED8; qpfccr=true; no-alert3=true; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1728646879; tk=8258780053392544352; sessionid=a9wal1kcrtwt2wgpyyjimyt51b7pfnrp; yuanrenxue_cookie=1728647008|j2IWzkR0SjEFNNDLGkXnNoHOJ6Y9ZJz9yN8NacPCQOQUy; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1728647129; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1728647270' } # 获取Cookie client.get(url='https://match.yuanrenxue.cn/match/17') # 下次请求前注意设置请求头中的Referer client.headers.update({'Referer':'https://match.yuanrenxue.cn/match/17'}) total_value = 0 for pid in range(1,6): res = client.get(url=f'https://match.yuanrenxue.cn/api/match/17?page={pid}') data = res.json()['data'] print(data) for item in data: total_value += item['value'] print(f"求和:{total_value}")
-
运行结果如下
-
以上解题思路和源码若有错误、不合理或值得优化的地方,欢迎各位大佬不吝赐教,批评指正!