Python爬虫必须掌握的概念—Cookie和Session

系统
最近总是有一些初学爬虫的小伙伴总是搞不懂 Session 和 Cookie 到底是做什么的,为什么爬虫访问网页的时候都用 Session 去访问,为什么 headers 携带 Cookie 就可以以登陆形式进入网页了,这两个东西的原理究竟是什么呢?

 

Cookie和Session

  • 前言cookie 和 session 得由来CookieCookie 属性Cookie 创建Cookie 分类SessionSession 工作原理创建 Session保存 Session销毁 Session检查Session 是否失效总结 Cookie Session相同点:不同点:工作流程:

前言

最近总是有一些初学爬虫的小伙伴总是搞不懂 Session 和 Cookie 到底是做什么的,为什么爬虫访问网页的时候都用 Session 去访问,为什么 headers 携带 Cookie 就可以以登陆形式进入网页了,这两个东西的原理究竟是什么呢?

cookie 和 session 的由来

在Web发展史中,我们知道浏览器与服务器间采用的是简单的 http 协议,而这种协议是‘无状态’的,所以这就导致了服务器无法知道是谁在浏览网页,但很明显,一些网页需要知道用户的状态,例如登陆,购物车等。

所以为了解决这一问题,先后出现了四种技术,分别是 隐藏表单域 ,URL重写 ,Cookie ,Session ,当然现阶段用的最多的技术自然是 Cookie 和 Session 了。

Cookie

Cookie 是浏览器保存到用户电脑上面的一个文本,简单来说就是当一个用户通过 http 请求访问到服务器端的时候,服务器会将一些字典的键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据通过请求头又被完整地给带回服务器,服务器根据这些信息来判断不同的用户。

简单来说,Cookie 是服务器传输给客户端并保存到客户端的一段文本信息, Cookie 是有大小和数量限制的。

Cookie 属性

当我们访问网页的时候,我们看到网站的请求头如果携带 Cookie 都会含有 Set-Cookie 的属性,在这里分析一下 Set-Cookie 都包含什么属性项:

属性项属性项介绍Name=VALUE键值对,可以设置保存的键值对属性,这里的NAME不能和其他属性的名字相同Expires过期时间,这个时间后Cookie便会失效Domain生成Cookie的域名空间Path这个Cookie在系统哪个文件路径下生成的Secure加密设置,设置之后只能在SSH连接环境下才能回传这个Cookie属性

在这里仔细介绍一下 Domain 究竟是做什么的。

现在假设有两个域名:

  • 域名A:a.qq.com.cn
  • 域名B:b.qq.com.cn

显然域名A和域名B都是qq.com.cn的子域名。

  • 如果我们在域名A中的 Cookie 的 domain 设置为 qq.com.cn ,那么 qq.com.cn 及其子域名都可以获取这个 Cookie,即域名A和域名B都可以获取这个 Cookie。
  • 如果域名A和域名B同时设置 Cookie 的 doamin 为 qq.com.cn,那么将出现覆盖的现象。
  • 如果域名A没有显式设置 Cookie 的 domain 方法,那么 domain 就为 a.qq.com.cn,不一样的是,这时,域名A的子域名将无法获取这个 Cookie。

Cookie 创建

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

 

  1. Set-Cookie:delPer=0; expires=Thu, 16-Aug-2050 12:15:40 GMT 
  2. Set-Cookie:BDSVRTM=0; path=/ 
  3. Set-Cookie:BD_HOME=0; path=/ 
  4. Set-Cookie:H_PS_PSSID=1462_21106_26925_22074; path=/; domain=.baidu.com 

 

构建http返回字节流时是将 Header 中所有的项顺序写出,而没有进行任何修改。所以浏览器在接收 http 返回的数据时是分别解析每一个 Header 项。

Cookie 分类

  • 会话级别 Cookie:所谓会话级别 Cookie,就是在浏览器关闭之后 Cookie 就会失效。
  • 持久级别 Cookie:保存在硬盘的 Cookie,只要设置了过期时间就是硬盘级别 Cookie。

现在 Cookie 保存在了客户端,当我们去请求一个URL时,浏览器会根据这个URL路径将符合条件的 Cookie 放在请求头中传给服务器。

Session

