猿人学刷题系列(第一届比赛)——第三题

题目:抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中

在这里插入图片描述

地址:https://match.yuanrenxue.cn/match/3

本题主要考察请求逻辑,可以借助fiddler或Charles等抓包工具进行分析。首先通过浏览器来简单进行请求逻辑分析。

在这里插入图片描述

从抓包情况来看,每一页的请求都会先请求一个jssm的包,如果有经验的话其实就知道这个主要就是用于监听cookie的,所以在下手的时候我们主要是先对这个jssm的数据包进行下手,然后保持会话状态再进行页面数据的获取。本题可以借助postman或其他测试工具进行调试。文章中就不多此一举了直接通过代码来实现,首先分析jssm包,根据头部信息初步实现请求代码。

import requests
from collections import Counter


url = 'https://match.yuanrenxue.cn/api/match/3?page=%s'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
}
session = requests.session()
session.headers = headers

for i in range(1, 6):
    session.post('https://match.yuanrenxue.cn/jssm')
    response = session.get(url%i)
    res_data = response.text
    print(res_data)
    break

执行结果:

在这里插入图片描述

从执行结果来看,返回了一串混淆的js代码,而这段代码解码之后是一个undefined所以并没有什么实际意义,那么就需要对前置请求进行处理,也就是先来对jssm这个请求进行分析。请求头中添加cookie进行访问然后查看响应内容。

在这里插入图片描述

可以看到上图中,对于jssm这个请求是没有响应内容的,同时页面数据页没有获取到,那么也就是说前置请求我们并没有获取到准确的session内容,但是根据分析可知jssm这个请求按理是会有一个cookie返回的,这一点从浏览器中分析也可得到。如下图所示:

在这里插入图片描述

所以我们就来输出看看响应中是否设置了新的cookie值。

在这里插入图片描述

很明显,这一次请求并没有cookie值返回,那么是什么原因导致的呢?这个请求是否有什么参数需要传递呢?很明显,参数传递我们直接能够从头部信息中看得出来是没有的,那么问题多数就是出现在请求头中了,所以我们来将请求头参数补齐再来访问试试呢。

在这里插入图片描述

补齐请求头之后发现仍然是没有数据的,那么问题就来了,既然没有相关参数传递,cookie又是经过这个jssm包返回,那为什么补齐请求头参数之后仍然没有cookie返回呢?不慌,我们来通过fiddler再观察一下。

在这里插入图片描述

通过fiddler中的来看的话,代码中的请求与此处抓到的包中,最大的区别也就是请求头参数的顺序区别了,刷新几次页面(或者翻页)再观察一番看看(此处不再贴图演示)。会发现请求头的顺序在fiddler中是固定的一个顺序(与浏览器中看到的是不同的,浏览器会根据字母顺序进行排列),那也就是说极有可能是因为请求头参数的配置顺序导致我们代码无法成功获取到cookie了,所以将fiddler中的请求头参数复制下来重新配置一下再请求。

在这里插入图片描述

搞定,成功通过jssm获取到cookie,接下来就可以进一步访问获取页面数据啦。代码如下:

import requests
from collections import Counter


url = 'https://match.yuanrenxue.cn/api/match/3?page=%s'
headers = {
    'Host': 'match.yuanrenxue.cn',
    'Connection': 'keep-alive',
    'Content-Length': '0',
    'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
    'sec-ch-ua-mobile': '?0',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'sec-ch-ua-platform': '"Windows"',
    'Accept': '*/*',
    'Origin': 'https://match.yuanrenxue.cn',
    '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': '替换为自己的cookie',
}


session = requests.session()
session.headers = headers
for i in range(1, 6):
    session.post('https://match.yuanrenxue.cn/jssm')
    response = session.get(url%i)
    print(response.json())

在这里插入图片描述

获取到每一页的数据之后就是要从这些数据中找出出现频率最高的申请号,此处提供的方案是将所有数据添加到列表中进行计数排序,不再详解过程(实在不会就目测,冷笑话…提供完整代码,看不懂可私信本人讲解)。

完整代码

import requests
from collections import Counter


url = 'https://match.yuanrenxue.cn/api/match/3?page=%s'
headers = {
    'Host': 'match.yuanrenxue.cn',
    'Connection': 'keep-alive',
    'Content-Length': '0',
    'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
    'sec-ch-ua-mobile': '?0',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'sec-ch-ua-platform': '"Windows"',
    'Accept': '*/*',
    'Origin': 'https://match.yuanrenxue.cn',
    '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': '替换为自己的cookie',
}


session = requests.session()
session.headers = headers
lst = []
for i in range(1, 6):
    session.post('https://match.yuanrenxue.cn/jssm')
    response = session.get(url%i)
    json_data = response.json()
    for dic in json_data.get('data'):
        lst.append(dic.get('value'))

print(lst)
count = dict(Counter(lst))
max_value = sorted(count.items(), key=lambda a: a[-1])[-1][0]
print(max_value)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

quanmoupy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值