[Python3网络爬虫开发实战] 2.4-会话和Cookies

在浏览网站的过程当中,咱们常常会遇到须要登陆的状况,有些页面只有登陆以后才能够访问,并且登陆以后能够连续访问不少次网站,可是有时候过一段时间就须要从新登陆。还有一些网站,在打开浏览器时就自动登陆了,并且很长时间都不会失效,这种状况又是为何?其实这里面涉及会话和Cookies的相关知识,本节就来揭开它们的神秘面纱。html

1. 静态网页和动态网页

在开始以前,咱们须要先了解一下静态网页和动态网页的概念。这里仍是前面的示例代码,内容以下:git

 

 

这是最基本的HTML代码,咱们将其保存为一个.html文件,而后把它放在某台具备固定公网IP的主机上,主机上装上Apache或Nginx等服务器,这样这台主机就能够做为服务器了,其余人即可以经过访问服务器看到这个页面,这就搭建了一个最简单的网站。github

这种网页的内容是HTML代码编写的,文字、图片等内容均经过写好的HTML代码来指定,这种页面叫做静态网页。它加载速度快,编写简单,可是存在很大的缺陷,如可维护性差,不能根据URL灵活多变地显示内容等。例如,咱们想要给这个网页的URL传入一个name参数,让其在网页中显示出来,是没法作到的。数据库

所以,动态网页应运而生,它能够动态解析URL中参数的变化,关联数据库并动态呈现不一样的页面内容,很是灵活多变。咱们如今遇到的大多数网站都是动态网站,它们再也不是一个简单的HTML,而是可能由JSP、PHP、Python等语言编写的,其功能比静态网页强大和丰富太多了。浏览器

此外,动态网站还能够实现用户登陆和注册的功能。再回到开头提到的问题,不少页面是须要登陆以后才能够查看的。按照通常的逻辑来讲,输入用户名和密码登陆以后,确定是拿到了一种相似凭证的东西,有了它,咱们才能保持登陆状态,才能访问登陆以后才能看到的页面。安全

那么,这种神秘的凭证究竟是什么呢?其实它就是会话和Cookies共同产生的结果,下面咱们来一探究竟。服务器

2. 无状态HTTP

在了解会话和Cookies以前,咱们还须要了解HTTP的一个特色,叫做无状态。cookie

HTTP的无状态是指HTTP协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。当咱们向服务器发送请求后,服务器解析此请求,而后返回对应的响应,服务器负责完成这个过程,并且这个过程是彻底独立的,服务器不会记录先后状态的变化,也就是缺乏状态记录。这意味着若是后续须要处理前面的信息,则必须重传,这致使须要额外传递一些前面的重复请求,才能获取后续响应,然而这种效果显然不是咱们想要的。为了保持先后状态,咱们确定不能将前面的请求所有重传一次,这太浪费资源了,对于这种须要用户登陆的页面来讲,更是棘手。网络

这时两个用于保持HTTP链接状态的技术就出现了,它们分别是会话和Cookies。会话在服务端,也就是网站的服务器,用来保存用户的会话信息;Cookies在客户端,也能够理解为浏览器端,有了Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器经过识别Cookies并鉴定出是哪一个用户,而后再判断用户是不是登陆状态,而后返回对应的响应。session

咱们能够理解为Cookies里面保存了登陆的凭证,有了它,只须要在下次请求携带Cookies发送请求而没必要从新输入用户名、密码等信息从新登陆了。

所以在爬虫中,有时候处理须要登陆才能访问的页面时,咱们通常会直接将登陆成功后获取的Cookies放在请求头里面直接请求,而没必要从新模拟登陆。

好了,了解会话和Cookies的概念以后,咱们在来详细剖析它们的原理。

(1) 会话

会话,其原本的含义是指善始善终的一系列动做/消息。好比,打电话时,从拿起电话拨号到挂断电话这中间的一系列过程能够称为一个会话。

而在Web中,会话对象用来存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web页时,若是该用户尚未会话,则Web服务器将自动建立一个会话对象。当会话过时或被放弃后,服务器将终止该会话。

(2) Cookies

Cookies指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。

会话维持

