前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解读爬虫中HTTP的秘密(高阶篇)

解读爬虫中HTTP的秘密(高阶篇)

作者头像
Python数据科学
发布2018-08-06 18:21:22
6090
发布2018-08-06 18:21:22
举报
文章被收录于专栏:Python数据科学Python数据科学

前情回顾:解读爬虫中HTTP的秘密(基础篇)

上一篇我们介绍了爬虫中HTTP的基础内容,相信看过的朋友们应该对HTTP已经有个初步的认识了。本篇博主将分享一些HTTP的高级内容,以及在爬虫中的应用,让大家更深入理解。这些内容包括:

  • Cookie解读
  • Session解读
  • HTTPs解读

Cookie解读

  • 什么是Cookie?

Cookie原意是"小甜点"的意思,但是在互联网上被用作储存在用户本地终端上的数据。

百度百科是这么解释的:

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265。(可以叫做浏览器缓存)

  • 为什么要使用Cookie?

首先,需要明确一个很重要的概念:HTTP是一个无状态的协议。

什么意思呢?举一个简单的例子来理解一下。

应用一:

比如,我们网上购物的时候,浏览了几个网页,选了几样商品放入了购物车。但是由于HTTP的无状态特点,当我们结账的时候服务器并不知道操作的用户是谁,即无法记录上下文的信息,这严重的妨碍了web应用程序交互式的操作。

为了解决HTTP的无状态的问题,Cookie就应运而生了。Cookie绕开了HTTP的无状态性,提供了一种"额外手段"维护了用户跟服务器会话中的状态。说白了,Cookie就是一小段数据储存在本地,记录并标识了用户身份,以便服务器辨认。这其实相当于让一个失忆的人从此有了记忆。因此,无论当我们购买几次商品,退货,结账等,服务器都能通过这个标识来判断出你是谁。

还有一个常见的例子,就是登录。

应用二:

当我们登录某个网站输入用户名和密码后,一般浏览器会提示是"是否保存密码"。我们通常会勾选保存,那么这样带来的好处就是在以后的一段时间我们访问该网站都会自动登录而不必每次都去敲用户名和密码了。

也正是这个原因,简化了爬虫中模拟登录的问题,每次登录只要post一个Cookie信息就可以了,而避免了每次都post登录信息。当然,这只针对一部分网站而言,一些复杂的网站会定期的变换一些算法,使得Cookie频繁的失效,这时候就需要post登录信息了或者模拟找到算法的规律。

关于爬虫模拟登录的详细内容后续后专门开一篇和大家分享。

  • Cookie的分类

Cookie有两种类型:持久化Cookie,非持久化Cookie。

持久化Cookie:

表示Cookie会保存到本地磁盘上,关闭浏览器再次打开,Cookie依然有效直到设置的expire时间。

非持久化Cookie:

表示Cookie会在本地内存中,生命周期会受浏览器开关状态影响,只要浏览器关闭,Cookie则失效。

  • HTTP+Cookie的交互过程

下面是HTTP请求中使用Cookie所实现的整个web交互过程。

博主以一个访问豆瓣的实际例子作为上述过程的具体说明和描述。

<1>步骤1的请求头

看到请求头里面没有Cookie,只是常规的头域字段信息。

<2>步骤2/3的响应头

服务器根据POST请求(用户名密码等)生成一个Cookie,并通过响应头的set-Cookie字段返回此Cookie信息。

<3>步骤5的请求头

再一次刷新页面的请求头中就有了获取Cookie信息。

<4>步骤7的响应头

第二次的响应头无set-Cookie字段信息,因为服务器已经辨别了这个用户刚刚提交的Cookie信息。

  • Cookie的格式和属性

格式:

<1>客户端发送Cookie(键值对)

Cookie:key1=value1; key2=value2; key3=value3

<2>服务器响应Cookie

Set-Cookie: name=value;expires=date;path=path;domain=domain_name;secure

属性:

<1>name:为一个Cookie的名称。

<2>domain:为可以访问此Cookie的域名,该域名可以使多个web服务器共享Cookie。

<3>path:表示Cookie所在目录,“/”表示根目录。

<4>expires/max-age:为Cookie的生命周期。若设置该值,则到此时间Cookie会失效。若没有设置该值,默认与session一起失效。浏览器关闭,Cookie失效。

<5>secure:布尔值,指定Cookie的传输方式,默认是不安全的HTTP连接。

<6>http:Cookie的httponly属性,若此属性为true,则只能在http的请求头中携带Cookie信息。

Session解读

  • 什么是Session?

百度百科是这么解释的:

