session会话
-
1、前言
- HTTP 协议 ( 超文本传输协议 ) 是无状态的,不能保存客户端与服务器之间通讯 ( 交互 ) 的信息。
- 打个比方,拿最常见的登录来说,现在好多网站的操作都需要用户登录,假如在 a 操作时,用户成功登录系统,再进行 b 操作时,由于 HTTP 协议是无状态的,用户之前登录的信息并没有被记录下来。那么,用户需要再次登录系统才能继续操作,以此类推,每个操作都需要登录一次系统,这是非常可怕的事情。
- cookie 和 session 技术的诞生,都是为解决 HTTP 无状态协议所带来的系列问题。它们可以维护用户与服务器间的会话状态。
-
2、cookie 和 session
- Cookie:
- 1)、Cookies在浏览器端(即客户端),浏览器会自动存储数据到Cookies中(服务器通过http响应告知浏览器将某些数据存储到Cookies中);
- 2)、Cookie 数据由浏览器按照一定的原则在后台自动发送给服务器(数据放在http请求中的请求头);
- 3)、单个Cookie在客户端的限制是3K,就是说一个站点在客户端存放的Cookie不能超过3K;
- 4)、Cookies中的数据不安全,银行卡和密码等重要的数据绝对不能存储在Cookies中。
- Session:
- Session即会话,表示浏览器与服务器一系列请求的集合,每个Session都有一个唯一的标识(服务器内部保证它的唯一性),即sessionId,服务器通过它来区分不同的客户端(客户端第一次发送请求给服务器时,服务器为其分配唯一的sesisonId),数据存储到Session中是指:将数据存储到服务器的内存中,因此Session需要占用服务器的资源,如内存等,当大量的用户访问服务器时,服务器的压力是非常大的,为了杜绝资源的浪费,保证服务器资源合理被有效用户利用,需要一种机制来回收无效的Session,以释放其占用的内存资源,会话超时是非常不错的选择,会话的默认超时时间是30分钟,即客户端在30分钟之内没有发送http请求给服务器,服务器就会认为它是无效用户了,随即回收该客户端所占用的内存资源。
- Cookie:
-
3、cookie与session的区别
- 1)、Cookie是客户端机制,Session服务器端机制,数据存储在Session中比存储在Cookie中要安全
- 2)、客户端首次发送http请求到服务器端时,服务器会为其分配sessionId,并且将sessionId存储到客户端的Cookies(sessionId不一定要放到客户端的Cookies中),客户端再次发送的HTTP请求中一定会包含该sessionId,服务器收到该请求包发现已经存在有效的sessionId,因此认为两次请求是在同一个会话中。
-
4、requests中会话处理
- 之前使用 requests 模块的时候,是直接 requests.get() 或者 requests.post() 发送GET请求或POST请求;当然也是可以带上 cookies 和 headers 的,但这都是一次性请求,你这次带着cookies信息,后面的请求还得带。这时候 requests.session() 就派上用场了,它可以自动处理cookies,做状态保持。
import requests
#先实例化一个session对象
session =requests.Session()
#后面的用法和直接使用requests一样
response = session.get(url=url,headers = headers)
response = session.get(url=url,headers = headers,json = param)
result = response.text
- 使用实例
import requests
#1.创建一个空白的session对象
session = requests.Session()
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
}
main_url = 'https://xueqiu.com/'
#2.使用session发起的请求,目的是为了捕获到cookie,且将其存储到session对象中
session.get(url=main_url,headers=headers)
url = 'https://xueqiu.com/statuses/hot/listV2.json'
param = {
"since_id": "-1",
"max_id": "311519",
"size": "15",
}
#3.就是使用携带了cookie的session对象发起的请求(就是携带者cookie发起的请求)
response = session.get(url=url,headers=headers,params=param)
data = response.json()
print(data)