題目網址: https://match.yuanrenxue.cn/match/17
解題步驟:
- 老方法,看觸發的資料包。
- 只有一個資料包,再看cookie中有沒有特殊的欄位。
- 沒有遇到第13題的特殊欄位,直接訪問。
import requests
url = "https://match.yuanrenxue.cn/api/match/17?page=1"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 "
"Safari/537.36",
"cookie": "sessionid=1zl8qqmuijewpn1pxji9epmjvoaz5ipi; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1729915594,1729937930,1729945496,1730034166; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1730284775"}
resp = requests.get(url, headers=headers)
print(resp.text)
執行卻得不到頁面上的數字。
4. 到底哪裡出了問題呢,再結合題目http2.0,難道要用http2.0協議,先檢視當前流量包的協議。這裡以chrome瀏覽器為例,右擊流量包,選擇Header Options
然後選擇Protocol
,就會顯示協議號。
5. 確定是http2.0協議了。根據官方說明,requests只支援http1.1協議,所以這裡就不能能用requests庫了。
6. 經過網上搜尋,Hyper
和Httpx
兩個庫支援http2.0。
hyper的話,不是很適用,因為很多功能跟requests庫沒法類比,所以這裡選用httpx。
httpx的安裝:pip install httpx[http2] # 這樣寫才能裝上支援http2的httpx,不寫的話預設是不支援http2的
7. 用httpx
庫嘗試去訪問一下,用法與requests
庫差不多。
import httpx
import re
client = httpx.Client(http2=True)
sum_num = 0
for i in range(1, 6):
url = "https://match.yuanrenxue.cn/api/match/17?page={}".format(i)
# print(url)
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 "
"Safari/537.36",
"cookie": "sessionid=1zl8qqmuijewpn1pxji9epmjvoaz5ipi; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1729915594,1729937930,1729945496,1730034166; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1730284775"}
resp = client.get(url, headers=headers)
pattern = r'{"value": (?P<num>.*?)}'
findall = re.findall(pattern, resp.text)
for item in findall:
# print(item)
sum_num += int(item)
print(sum_num)
執行結果如下。
8. 提交結果,成功通關。