猿人学题库第六题——session保持检测
1. 首先 进入 浏览器的开发者工具,
打开开发者工具找到数据请求,challenge6 就是我们要找的数据请求,查看Header信息是个POST请求,在查看Prevew是返回的数据信息
2. 模拟请求数据
再次用 postman 模拟请求,可以看到直接返回数据,好的那就没问题,直接撸代码
3. 直接撸代码
# -*- encoding=utf-8 -*-
import requests
import os
import requests
headers = {
'Proxy-Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://www.python-spider.com',
'Referer': 'http://www.python-spider.com/challenge/6',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
Count = 0
for i in range(1,101):
data = {
'page': i
}
response = requests.post('http://www.python-spider.com/api/challenge6', headers=headers, data=data, verify=False)
for data in response.json()['data']:
# print(int(data['value']))
Count += int(data['value'])
print(Count)
# 结果 4774618240
答案一提交,哦豁,错误 ???
把 过程的 reponse的headers 打印查看一下,可以看到有 Set-Cookie,每次可能请求后会修改 cookie,下一次请求携带使用,如果cookie错误可能返回脏数据
这里 用到session 会话,会把reponse的 Set-Cookie 携带给下一次请求使用
# -*- encoding=utf-8 -*-
import requests
import os
import requests
headers = {
'Proxy-Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://www.python-spider.com',
'Referer': 'http://www.python-spider.com/challenge/6',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
Count = 0
session = requests.session()
for i in range(1,101):
data = {
'page': i
}
response = session.post('http://www.python-spider.com/api/challenge6', headers=headers, data=data, verify=False)
for data in response.json()['data']:
# print(int(data['value']))
Count += int(data['value'])
print(Count)
# 结果 5101310
发现 答案是不是不一样,这样会把脏数据排除掉。提交答案是成功的!!!
下面 补充一些 cookie和session的知识:
1. Cookie的工作原理
- 浏览器端第一次发送请求到服务器端
- 服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
- 浏览器端再次访问服务器端时会携带服务器端创建的Cookie
- 服务器端通过Cookie中携带的数据区分不同的用户
2. Session的工作原理
- 浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
- 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
- 服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
- name为JSESSIONID的Cookie不存在(关闭或更换浏览器), 请求会去重新去创建Session与特殊的Cookie
- name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
- value为SessionId不存在**(Session对象默认存活30分钟)**,请求会去重新去创建Session与特殊的Cookie
- value为SessionId存在,返回session对象
三、区别对比:
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
- 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
总结 :
这题只要是区别session和cookie,不过在没有答案监测的同时是不知道 有没有脏数据的,这个需要自己在爬虫过程中注意和检查数据了,最后把脏数据排除在外。