目标地址
https://match.yuanrenxue.com/match/3
任务3:抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中
分析过程
使用无痕模式, 避免无关的因素影响
第一次访问会出现, 然后会跳转到首页
从首页进去点进去发现提示没有了, 然后我们翻页看一下请求
除了页数page会变化外, 还会发现, 每次请求之前会先请求一下
https://match.yuanrenxue.com/jssm
先不管这个jssm, 直接复制page的curl请求一下试试
发现返回了一段js
复制到控制台执行一下, 发现并没有什么用, 页面的信息也没有什么变化, 是一个 undefined
看来跟另外一个请求jssm有关, 看一下这个jssm干了什么, 分析后发现
jssm没有响应内容, 只是会设置上一个cookie, 后面的请求page数据会带上这个cookie, 看来就是这个cookie的问题了
现在我们只需要把jssm的响应cookie拿到, 并且在请求page数据时带上应该就可以了
复制curl, 转为python, 测试, 打印一下响应cookie, 发现是空
<RequestsCookieJar[]>
这看起来跟浏览器一样呀, 所有的headers cookie啥的, 使用抓包工具试一下
打开后, 看一下请求, 对比headers,cookie后发现了一点问题
headers的请求顺序变了, 难道跟这个有关系? 复制出来再试试
<RequestsCookieJar[]>
结果发现还是空, 这就说明headers的请求顺序还是不正确, 但是一项项对比完之后, 确实是没有问题的, 后来看了一下requests的源码, 发现requests会对headers再次处理, 而字典是无序的, 所以只需要保证headers是有序的, 在requests处理时顺序不会变化即可
将headers改一下, 写成类是因为requests要使用headers的items方法
class headers:
@staticmethod
def items():
return (
('content-length','0'),
('sec-ch-ua','" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"'),
('sec-ch-ua-mobile','?0'),
('user-agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'),
('sec-ch-ua-platform','"macOS"'),
('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','Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1648810427'),
('cookie','Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1648810427'),
('cookie','no-alert3=true'),
('cookie','tk=-6824367426919366722'),
('cookie','m=c7052549bfc2c6d8379e2e07e564b446'),
('cookie','RM4hZBv0dDon443M=HM7Q2+h8rsbZTXlfeyvY2I9CqbN7FmfXwN7KeuBAlOT3NtfN25InPioz2BwCLZmzB/57MXSKmz8lkm2VIXKOCg2AuW+LLT1nBl6E4YrrcWZ3lz7XEV/opGlNopECiXtw2WRAseu/0z2ixqjOoGY6S9tyjEkhO9LIicvlHDu2TvOGD8QTztUlc4eFtM2f6nRjJBDzoj5OCXZDPLsNV9VYBt7WhhAhwJ7no9eisv0wQj8='),
('cookie','sessionid=ogxszl7p2yoz74kiy9oztk73cbtp3tnk'),
('cookie','Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1649229837'),
('cookie','Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1649229869'),
)
这次会发现可以返回响应cookie了
<RequestsCookieJar[<Cookie sessionid=pfdmiz5h3eppxkhtktgcsrfu6ozcokvf for match.yuanrenxue.com/>]>
而请求page页数据, 需要使用这个cookie, 只需要使用requests的session即可, 同理page页的headers也需要排序, 优化后的源代码如下:
# -*- coding: utf-8 -*-
import requests
session = requests.Session()
class headers(object):
@staticmethod
def items():
return (
("content-length", "0"),
("accept", "*/*"),
("referer", "https://match.yuanrenxue.com/match/3"),
("accept-encoding", "gzip, deflate, br"),
("accept-language", "zh-CN,zh;q=0.9"),
("cookie", "no-alert3=true"),
)
class theaders(object):
@staticmethod
def items():
return (
('accept', 'application/json, text/javascript, */*; q=0.01'),
('referer', 'https://match.yuanrenxue.com/match/3'),
('accept-encoding', 'gzip, deflate, br'),
('accept-language', 'zh-CN,zh;q=0.9'),
('user-agent', 'yuanrenxue.project'),
)
def main():
value_map = {}
for page in range(1, 6):
r = session.post('https://match.yuanrenxue.com/jssm', headers=headers, verify=False)
print(r.cookies)
params = (
('page', page),
)
response = session.get('https://match.yuanrenxue.com/api/match/3', headers=theaders, params=params)
for value in response.json()["data"]:
if value["value"] in value_map:
value_map[value["value"]] += 1
else:
value_map[value["value"]] = 1
value_count = sorted(value_map.items(), key=lambda x:x[1], reverse=True)
return value_count[0][0]
print(main())