爬虫基础——会话和Cookie
会话和Cookie
在浏览网站的过程中,我们经常遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站。
有时候过一段时间就需要重新登录,有一些网站则打开浏览器就直接自动登录了,并且长时间不失效,这就涉及到会话和Cookie的相关知识。
静态网页和动态网页
使用前文的HTML示例代码
这是一个基础的HTML代码,我们将其保存为一个.html文件,把它放在某台具有固定公网IP的主机上,主机上装上Apache或Nginx等服务器,这样这台主机就可以作为服务器了,其他人便可以通过访问服务器看到这个页面,这就搭建了一个最简单的网站。
这种网页的内容是HTML代码编写的,文字、图片等内容均通过HTML代码来指定,这种页面叫作静态网页。
优点:它加载速度快,编写简单。
缺点:可维护性差,不能根据URL灵活多变地显示内容。
例如想给这个网页URL传入一个name参数,让其在网页中显示出来,是无法做到的。
动态网页
动态网页则可以满足灵活性的需求,它可以动态解析URL中参数的变化,关联数据库并动态呈现不同的页面内容,非常灵活多变。
我们现在遇到的大多数网站都是动态网站,一般由JSP、PHP、Python等语言编写,其功能比静态网页更强大和丰富。
无状态HTTP
在了解会话和Cookie之前,还需要理解HTTP的一个特点,叫作无状态。
HTTP的无状态是指HTTP协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。我们向服务器发送请求后,服务器解析后返回对应响应,这个过程是完全独立的,服务器不会记录前后状态的变化。这导致为了保持前后状态,我们要将前面的请求重新传一次,这太浪费资源也太麻烦了。
为了解决这个问题,用于保持HTTP连接状态的技术就出现了,它们分别是会话和Cookie。
原理:会话在服务器端,用来保存用户的会话信息,Cookie在客户端,也就是浏览器端,有了Cookie,浏览器在下次访问网页时会自动附带它发送给服务器,服务器通过识别Cookie并鉴定出是哪个用户,然后再判断用户是否为登陆状态,然后返回对应响应。
可以理解为Cookie里面保存了登陆的凭证,有了它,只需要在下次请求时携带Cookie发送请求而不必重新输入用户名、密码等信息登陆。
因此在爬虫中,有时候处理需要登陆才能访问的页面时,我们一般会直接将登陆成功后获取的Cookie放在请求头里面直接请求,而不必重新模拟登陆。
会话
会话的本来含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称为一个会话。
在Web中,会话对象是用来存储特定用户会话所需的属性和配置信息。当用户在应用程序和Web页之间跳转时,存储在会话对象中的变量将保持不变。
当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个会话对象。当会话过期或被放弃后,服务器将终止该会话。
Cookie
Cookie指网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据。
运行过程
当客户端第一次请求服务器时,服务器会返回一个响应头中带有Set-Cookie字段的响应给客户端,用来标记用户,客户端浏览器会把Cookie保存起来。
当浏览器下一次再请求该网站时,浏览器会把此Cookie放到请求头一起提交给服务器,Cookie携带了会话的ID信息,服务器就可以找到这个Cookie对应的会话是什么,来辨认用户状态。
所以Cookie和会话就像是一把锁和钥匙,Cookie是钥匙,会话是锁;一个处于客户端,一个处于服务端,二者共同协作,实现了登陆会话控制。
Cookie的属性结构
接下来,我们看看Cookie都有哪些内容,这里以知乎为例,
登陆知乎后,在浏览器右键选择检查(审查元素),在开发者选项中打开Application选项卡,左侧Storage中,点击Cookie,如下图所示。
这里可以看到很多条目,每个条目都可以称为Cookie。它有如下几个属性
Name:该Cookie的名称,一旦创建,名称便不可更改。
Value:该Cookie的值,如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。
Domain:可以访问该Cookie的域名,例如如果设置为.http://zhihu.com,则所有以http://zhihu.com结尾的域名都可以访问该Cookie。
Path:该Cookie的使用路径,如果设置为/path/,则只有路径为/path/的页面可以访问该Cookie。如果设置为/,则本域名下的所有页面都可以访问该Cookie。
Expires/Max Age:该Cookie失效的时间,单位为秒,通过它可以计算出其有效时间。
如果Max Age为正数,则该Cookie在Max Age秒之后失效。
如果Max Age为负数,则关闭浏览器是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的Expires/Max Age字段决定了过期时间,持久化登录的网站就是把Cookie的有效时间和会话有效期设置的比较长而已。