Cookie 是有大小限制和数量限制的,并且越来越多的 Cookie 代表客户端和服务器的传输量增加,可不可以每次传的时候不传所有 Cookie 值,而只传一个唯一ID,通过这个ID直接在服务器查找用户信息呢?答案是有的,这就是我们的 Session。

Session 是基于 Cookie 来工作的,同一个客户端每次访问服务器时,只要当浏览器在第一次访问服务器时,服务器设置一个id并保存一些信息(例如登陆就保存用户信息,视具体情况),并把这个id通过 Cookie 存到客户端,客户端每次和服务器交互时只传这个id,就可以实现维持浏览器和服务器的状态,而这个ID通常是 NAME 为 JSESSIONID 的一个 Cookie。

现阶段一共有四种方法让 Session 工作:

  • 通过URL传递SessionID
  • 通过Cookie传递SessionID
  • 通过SSL传递SessionID
  • 通过隐藏表单传递SessionID

Session 工作原理

 

 

 

 

创建 Session

当客户端访问到服务器,服务器会为这个客户端通过 request.getSession() 方法创建一个 Session ,如果当前 SessionID 还没有对应的 HttpSession 对象,就创建一个新的,并添加到 org.apache.catalina.Manager 的 Sessions 容器中保存,这就做到了对状态的保持。当然,这个 SessionID 是唯一的

保存 Session

由图可知,Session 对象已经保存在了 Manager 类中,StandardManager 作为实现类,通过 requestedSessionId 从 StandardManager 的 Sessions 集合中取出 StandardSession 对象。

我们来看看 StandardManager 是如何对所有 StandardSession 对象进行生命周期管理

当 Servlet 容器关闭:StandardManager 将持久化没过期的 StandardSession 对象(必须调用 Servlet 容器中的 stop 和 start 命令,不能直接 kill)

当 Servlet 容器重启时:StandardManager 初始化会重读这个文件,解析出所有 session 对象。

销毁 Session

Session 的声明周期是从创建到超时过期。

也就是说,当 Session 创建后,浏览器关闭,会话级别的 Cookie 被销毁,如果没有超过设定时间,该 SessionID 对应的 Session 是没有被销毁的。

检查Session 是否失效

检查每个 Session 是否失效是在 Tomcat 的一个后台线程完成的( backgroundProcess() 方法中);除了后台进程检验 Session 是否失效外,调用 request.getSession() 也会检查该 Session 是否过期,当然,调用这种方法如果过期的话又会重新创建一个新的 Session。

总结 Cookie Session

相同点:

  • Session 和 Cookie 都是为了让 http 协议又状态而存在。
  • Session 通过 Cookie 工作,Cookie 传输的 SessionID 让 Session 知道这个客户端到底是谁。

不同点:

  • Session 将信息保存到服务器,Cookie 将信息保存在客户端。

工作流程:

当浏览器第一次访问服务器时,服务器创建 Session 并将 SessionID 通过 Cookie 带给浏览器保存在客户端,同时服务器根据业务逻辑保存相应的客户端信息保存在 Session 中;客户端在访问时上传 Cookie ,服务器得到 Cookie 后获取里面的 SessionID,来维持状态。

责任编辑:姜华 来源: 今日头条
相关推荐

2019-11-12 13:45:11

WebCookieSession

2019-08-15 09:35:03

2014-08-18 09:31:15

2009-08-05 18:30:36

Session和CooASP.NET表单

2019-05-15 15:10:12

Tomcat Session Cookie

2023-10-04 00:05:00

SessionCookie

2023-12-04 10:36:46

SessionCookie

2021-09-01 10:15:15

前端cookiesession

2020-02-27 15:12:29

cookiesession加密

2019-11-06 17:30:57

cookiesessionWeb

2019-06-11 14:45:25

2023-10-24 09:07:14

CookieSessionHTTP

2023-10-27 08:23:10

CookieWeb存储

2021-03-02 15:00:34

Python爬虫数据

2019-11-07 10:37:36

CookieSessionToken

2021-09-05 18:26:42

2014-02-10 10:13:43

2018-06-26 10:52:45

2023-09-14 11:45:24

HashMap散列表

2020-08-28 13:49:13

数据统计学面试
点赞
收藏

51CTO技术栈公众号