题目:抓取下列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)