由于 HTTP 协议是一个无状态协议,Web 应用程序无法区分请求是否来源于同一个浏览器,为了跟踪用户状态(如用户身份、登录状态等),需要 Session 与 Cookie 机制。

静态网页和动态网页

静态网页

存放在 Apache 或 Nginx 等服务器文件系统中的 HTML 文件实体。

  1. 由 htm、html、shtml、xml 等编写;
  2. 各静态网页的 URL 固定,且以.htm.html.shtml.xml扩展名为后缀;
  3. 文字、图片等内容均通过既定的 HTML 代码指定;
  4. 内容相对稳定,易被搜索引擎检索收录;
  5. 交互性较差;
  6. 加载速度快、编写简单、可维护性差、不能接收 URL 中的参数来灵活显示内容。

    动态网页

    浏览器请求某个页面时,服务器可根据时间、传入的参数、数据库状态等信息,动态地生成 HTML 页面后响应给浏览器。浏览器显示的 HTML 一般并不实际存在于服务器中。

    在动态网页中输入用户名和密码后可以得到一个凭证,根据这个凭证才能得到目标页面并保持登录状态。

  7. 由 asp、jsp、PHP、Perl、Python 等编写;

  8. 以数据库技术为基础,网站维护性好;
  9. 可实现比静态网页更丰富的功能,如用户注册与登录、在线查询、用户与订单管理等;
  10. 信息查询方便,能实现即时查询;
  11. 保密性与安全性要求高,制作成本高,不易被搜索引擎收录

    伪静态

    为了更美观地显示 URL,可映射 URL 地址使带参的动态网页 URL 被不带参的类静态 URL 替代显示。

    原始的动态网页 URL:https://www.yuque.com/?user_name=tully&library=crawler; 映射后的伪静态 URL:https://www.yuque.com/tully/crawler

无状态 HTTP

服务器接受请求、处理请求、发起响应的过程完全独立,是 HTTP 的无状态性。无状态 HTTP 指的是 HTTP 协议对事务的处理没有记忆能力,表现为服务器无法知悉客户端的状态。意味着随后的请求若基于先前的信息,则客户端必须重传,但这导致了请求的重复与资源的浪费。
为了解决这个问题,引入了 Session 和 Cookie 技术。对于同样的用户信息,服务端用 Session 保存,客户端用 Cookie 保存。下次访问同样的网页时,客户端将自动在请求中带上 Cookie 的内容。服务端接收到请求后,用 Session 与之比对,判定用户状态并返回对应的页面,实现了会话的维持。

在爬虫中,处理需要先登录才能访问的页面时,我们一般会直接将登录成功后获取的Cookie放在请求头里面直接请求,而不重新模拟登录。

Session

Session 即会话,原指一系列有始有终的动作或消息的集合。用户信息以 Session 的形式保存在服务端,当用户在同一网站不同页面间跳转时,会话过程由 Cookie 配合 Session 得以完整维持而不中断。通过了验证的用户第一次访问时,服务端将自动为用户创建一个 Session 对象,除非过期或弃用(如注销账户),服务端不会终止 Session,该用户后续的请求有 Session 参与。
Session 维持的细节如下:

  1. 客户端第一次完成验证后,服务端自动为用户创建一个 Session 对象;
  2. 服务器返回一个响应头中有用于用户标记的Set-Cookie字段的响应;
  3. 客户端将Set-Cookie字段的内容保存为 Cookie;
  4. 客户端再次请求相同网站时,会把 Cookie 加入请求头;
  5. 服务器检查 Cookie 内容的 Session ID 等信息并于 Session 校验:
    1. 校验通过则认为用户仍保持登录状态并返回登录后的内容;
    2. 校验失败则重定向到登录页面。

      Cookie

      Cookie,原意为曲奇饼干。Web 中指那些存储在用户本地终端上,用于用户身份鉴定、进行 Session 跟踪的数据——Session ID。下面以 知乎 (https://www.zhihu.com/) 为例学习 Cookie 的属性结构:

      访问知乎并登录后,后打开开发者工具在 Application (应用) 选项卡的 Storage (存储) 中找到 Cookies 项,即可看到 Cookies 列表,每一项均为一个 Cookie。

image.png

  • Name (名称):Cookie 的名称。创建后不可更改;
  • Value (值):Cookie 的值。Unicode 字符需要使用字符编码,二进制数据需要使用 BASE64 编码;
  • Domain (域名):可以访问该 Cookie 的域名。为.zhihu.com时,所有以zhihu.com结尾的域名均可访问该 Cookie;
  • Path (路径):Cookie 的使用路径。
  • Max-Age (最大有效时间):Cookie 的失效时间(秒)。常与Expires (失效)一起使用,计算出 Cookie 的有效时间。若 Max-Age 为正值,表示 Cookie 将在 Max-Age 秒后失效,Cookie 会被写入磁盘,称为持久 Cookie;若为负值,Cookie 仅存在于内存中,浏览器关闭后即刻失效,且不以任何形式保存该 Cookie,称为会话 Cookie;
  • Size (大小):Cookie 的大小;
  • HttpOnly (HTTP 字段):Cookie 是否仅能以 HTTP 访问。若为true,则只有在 HTTP Headers 中才会带有此 Cookie,而不能使用document.cookie访问;
  • Secure (安全性):Cookie 是否只允许使用加密的 HTTPS、SSL 等安全协议传输。默认为false