那么,咱们怎样利用Cookies保持状态呢?当客户端第一次请求服务器时,服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端,用来标记是哪个用户,客户端浏览器会把Cookies保存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies放到请求头一块儿提交给服务器,Cookies携带了会话ID信息,服务器检查该Cookies便可找到对应的会话是什么,而后再判断会话来以此来辨认用户状态。

在成功登陆某个网站时,服务器会告诉客户端设置哪些Cookies信息,在后续访问页面时客户端会把Cookies发送给服务器,服务器再找到对应的会话加以判断。若是会话中的某些设置登陆状态的变量是有效的,那就证实用户处于登陆状态,此时返回登陆以后才能够查看的网页内容,浏览器再进行解析即可以看到了。

反之,若是传给服务器的Cookies是无效的,或者会话已通过期了,咱们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登陆页面从新登陆。

因此,Cookies和会话须要配合,一个处于客户端,一个处于服务端,两者共同协做,就实现了登陆会话控制。

属性结构

接下来,咱们来看看Cookies都有哪些内容。这里以知乎为例,在浏览器开发者工具中打开Application选项卡,而后在左侧会有一个Storage部分,最后一项即为Cookies,将其点开,如图2-13所示,这些就是Cookies。

图2-13 Cookies列表

能够看到,这里有不少条目,其中每一个条目能够称为Cookie。它有以下几个属性。

  • Name:该Cookie的名称。一旦建立,该名称便不可更改。
  • Value:该Cookie的值。若是值为Unicode字符,须要为字符编码。若是值为二进制数据,则须要使用BASE64编码。
  • Domain:能够访问该Cookie的域名。例如,若是设置为.zhihu.com,则全部以zhihu.com,结尾的域名均可以访问该Cookie。
  • Max Age:该Cookie失效的时间,单位为秒,也常和Expires一块儿使用,经过它能够计算出其有效时间。Max Age若是为正数,则该Cookie在Max Age秒以后失效。若是为负数,则关闭浏览器时Cookie即失效,浏览器也不会以任何形式保存该Cookie。
  • Path:该Cookie的使用路径。若是设置为/path/,则只有路径为/path/的页面能够访问该Cookie。若是设置为/,则本域名下的全部页面均可以访问该Cookie。
  • Size字段:此Cookie的大小。
  • HTTP字段:Cookie的httponly属性。若此属性为true,则只有在HTTP头中会带有此Cookie的信息,而不能经过document.cookie来访问此Cookie。
  • Secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等,在网络上传输数据以前先将数据加密。默认为false

会话Cookie和持久Cookie

从表面意思来讲,会话Cookie就是把Cookie放在浏览器内存里,浏览器在关闭以后该Cookie即失效;持久Cookie则会保存到客户端的硬盘中,下次还能够继续使用,用于长久保持用户登陆状态。

其实严格来讲,没有会话Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires字段决定了过时的时间。

所以,一些持久化登陆的网站其实就是把Cookie的有效时间和会话有效期设置得比较长,下次咱们再访问页面时仍然携带以前的Cookie,就能够直接保持登陆状态。

3. 常见误区

在谈论会话机制的时候,经常听到这样一种误解“只要关闭浏览器,会话就消失了”,这种理解是错误的。能够想象一下会员卡的例子,除非顾客主动对店家提出销卡,不然店家绝对不会轻易删除顾客的资料。对会话来讲,也是同样,除非程序通知服务器删除一个会话,不然服务器会一直保留。好比,程序通常都是在咱们作注销操做时才去删除会话。

可是当咱们关闭浏览器时,浏览器不会主动在关闭以前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭。之因此会有这种错觉,是由于大部分会话机制都使用会话Cookie来保存会话ID信息,而关闭浏览器后Cookies就消失了,再次链接服务器时,也就没法找到原来的会话了。若是服务器设置的Cookies保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Cookies发送给服务器,则再次打开浏览器,仍然可以找到原来的会话 ID,依旧仍是能够保持登陆状态的。

并且偏偏是因为关闭浏览器不会致使会话被删除,这就须要服务器为会话设置一个失效时间,当距离客户端上一次使用会话的时间超过这个失效时间时,服务器就能够认为客户端已经中止了活动,才会把会话删除以节省存储空间。

4. 参考资料

因为涉及一些专业名词知识,本节的部份内容参考来源以下。

相关文章
相关标签/搜索