Session: 在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

  • 为什么要使用Session?

同样是因为HTTP是一个无状态协议。Session和Cookie的存在都是为了解决这个问题的。

由于服务器本身并不会维持用户的上下文,因此为了实现会话的跟踪,不得不想出一种办法。

Session正是一种保存上下文的机制,对于每一个用户来讲,用户所产生的变量值都保存在了服务器端,这样就使得整个会话都衔接的上,而每个用户有自己独一无二的ID,我们叫做SessionID。

  • Session和Cookie有什么联系?

这个要从SessionID说起。我们上面提到服务器会每个用户创建一个SessionID,那么我们该如何使用它呢?

SessionID有如下几种使用方式:

<1>Cookie

这是我们最常用的方式,Cookie相当于一个SessionID的高级应用,是SessionID的载体或者容器。我们说Cookie可以用来识别用户身份,也是因为SessionID的缘故。

因此,可以说Session是服务端的解决方案,实现了web的会话跟踪,而Cookie是客户端的解决方案,实现了跟踪过程的用户识别。

Session是真正解决HTTP无状态的方案,而Cookie只是实现了Session过程中的SessionID方式。

<2>URL重写

Cookie的使用给用户带来了极大的方便,以及很好的用户体验。但是Cookie存在着一些安全问题,Cookie储存在本地会很大程度暴露用户信息。因此,用户可以选择禁用Cookie。

那么另一种实现SessionID的方式就是URL重写。URL重写就是把SessionID附加在URL里,可以作为URL路径附加信息或者查询字符串附加在URL后面。

就是说用户所有的请求的URL中都要有sesssionID这个东西,否则无法保持会话的持久状态。

<3>表单隐藏字段

服务器会修改表单,设置一个SessionID的隐藏字段,用户需要将SessionID填写到隐藏字段中提交表单,以让服务器知道用户身份。

隐藏字段也是爬虫中的反爬策略之一,如果我们爬虫提交的表单没有填写隐藏字段,那么服务器会认为这是一种爬虫行为而禁掉,或者提交的内容不正确也可能造成同样的后果。因此,每次爬取前有必要查看一下是否存在隐藏字段。当然,关于隐藏字段还有更复杂的玩法这里就不详细介绍了。

  • Session的关闭

<关闭浏览器>

有时候我们可能会误以为关闭了浏览器,Session就消失了。其实,Session并没有消失,如果消失,消失的也是Cookie(如果储存在内存的话)。

Session是储存在服务端的,注意是服务端。而服务端是不会知道浏览器什么时候关闭了的,但是服务端又不能一直开着Session,那样会损耗服务器资源。因此,为了解决这个问题,服务端一般会设置Session超时,通过检测用户活动状态来判断是否超时。如果超时,那么整个会话Session才真正消失,不然还是会开着直到超时。

如果Cookie是本地储存在磁盘上的,在我们关闭浏览器的很短一段时间内再次打开浏览器,还是会回到刚才那个Session会话。但是如果Cookie储存在内存中,再次打开时浏览器已经忘记了Cookie,那么就无法和刚才的会话连接上了。

结论是:关闭浏览器并不会使服务端Session对象消失。

<注销>

注销和关闭浏览器有着本质的区别,注销实际上会使Session对象消失。就比如我们在网页上点击注销一样,用户信息就都被清空了。如果需要连接Session,需要重新创建Session。

结论是:注销会使服务端Session对象消失。

HTTPs解读

  • 什么是HTTPs?

依旧百度百科一下:

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

  • HTTPs与HTTP的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。 HTTPS和HTTP的区别主要为以下四点: 一、https协议需要到ca申请证书,一般免费证书很少,需要交费。 二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  • HTTPs对爬虫的影响

乍一看感觉HTTPs有点像反爬的手段,通过上面的了解,我们发现HTTPs是对服务器端的验证,通过CA证书保证了我们访问的网站是有身份的,而非其他假网站。相反,我们爬虫模拟的是客户端,并不受HTTPs的限制。

因此,HTTPs不影响我们爬虫。

但是,我们在爬虫的过程仍然也会遇到过类似SSL不通过之类的错误。比如,博主以前用requests访问HTTPs的时候遇到过这样的坑,但最后究其原因是同时打开了fiddler造成的。

请参考知乎:

https://www.zhihu.com/question/40025043 有相应的解决办法。

总结

本篇向大家介绍了爬虫中HTTP的高级使用内容,主要围绕Cookie、Session和HTTPs进行展开。后续会针对本篇内容进行详细的爬虫模拟登录分享。

如有不对的地方,欢迎大家指正。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档