题目链接:https://match.yuanrenxue.cn/match/3

常规操作,F12开发者工具打开,点击页码进行翻页,可以看到每次有两个请求:

beafff49edb94803a6464f7241156c29

第一个请求状态码为202,第二个请求状态码为200。 如题是访问逻辑,看看202这个请求的请求头:

9c397cfbfaff4ce0847f5558e68e8088

 浏览器看到的一般是按照字母排序了的隐藏了真实的顺序,再使用抓包工具Charles看看:

ceda8ed88c704739b6242929f283691c

 抓包工具(如Fiddler、Charles、Wireshark)会显示请求头的真实顺序,考虑需要维持顺序,考虑使用下OrderedDict这个类,请求代码如下:

import json
import time
from collections import OrderedDict

import requests
from requests.utils import dict_from_cookiejar


def get_question_3_result():
    url = "https://match.yuanrenxue.cn/api/question/3"
    h = OrderedDict()
    # headers从抓包工具复制的 状态码为202的接口
    headers = {
        "sec-ch-ua": "\"Chromium\";v=\"94\", \"Google Chrome\";v=\"94\", \";Not A Brand\";v=\"99\"",
        "accept": "*/*",
        "x-requested-with": "XMLHttpRequest",
        "sec-ch-ua-mobile": "?0",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-site": "same-origin",
        "sec-fetch-mode": "cors",
        "sec-fetch-dest": "empty",
        "referer": "https://match.yuanrenxue.cn/match/3",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9",
        "cookie": "sessionid=85v0ffp6lzkft5ff9lwrwv9v55wgxx1i;"
    }
    h.update(headers)
    sum_data = 0
    s = requests.Session()
    s.headers.clear()
    s.headers.update(h)

    for page in range(1, 6):
        c_url = 'https://match.yuanrenxue.cn/api2/3'
        r = s.get(c_url, headers=h, verify=False)
        cookies = dict_from_cookiejar(r.cookies)
        # print(cookies)
        # cookie = {'sessionid': '85v0ffp6lzkft5ff9lwrwv9v55wgxx1i'}
        if page == 5:
            h['user-agent'] = 'yuanrenxue'
            s.headers.update(h)
        params = {
            "page": page,
            "pageSize": "10",
            "kw": "",
            # "m": m
        }
        try:
            r = s.get(url=url, params=params, verify=False, cookies=cookies)
            if r.status_code == 200:
                data = r.json()['data']
                sum_data += sum(data)
                print(f"翻第{str(page)}页,累计求和:{sum_data}")
            else:
                print(f'error:{r.status_code}-----{r.text}')
        except Exception as e:
            raise ValueError(e)


if __name__ == '__main__':
    get_question_3_result()

requests包是怎样处理header的顺序的,进到源码看看:

以上代码s.get处,按住ctrl,点击get进入,可看到prepare_request方法⬇️

image

 按住ctrl,点击prepare_request,可以看到p.prepare⬇️

image

 再次按住ctrl,点击p.prepare,就可以看到prepare_headers⬇️

image

 再次按住ctrl,点击prepare_headers,就可以看到对header的处理逻辑,这里没有发现排序:

image

按住ctrl、alt、左箭头回退到上一步,看到有个merge_setting方法⬇️

image

 再次按住ctrl,点击merge_setting方法进去,看到一个to_key_val_list⬇️

image

 最后一次按住ctrl,点击key_to_val_list进去看看,发现有排序的操作:

image

 不同版本的requests库进去看到的代码不太一样,这一步如果没有进行排序,就在下一步send中做了处理。

 

posted on 2026-04-27 14:31  落叶虽美只活一世  阅读(74)  评论(0)    收藏  举报
Live2D