猿人学_第03题

在这里插入图片描述

  1. 打开调试工具,发现名为3的才是真正的数据发送请求,进入对应的调用地点
    在这里插入图片描述
  2. 发现在对应的ajax发送之前,需要执行里一个函数,该函数也是ajax请求,请求为类型为post,地址为jssm
    在这里插入图片描述
  3. 多点击几次翻页发现,每一次获取真正数据之前都需要发送一个向jssm的post请求,且该请求中含有set-cookie,那么就十分清晰了

在这里插入图片描述

执行过程

  1. 创建一个session会话
  2. 先向jssm发送post请求,获得响应头中的set-cookie中的sessionid
  3. 在 将该sessionid加入到会话的headers中的Cookie中
  4. 然后再向3发送get请求,获得响应数据即可
import requests

jssm_url = 'https://match.yuanrenxue.com/jssm'
headers = {'accept': '*/*',
           'accept-encoding': 'gzip, deflate, br',
           'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
           'cache-control': 'no-cache',
           'content-length': '0',
           'cookie': 'Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1665887019,1665888460,1665900743; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1665887019,1665888460,1665900743; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1665903586; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1665903586',
           'origin': 'https://match.yuanrenxue.com',
           'pragma': 'no-cache',
           'referer': 'https://match.yuanrenxue.com/match/3',
           'sec-ch-ua': '"Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"',
           'sec-ch-ua-mobile': '?0',
           'sec-ch-ua-platform': '"Windows"',
           'sec-fetch-dest': 'empty',
           'sec-fetch-mode': 'cors',
           'sec-fetch-site': 'same-origin',
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42' }
session = requests.Session()
session.headers = headers
response = session.post(jssm_url)
print(response.headers)

但是事与愿违,我们根本得不到第一次请求返回结果中的set-cookie
上面的代码执行结果为
在这里插入图片描述

难点

浏览器中的header顺序,是经过浏览器内部进行排序的,但我们请求时传入的header是未经过排序的,使用顺序不同的请求头就有可能得到结果不同的响应
这个题目考验的点也就在这里,我们采用charles抓包工具进行抓包,来显示真实的请求头
在这里插入图片描述
然后在将其作为请求头放到代码中,按照上面的执行步骤执行即可

正确的代码

from collections import defaultdict

import requests

if __name__ == '__main__':

    header_s = {
        'Host': 'match.yuanrenxue.com',
        'Content-Length': '0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42',
        'Accept': '*/*',
        'Referer': 'https://match.yuanrenxue.com/match/3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Cookie': ''
    }
    session = requests.session()
    session.headers = header_s
    # res = []
    res = defaultdict(int)
    for page in range(1, 6):
        before_url = 'https://match.yuanrenxue.com/jssm'
        response = session.post(before_url)
        set_cookie = response.cookies.get_dict()

        session.headers['Cookie'] = "sessionid=" + set_cookie['sessionid']

        if page > 3:
            session.headers['User-Agent'] = "yuanrenxue.project"
        url = 'https://match.yuanrenxue.com/api/match/3?page={}'.format(page)
        response = session.get(url)
        datas = response.json()['data']
        for data in datas:
            value = data['value']
            res[value] += 1
    print(dict(res))
    print(max(res, key=lambda x: res[x]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值