爬虫基础之Session和Cookie
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失效,这又是什么情况?其实这里面涉及 Session 和Cookie 的相关知识,本节就来揭开它们的神秘面纱。
静态网页和动态网页
在开始揭秘之前,我们需要先了解一下静态网页和动态网页的概念。还是使用网页的结构的实例代码,内容如下:
<!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 和 Cookie 共同产生的结果,下面我们来一探究竟。
无状态HTTP
在了解 Session 和 Cookie 之前,我们还需要了解 HTTP 的一个特点,叫作无状态。
HTTP的无状态是指 HTTP协议对事务处理是没有记忆能力的,或者说服务器并不知道客户端处于什么状态。客户端向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。这意味着之后如果需要处理前面的信息,客户端就必须重传,导致需要额外传递一些重复请求,才能获取后续响应,这种效果显然不是我们想要的。为了保持前后状态,肯定不能让客户端将前面的请求全部重传一次,这太浪费资源了,对于需要用户录的页面来说,更是棘手。
这时,两种用于保持 HTTP连接状态的技术出现了,分别是Session和 Cookie。Session在服务端也就是网站的服务器,用来保存用户的 Session 信息;Cookie 在客户端,也可以理解为在浏览器端,有了 Cookie,浏览器在下次访问相同网页时就会自动附带上它,并发送给服务器,服务器通过识别Cookie 鉴定出是哪个用户在访问,然后判断此用户是否处于登录状态,并返回对应的响应。
可以这样理解,Cookie里保存着登录的凭证,客户端在下次请求时只需要将其携带上,就不必重新输入用户名、密码等信息重新登录了。
因此在爬虫中,处理需要先登录才能访问的页面时,我们一般会直接将登录成功后获取的 Cookie放在请求头里面直接请求,而不重新模拟登录。
好了,了解 Session 和 Cookie 的概念之后,再来详细剖析它们的原理。
Session
Session,中文称之为会话,其本义是指有始有终的一系列动作、消息。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一个 Session。
而在 Web 中,Session 对象用来存储特定用户 Session所需的属性及配置信息。这样,当用户在应用程序的页面之间跳转时,存储在 Session对象中的变量将不会丢失,会在整个用户 Session 中一直存在下去。当用户请求来自应用程序的页面时,如果该用户还没有 Session,那么 Web 服务器将自动创建一个 Session 对象。当 Session 过期或被放弃后,服务器将终止该 Session。
Cookie
Cookie,指某些网站为了鉴别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据。
-
Session维持
那么,怎样利用 Cookie 保持状态呢?在客户端第一次请求服务器时,服务器会返回一个响应头中带有 Set-Cookie 字段的响应给客户端,这个字段用来标记用户。客户端浏览器会把 Cookie 保存起来,当下一次请求相同的网站时,把保存的 Cookie 放到请求头中一起提交给服务器。Cookie 中携带着 Session ID 相关信息,服务器通过检査 Cookie 即可找到对应的 Session,继而通过判断 Session 辨认用户状态。如果 Session 当前是有效的,就证明用户处于录状态,此时服务器返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给服务器的 Cookie 是无效的,或者 Session已经过期了,客户端将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。
Cookie 和 Session需要配合,一个在客户端,一个在服务端,二者共同协作,就实现了登录控制。 -
属性结构
接下来,我们看看 Cookie 都包含哪些内容。这里以知乎为例,在浏览器开发者工具中打开Application 选项卡,其中左侧有一部分叫 Storage,Storage 的最后一项即为 Cookies,将其点开如下图所示。
可以看到,列表里有很多条目,其中每个条目都可以称为一个 Cookie 条目。Cookie 具有如下几个属性。
(1)Name:Cookie 的名称。Cookie 一旦创建,名称便不可更改。
(2)Value:Cookie 的值。如果值为 Unicode 字符,则需要为字符编码。如果值为二进制数据,则需要使用 BASE64 编码。
(3)Domain:指定可以访问该Cookie 的域名。例如设置 Domain为 .csdn.net,表示所有以csdn.net 结尾的域名都可以访问该 Cookie。
(4)Path:Cookie 的使用路径。如果设置为/path/,则只有路径为/path/的页面才可以访问该 Cookie。
如果设置为/,则本域名下的所有页面都可以访问该 Cookie。
(5)Max-Age:Cookie失效的时间,单位为秒,常和 Expires 一起使用,通过此属性可以计算出 Cookie的有效时间。Max-Age 如果为正数,则表示 Cookie 在 Max-Age 秒之后失效;如果为负数,则Cookie 在关闭浏览器时失效,而且浏览器不会以任何形式保存该 Cookie。
(6)Size 字段:Cookie 的大小。
(7)HTTP字段:Cookie的httponly属性。若此属性为 true,则只有在 HTTP Headers 中才会带有此 Cookie 的信息,而不能通过 document.cookie 来访问此 Cookie。
(8)Secure:是否仅允许使用安全协议传输Cookie。安全协议有 HTTPS和 SSL等,使用这些协议在网络上传输数据之前会先将数据加密。其默认值为false。
- 会话Cookie和持久Cookie
从表面意思来看,会话 Cookie 就是把 Cookie放在浏览器内存里,关闭浏览器之后,Cookie 即失效;持久 Cookie 则会把 Cookie 保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户的登录状态。
严格来说,其实没有会话 Cookie 和持久 Cookie之分,只是 Max-Age或 Expires 字段决定了 Cookie失效的时间。
因此,一些持久化登录的网站实际上就是把 Cookie 的有效时间和 Session 有效期设置得比较长,下次客户端再访问页面时仍然携带之前的 Cookie,就可以直接呈现登录状态。
常见误区
在谈论 Session 机制的时候,常会听到一种误解–只要关闭浏览器,Session 就消失了。可以想象一下生活中的会员卡,除非顾客主动对店家提出销卡,否则店家是绝对不会轻易删除顾客资料的。对 Session 来说,也一样,除非程序通知服务器删除一个 Session,否则服务器会一直保留。例如程序
一般都是在我们做注销操作时才删除 Session。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器自己将要被关闭,所以服务器压根不会有机会知道浏览器已经关闭。之所以会产生上面的误解,是因为大部分网站使用会话 Cookie来保存 Session ID 信息,而浏览器关闭后 Cookie 就消失了,等浏览器再次连接服务器时,也就无法找到原来的 Session 了。如果把服务器设置的 Cookie 保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookie 发送给服务器,那么再次打开浏览器时,仍然能够找到原来的Session ID,依旧保持登录状态。
而且恰恰是由于关闭浏览器不会导致 Session 被删除,因此需要服务器为 Session 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器才可以认为客户端已经停止了活动,并删除掉 Session 以节省存储空间。
总结
本节介绍了 Session 和 Cookie 的基本概念,这对后文进行网络爬虫的开发有很大的帮助,需要好好掌握。
原文地址:https://blog.csdn.net/Android_xue/article/details/144385619
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!