目标:抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中
翻页分析:翻页后,就只有jssm和page两个。这里我们可以联想一下看看jssm和page之间是不是有联系。
打开jssm,我们发现没有请求参数、请求头也没有加密。但、其响应标头有返回一个cookies的sessionid。这里我们多留一下这个sessionid,看看后面是不是对请求page起作用。
再打开page=2,我们也没有发现可以的加密参数和加密请求头。但是翻开cookies时,我们发现其有带sessionid这个由jssm的响应标头返回的cookies。
通过分析,我们大致可以得出一个思路:首先要请求jssm,取出jssm返回的sessionid。然后再请求page=2,page=2要带上上面取出的sessionid。再进行请求,然后直接得出结果。
但是这个问题真的有如此简单吗?直接上代码验证。
这里我们发现,其相应标头并没有返回cookies的sessionid。这是因为,该题的点在校验请求头的顺序。
重新构建请求头。
请求,可以得出结果。
那为什么请求头的顺序不对呢?
这是因为浏览器会对请求头排序,我们在浏览器看到的请求头都是经过排序的,而不是服务器原始顺序的请求头。解决这个问题,只需要使用抓包软件就可以解决。比如charles、findder等抓包软件。
下面page=2也是同样的方法。
源码如下:
import requests
from collections import Counter
class firstHeaders:
def items(self):
headers = {
"Content-Length": "0",
"Sec-Ch-Ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"Sec-Ch-Ua-Mobile": "?0",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.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, zstd",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1716902967; no-alert3=true; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1717295263,1717314335; tk=-8838488315772654498; sessionid=t2ivk05m79d9oxqxutbcynikyeb93u88; m=7d8915425233260fbbc811c253bdc577|1717314348000; Hm_lvt_434c501fe98c1a8ec74b813751d4e3e3=1717311666,1717314893; Hm_lpvt_434c501fe98c1a8ec74b813751d4e3e3=1717314893; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1717314899; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1717334940"
}
return ((k,v) for k,v in headers.items())
def firstRequests():
"""获取:JSSM的sessionid"""
url = "https://match.yuanrenxue.cn/jssm"
response = requests.post(url, headers=firstHeaders(), verify=False)
cookies = {
"sessionid": response.cookies.get("sessionid")
}
return cookies
class secondHeaders:
def items(self):
headers = {
"sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"sec-ch-ua-mobile": "?0",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 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, zstd",
"Accept-Language": "zh-CN,zh;q=0.9",
}
return ((k,v) for k,v in headers.items())
def secondRequests(cookies, page):
url = "https://match.yuanrenxue.cn/api/match/3?page={}".format(page)
response = requests.get(url, headers=secondHeaders(), cookies=cookies)
return response.json()['data']
if __name__ == '__main__':
calculate_num = []
for page in range(1, 6):
cookies = firstRequests()
data_row = secondRequests(cookies, page)
print(data_row)
for row in data_row:
val = row['value']
calculate_num.append(val)
top = Counter(calculate_num).most_common(1)[0]
print(top)