爬虫之cookie和session的应用
一:Cookie和Session的简介
http是一种无状态协议,每个请求都是完全独立的,客户端请求时服务器无法确认当前访问者的身份,服务器和浏览器为了进行会话的跟踪,必须主动去维护一个状态(告诉服务器前后两个请求是否是来自同一个浏览器)。这个状态需要通cookie和session来实现(通俗理解就是免去了每次登录都需要输入帐号密码的繁琐过程)。
cookie是客户端请求服务器时,服务器向客户端下放的一串值(所以我们在设置cookie时需要要用response对象进行设置)。cookie是以字典的形式存在的,并保存在客户端(这是cookie的一个重点)。当客户端下一次访问服务器时会在请求中加入这个cookie,服务端收到请求后只需要通过校验cookie去验证用户的身份,而不是通过帐号和密码验证。
cookie缺点:由上可见,cookie是非常方便的,但由于cookie是保存在本地中的,所以它的安全性就成为了它的最大一个隐患。seesion则可以弥补这个缺陷
session是区别cookie的另一种记录服务器和客户端会话状态的机制,session是基于cookie实现的。session是存储在服务器中的(区别于cookie的一大特点)。用户第一次请求服务器时,服务器会生成一个加密的sessionid放在cookie之中下发到客户端,客户端下一次访问服务器时,会携带这个sessionid到服务器,服务器拿到sessionid后进行解密,并与服务器内的session进行匹配来验证当前用户。
由于session是保存在服务器中的,故使得安全性得到了极大的提升。
-
cookie和session区别:
(1). 存储位置不同
- cookie存储在本地浏览器(客户端),session存在服务器上
(2). 存储容量不同
- 没一个cookie保存的数据不超过4kb,每个站点不超过20个cookie
- session没有容量上限,但是session存在服务器上,如果存太多的session对服务器压力很大
(3). 安全性不同
- session比cookie更加安全
-
Token(令牌)
token是访问接口时所需要的资源凭证
常见的token是由三部分组成:UID,time(时间戳),sign(签名,加密数据)
验证流程:客户端将帐号密码提交到服务器后,服务器对请求的帐号密码进行加密,并返回Token给客户端,下一次客户端登录时,请求中会携带token,服务端对token进行解密,进行验证并判断正确性,如果正确则返回数据。
-
cookie和session在爬虫中的应用
案例一:cookie的使用
# 需求:利用cookie爬取已登录的csdn首页
import requests
# 定义请求头
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0",
"Cookie": "Cookie值" # cookie值可从浏览器中获取
}
# 若不加cookie,则无法获取完整的页面
response = requests.get(
url="https://i.csdn.net/#/uc/profile",
headers=headers,
)
# 保存文件
with open("csdn.html", "w", encoding="utf8") as f:
f.write(response.text)
案例二:session的使用
# 需求:用session爬出csdn登录页面
2
3 import requests
4
5
6 # 创建session对象
7 ss = requests.session()
8
9 # 使用session对象发起请求
10 # 确定请求的url:是form表单的action属性的值
11 # 确定请求的方式:是form表单中method属性的值
12
13 # 定义参数
14 # 参数的键值对是<input>标签内的name属性的值和自己的帐号密码
15 data = {
16 "all": "帐号",
17 "pwd": "密码"
18 }
19
20 response = requests.get(
# # 为form表单的action属性的值,即表单的提交地址
21 url="https://passport.csdn.net/login?code=public",
22 data=data
23 )
24
25 with open("csdn_session.html","w",encoding="utf8") as f:
26 f.write(response.text)