目标网址
https://match.yuanrenxue.com/match/3
逆向题目
抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中
开始分析
打开chrome浏览器 的开发工具,清理浏览器的cookie缓存
然后重新刷新网页
然后发现开始出现一个弹窗信息,显示数据加载失败
确认后,又出现一个弹窗,显示加群
然后网页重载到 https://match.yuanrenxue.com/list
然后在通过 list 列表中的题目 点击进入后 却没有出现弹窗信息
直接显示了数据,这个说明 在清空了之前的cookie 从而产生了这样的一个问题
那么在 cookie中 应该是保存了一个 验证的数据
因为清空了cookie 导致了 验证数据失败,服务器无法返回正常的数据
那么这个时候我们可以看一下cookie中有什么数据存在
通过network 上面的输出的 数据,我们可以很清楚的看到数据的api
https://match.yuanrenxue.com/api/match/3
通过的post请求协议
并且没有传参
然后我们看数据的cookie
可以看到 cookie中有一个 sessionid 值
通过多次抓取 可以发现 这个sessionid 是变化的
那么 首先我们先不考虑这个 sessionid的随机值是什么生成的
我们先通过 这个api 接口 首先写一下采集的脚本
看看这个sessionid 值 是否可以固定 如果可以 就不需要分析了
依旧还是可以用 第一题使用的python脚本 只需要修改一下请求的URL即可
# coding:utf-8
import requests
import time
import execjs
def yuanrenxue_sprider(page):
url = 'https://match.yuanrenxue.com/api/match/3?page={page}'.format(page=page)
print(url)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
'cookie': 'Hm_lvt_0362c7a08a9a04ccf3a8463c590e1e2f=1632991231; vaptchaNetway=cn; Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1632991226,1633063557; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1632991248,1633063559; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1633063559; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1633063623'
}
if page == 4 or page == 5:
headers['user-agent'] = 'yuanrenxue.project'
response = requests.get(url,headers=headers,verify=False)
# res = response.json()
print(response.text)
# for i in res['data']:
# data = i['value']
# print(data)
if __name__ == '__main__':
for i in range(1,6):
yuanrenxue_sprider(i)
通过脚本的运行的,可以看到 请求返回的值 是一大串的JS 有点像fuckjs
我们可以拿其中的一条 去做一下解密试试看
推荐的解密的网址:http://codertab.com/JsUnFuck
解密后 输出的内容 为 undefined 未定义???
我顿时懵逼了。。。
难道是漏加了一些请求时的参数吗?
接着继续把请求头加满 但是 返回的依旧是undefined
那如果不是我问题,就只能是这个协议的问题了
重新的考虑一下这个题目 叫做罗生门
那么可能这个协议接口返回本身就是这个错误的信息
很可能在之前就返回了数据 并且返回了 seeionid的值 做了校验
继续重新的抓几次包 分析一下
这个时候 发现 每次请求数据的时候,在 https://match.yuanrenxue.com/api/match/3
之前都会有一个https://match.yuanrenxue.com/jssm 请求一次
并且这个请求会返回cookie cookie中带有sessionid 的值
然后把这个网页的请求 放入精易调试工具里面去调试
首先把 这个cookie 清除进行请求 发现 返回的cookie中没有值
然后继续尝试 加上 空的sessionid 值 发现咦!!!可以了
并且每次请求 sessionid 的值都是不一样的
获取sessionid脚本
那么 这个时候我们就可以自己编写获取 sessionid的脚本了
# coding:utf-8
import requests
from requests import sessions
from requests.models import Response
def get_cookie():
url = 'https://match.yuanrenxue.com/jssm'
headers = {
'Host': 'match.yuanrenxue.com',
'Connection': 'keep-alive',
'Content-Length': '0',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 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',
}
res = requests.post(url,headers=headers,verify=False)
cookie = requests.utils.dict_from_cookiejar(res.cookies)
print(cookie)
get_cookie()
!!!!又发现了一个大问题 返回的cookie sessionid 值 竟然为空。。。
没道理啊,精易调试工具里面是可以的啊,为什么python就不行。。。
随后 我有用另外的一种请求的方式 进行修改处理 把 header 和 cookie 单独放入session中
# coding:utf-8
import requests
from requests import sessions
from requests.models import Response
def get_cookie():
url = 'https://match.yuanrenxue.com/jssm'
headers = {
'Host': 'match.yuanrenxue.com',
'Connection': 'keep-alive',
'Content-Length': '0',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 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',
}
session = requests.Session()
# response = session.post(url,headers=headers,verify=False)
session.headers = headers
cookies = {'Cookie':'sessionid=;'}
response = session.post(url,verify=False,cookies=cookies)
print('=============')
cookie = requests.utils.dict_from_cookiejar(response.cookies)
print(cookie)
print('=============')
get_cookie()
nice !!!
这次就可以出现cookie了
那这个是为啥嘞。。。。。
然后开始面向百度编程了,开始查询问题所在
=========================
然后花了十几分钟找到了问题的所在
Header 排序
在某些特殊情况下你也许需要按照次序来提供 header,如果你向 headers 关键字参数传入一个 OrderedDict,就可以向提供一个带排序的 header。然而,Requests 使用的默认 header 的次序会被优先选择,这意味着如果你在 headers 关键字参数中覆盖了默认 header,和关键字参数中别的 header 相比,它们也许看上去会是次序错误的。
如果这个对你来说是个问题,那么用户应该考虑在 Session 对象上面设置默认 header,只要将 Session 设为一个定制的 OrderedDict 即可。这样就会让它成为优选的次序。
============================
requests 库 的header排序是会被优先选择的
而 Session对象中不会
编写数据请求脚本
# coding:utf-8
import requests
from requests import sessions
from requests.models import Response
def get_cookie(page):
url = 'https://match.yuanrenxue.com/jssm'
headers = {
'Host': 'match.yuanrenxue.com',
'Connection': 'keep-alive',
'Content-Length': '0',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 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',
}
session = requests.Session()
# response = session.post(url,headers=headers,verify=False)
session.headers = headers
cookies = {'Cookie':'sessionid=;'}
response = session.post(url,verify=False,cookies=cookies)
print('=============')
cookie = requests.utils.dict_from_cookiejar(response.cookies)
print(cookie)
print('=============')
if page == 4 or page == 5:
headers['user-agent'] = 'yuanrenxue.project'
url_api = 'http://match.yuanrenxue.com/api/match/3?page={page}'.format(page=page)
res = session.get(url=url_api).json()
for i in res['data']:
data = i['value']
# print(data)
data_list.append(data)
if __name__ == '__main__':
data_list = []
for i in range(1,6):
get_cookie(i)
print('======================')
print('出現最多的值:',max(data_list, key=data_list.count))
print('======================')
最终的得出 出現最多的值: 8717