Python公开课 - 爬虫之session和cookies

前言

在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问 ,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。

还有一些网站,在打开浏览器时就自动登录了,而且很长时间都不会失效。

这其中的原理就涉及到session和cookie。

页面类型

一般来说对于登录,静态页面和动态页面都可以实现,但是它们也有区别。

静态页面

静态页面如之前章节所阐述,依赖html和css就可以实现。它加载速度快,编写简单,但是存在很大的缺陷,如可维护性差,不能根据URL灵活多变地显示内容等。

静态页面实现登录,主要依赖get/post请求,和页面跳转来完成。

动态页面

动态页面可以动态解析URL 中参数的变化,并根据这些参数动态呈现不同的页面内容,非常灵活。

目前绝大多数网站都是动态网站,它们不再是一个简单的 HTML,并给用户展现丰富的功能。

动态页面登录的实现相比静态页面更加灵活,可以通过ajax等方式来完成。

HTTP没有状态

HTTP的无状态是指 HTTP 协议对事务处理是没有存下来的,也就是说服务器不知道客户端是 什么状态。

当客户端向服务器发送请求后,服务器根据这个请求并做出响应。

服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。

这时就需要通过session和cookies来维持http的连接状态了。

session和cookie

session存在服务端,也就是网站的服务器,用来保存用户的会话信息; cookies存在客户端,作为客户端的识别id, 辨别身份。

会话维持

当客户端第一次请求服务器时,服务器会返回一个请求头中带有 Set-Cookie 字段的响应给客户端,用来标记是哪一个用户。

客户端浏览器会把 Cookies 保存起来。 当浏览器下一次再请求该网站时,浏览器会把此 Cookies 自动放到请求头一起提交给服务器。

cookies 携带了会话ID信息,服务器检查该 Cookies 即可找到对应的会话是什么,然后再判断会话来以此来辨认用户状态。

以登录来举例,如果用户未登录,则会话中的会存放一个未登录的状态,而登录成功,则该会话状态置位为已登录,用户登出后,该会话则置位为已登出状态。

cookies和session通过配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。

Cookies属性

  • Name - 该Cookie的名称。一旦创建,该名称便不可更改。
  • Value - 该 Cookie 的值。 如果值为 Unicode字符,需要为字符编码。 如果值为二进制数据,则 需要使用 BASE64 编码。
  • Domain - 可以访问该Cookie的域名
  • Max Age - 该 Cookie失效的时间,单位为秒
  • Path - 该 Cookie 的使用路径。
  • Size - 此 Cookie 的大小。
  • HTTP - Cookie 的 httponly 属性。 若此属性为 true ,则只有在 HTTP 头中会带有此 Cookie 的信息,而不能通过 document.cookie 来访问
  • Secure - 该 Cookie 是否仅被使用安全协议传输。 安全协议有 HTTPS 和 SSL 等,在网络上传 输数据之前先将数据加密。 默认为 false

小结

做web服务端开发的同学一般对session和cookies比较了解,但是对于爬虫来说,反向理解这些概念也非常重要。

相关阅读