1.1 目标网站
https://match.yuanrenxue.com/match/3
1.2 查看请求和访问逻辑
1.2.1 打开fiddle进行抓包,可以看到两个请求
可以看到会请求两个请求, 第一个请求返回Set-Cookie
,第二个请求带上就可以访问。
对生成数据的接口进行重放
, 发现不能够正常返回数
据, 对两个请求同时
进行重放, 发现数据返回正常
。
1.2.2 Python模拟请求
发现访问并没有返回到cookie, 对网页端和python模拟进行对比发现Python模拟请求头顺序不对
这里发现请求头不是按照顺序来的, 其中:
你向 headers 关键字参数传入一个 OrderedDict,就可以向提供一个带排序的 header。
然而,Requests 使用的默认 header 的次序会被优先选择。
这意味着如果你在 headers 关键字参数中覆盖了默认 header和关键字参数中别的 header 相比,它们也许看上去会是次序错误的。
requests 库 的header排序是会被优先选择的,而 Session对象中不会。
那么用户应该考虑在 Session 对象上面设置默认 header,只要将 Session 设为一个定制的 OrderedDict 即可。这样就会让它成为优选的次序。
2.1 代码
from collections import Counter
import requests
import urllib3
urllib3.disable_warnings()
headers = {
"Host": "match.yuanrenxue.com",
"Connection": "keep-alive",
"Content-Length": "0",
"sec-ch-ua": '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
"sec-ch-ua-mobile": "?0",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
"sec-ch-ua-platform": "Windows",
"Accept": "*/*",
"Origin": "https://match.yuanrenxue.com",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://match.yuanrenxue.com/match/3",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "m=e6370aff58adacf77e6ddbbe8b365047|1659771468000; Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1659761954,1659767697,1659767716,1659771472; qpfccr=true; no-alert3=true; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1659443435,1659452878,1659761832,1659771825; tk=-3495643738000386252; sessionid=wob9s7wdgrmmsnb7o8cl3a0ycqhmi9lf; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1659771870; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1659771870",
}
proxies = {
"http": "http://localhost:8000",
"https": "http://localhost:8000",
}
session = requests.session()
data_list = []
for page in range(1, 6):
if page == 4 or page == 5:
headers['user-agent'] = 'yuanrenxue.project'
session.headers = headers
res = session.post("https://match.yuanrenxue.com/jssm", verify=False)
# cookie_index = {"sessionid": res.cookies.get("sessionid")}
url_api = 'http://match.yuanrenxue.com/api/match/3?page={page}'.format(page=page)
res_dic = session.get(url=url_api).json()
for i in res_dic['data']:
data = i['value']
# print(data)
data_list.append(data)
print(max(data_list, key=data_list.count))