上一篇文章: Python3网络爬虫实战---1七、爬虫基本原理
下一篇文章: Python3网络爬虫实战---1九、代理基本原理
在浏览网站的过程当中咱们常常会遇到须要登陆的状况,有些页面只有登陆以后咱们才能够访问,并且登陆以后能够连续访问不少次网站,可是有时候过一段时间就会须要从新登陆。还有一些网站有时在咱们打开浏览器的时候就自动登陆了,并且很长的时间都不会失效,这种状况又是为何?其实这里面涉及到 Session 和 Cookies 的相关知识,本节咱们就来揭开它们的神秘面纱。html
在开始以前咱们须要先了解一下静态网页和动态网页的概念。
仍是前文中的示例代码,内容以下:数据库
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a Demo</title> </head> <body> <div id="container"> <div class="wrapper"> <h2 class="title">Hello World</h2> <p class="text">Hello, this is a paragraph.</p> </div> </div> </body> </html>
这是最基本的 HTML 代码,咱们将其保存为一个 html 文件,而后把它放在某台具备固定公网 IP 的主机上,主机上装上 Apache 或 Nginx 等服务器,这样这台主机就能够做为服务器了,其余人即可以经过访问服务器看到这个页面了,这就搭建了一个最简单的网站。
这种网页的内容是 HTML 代码编写的,文字、图片等内容均是经过写好的 HTML 代码来指定的,这种页面叫作静态网页。
这种网页加载速度快,编写简单,可是存在很大的缺陷,如可维护性差,不能根据 URL 灵活多变地显示内容等,例如咱们想要给这个网页的 URL 传入一个 name 参数,让其在网页中显示出来,是没法作到的。
因此动态网页应运而生,它能够动态解析 URL 中参数的变化,关联数据库并动态地呈现不一样的页面内容,很是灵活多变,咱们如今遇到的大多数网站都是动态网站,它们再也不是一个简单的 HTML,而是可能由 JSP、PHP、Python 等语言编写的,功能相比静态网页强大和丰富太多太多。
动态网站还能够实现用户登陆注册的功能,再回到开篇提到的问题,不少页面是须要登陆以后才能够查看的,按照通常的逻辑来讲,咱们输入用户名密码登陆以后,确定是拿到了一种相似凭证的东西,有了它咱们才能保持登陆状态,才能访问登陆以后才能看到的页面。
那么这种神秘的凭证究竟是什么呢?其实它就是 Session 和 Cookies 共同产生的结果,下面咱们来一探它们的究竟。segmentfault
在了解 Session 和 Cookies 以前,咱们还须要了解 HTTP 的一个特色,叫作无状态。
HTTP 的无状态是指 HTTP 协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。当咱们向服务器发送一个 Requset 后,服务器解析此 Request,而后返回对应的 Response,服务器负责完成这个过程,并且这个过程是彻底独立的,服务器不会记录先后状态的变化,也就是缺乏状态记录,这意味着若是后续须要处理须要前面的信息,则它必需要重传,这也致使了须要额外传递一些前面的重复 Request 才能获取后续 Response,然而这种效果显然不是咱们想要的。为了保持先后状态,咱们确定不能将前面的请求所有重传一次,这太浪费资源了,对于这种须要用户登陆的页面来讲,更是棘手。
因此,这时候,两个用于保持 HTTP 链接状态的技术就出现了,它们分别是 Session 和 Cookies,Session 在服务端,也就是网站的服务器,用来保存用户的会话信息,Cookies 在客户端,也能够理解为浏览器端,有了 Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器经过识别 Cookies 并鉴定出是哪一个用户,而后再判断用户是不是登陆状态,而后返回对应的 Response。
因此咱们能够理解为 Cookies 里面保存了登陆的凭证,有了它咱们只须要在下次请求携带 Cookies 发送 Request 而没必要从新输入用户名、密码等信息从新登陆了。
所以在爬虫中,有时候处理须要登陆才能访问的页面时,咱们通常会直接将登陆成功后获取的 Cookies 放在 Request Headers 里面直接请求,而没必要从新模拟登陆。
好,大致了解什么是 Session 和 Cookies 以后,咱们来详细剖析一下它们的原理。浏览器
Session,即会话,其原本的含义是指善始善终的一系列动做/消息,好比打电话时从拿起电话拨号到挂断电话这中间的一系列过程能够称之为一个 Session。
而在 Web 中 Session 对象用来存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,若是该用户尚未会话,则 Web 服务器将自动建立一个 Session 对象。当会话过时或被放弃后,服务器将终止该会话。安全
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而储存在用户本地终端上的数据。服务器
那么利用 Cookies 咱们是怎样来保持状态的呢?当客户端第一次请求服务器时,服务器会返回一个 Headers 中带有 Set-Cookie 字段的 Response 给客户端,用来标记是哪个用户,客户端浏览器会把Cookies 保存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies 放到 Request Headers 一块儿提交给服务器,Cookies 携带了 Session ID 信息,服务器检查该 Cookies 便可找到对应的 Session 是什么,而后再判断 Session 来以此来辨认用户状态。
因此咱们在登陆某个网站的时候,登陆成功后服务器会告诉客户端设置哪些 Cookies 信息,在后续访问页面时客户端会把 Cookies 发送给服务器,服务器再找到对应的 Session 加以判断,若是 Session 中的某些设置登陆状态的变量是有效的,那就证实用户是处于登陆状态的,便可返回登陆以后才能够查看的网页内容,浏览器进行解析即可以看到了。
反之,若是传给服务器的 Cookies 是无效的,或者 Session 已通过期了,咱们将不能继续访问页面,可能会收到错误的 Response 或者跳转到登陆页面从新登陆。
因此 Cookies 和 Session 须要配合,一个处于客户端,一个处于服务端,两者共同协做,就实现了登陆会话控制。cookie
接下来咱们来看看 Cookies 都有哪些内容,在这里以知乎为例,在浏览器开发者工具中打开 Application 选项卡,而后在左侧会有一个 Storage 部分,最后一项即为 Cookies,将其点开,能够看到相似以下内容,这些就是 Cookies,如图 2-14 所示:网络
图 2-14 Cookies 列表
咱们能够看到 Cookies 有一个个条目,每一个条目咱们能够称之为 Cookie,取单数形式。它有这么几个属性:session
表面意思来讲,会话 Cookie 就是把 Cookie 放在浏览器内存里,浏览器在关闭以后该 Cookie 即失效,持久 Cookie 则会保存到客户端的硬盘中,下次还能够继续使用,用于长久保持用户登陆状态。
其实严格来讲没有会话 Cookie 和持久 Cookie 之分,它只是由 Cookie 的 Max Age 或 Expires 字段决定了过时的时间,经过它浏览器能够计算出其有效时间。Max Age 若是为正数,则该 Cookie 在 Max Age 秒以后失效,若是 Max Age 特别大,那就会保存很是长的时间。若是为负数,则关闭浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
因此一些持久化登陆的网站其实就是把 Cookie 的有效时间和 Session 有效期设置得比较长,下次咱们再访问页面时仍然携带以前的 Cookies 就能够直接保持登陆状态。app
在谈论 Session 机制的时候,经常听到这样一种误解“只要关闭浏览器,Session 就消失了”,这种理解是错误的,能够想象一下会员卡的例子,除非顾客主动对店家提出销卡,不然店家绝对不会轻易删除顾客的资料。对 Session 来讲也是同样的,除非程序通知服务器删除一个 Session,不然服务器会一直保留,好比程序通常都是在咱们作注销操做的时候才去删除 Session。
可是当咱们关闭浏览器时,浏览器不会主动在关闭以前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之因此会有这种错觉,是大部分 Session 机制都使用会话 Cookie 来保存 Session ID 信息,而关闭浏览器后 Cookies 就消失了,再次链接服务器时也就没法找到原来的 Session。若是服务器设置的 Cookies 被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookies 发送给服务器,则再次打开浏览器仍然可以找到原来的 Session ID,依旧仍是能够保持登陆状态的。
并且偏偏是因为关闭浏览器不会致使 Session 被删除,这就须要服务器为 Seesion 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器就能够认为客户端已经中止了活动,才会把 Session 删除以节省存储空间。
因为涉及到一些专业名词知识,本节的部份内容参考来源以下:
本节介绍了 Session 和 Cookies 的基本知识,后面咱们可能会须要爬取一些须要登陆才能够访问的页面,这里就须要用到 Cookies 的相关知识,所以本节的内容一样须要好好掌握。
上一篇文章: Python3网络爬虫实战---1七、爬虫基本原理
下一篇文章: Python3网络爬虫实战---1九、代理基本原理