猿人學web端爬蟲攻防大賽賽題第17題——天殺的http2.0

死不悔改奇男子發表於2024-10-30

題目網址: https://match.yuanrenxue.cn/match/17

解題步驟:

  1. 老方法,看觸發的資料包。
    image
  2. 只有一個資料包,再看cookie中有沒有特殊的欄位。
    image
  3. 沒有遇到第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)

執行卻得不到頁面上的數字。
image
4. 到底哪裡出了問題呢,再結合題目http2.0,難道要用http2.0協議,先檢視當前流量包的協議。這裡以chrome瀏覽器為例,右擊流量包,選擇Header Options然後選擇Protocol,就會顯示協議號。
image
image
5. 確定是http2.0協議了。根據官方說明,requests只支援http1.1協議,所以這裡就不能能用requests庫了。
image
6. 經過網上搜尋,HyperHttpx兩個庫支援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)

執行結果如下。
image
8. 提交結果,成功通關。
image

相關文章