解读爬虫中HTTP的秘密(高阶篇)
作者:xiaoyu
微信公众号:Python数据科学
知乎:Python数据分析师
上期回顾:解读爬虫中HTTP的秘密(基础篇)
上一篇我们介绍了爬虫中HTTP的基础内容
,相信看过的朋友们应该对HTTP已经有个初步的认识了。本篇博主将分享一些HTTP的高级内容,以及在爬虫中的应用,让大家更深入理解。这些内容包括:
- Cookie解读
- Session解读
- HTTPs解读
Cookie解读
1.什么是Cookie?
Cookie
原意是"小甜点"的意思,但是在互联网上被用作储存在用户本地终端上的数据。
百度百科是这么解释的:
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session
跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是
RFC6265。(可以叫做浏览器缓存)
2.为什么要使用Cookie?
首先,需要明确一个很重要的概念:HTTP是一个无状态的协议。
什么意思呢?举一个简单的例子来理解一下。
<应用一>
比如,我们网上购物的时候,浏览了几个网页,选了几样商品放入了购物车。但是由于HTTP的无状态特点,当我们结账的时候服务器并不知道操作的用户是谁,即无法记录上下文的信息,这严重的妨碍了web应用程序交互式的操作。
为了解决HTTP的无状态的问题,Cookie就应运而生了。Cookie绕开了HTTP的无状态性,提供了一种"额外手段"维护了用户跟服务器会话中的状态。说白了,Cookie就是一小段数据储存在本地,记录并标识了用户身份,以便服务器辨认。
这其实相当于让一个失忆的人从此有了记忆。因此,无论当我们购买几次商品,退货,结账等,服务器都能通过这个标识来判断出你是谁。
还有一个常见的例子,就是登录
。
<应用二>
当我们登录某个网站输入用户名和密码后,一般浏览器会提示是"是否保存密码"。我们通常会勾选保存,那么这样带来的好处就是在以后的一段时间我们访问该网站都会自动登录而不必每次都去敲用户名和密码了。
也正是这个原因,简化了爬虫中模拟登录的问题,每次登录只要post
一个Cookie
信息就可以了,而避免了每次都post
登录信息。当然,这只针对一部分网站而言,一些复杂的网站会定期的变换一些算法,使得Cookie频繁的失效,这时候就需要post登录信息了或者模拟找到算法的规律。
关于爬虫模拟登录
的详细内容后续后专门开一篇和大家分享。
3.Cookie的分类
Cookie有两种类型:持久化Cookie
,非持久化Cookie
。
- 持久化Cookie:表示Cookie会保存到本地磁盘上,关闭浏览器再次打开,Cookie依然有效直到设置的expire时间。
- 非持久化Cookie:表示Cookie会在本地内存中,生命周期会受浏览器开关状态影响,只要浏览器关闭,Cookie则失效。
4.HTTP+Cookie的交互过程
下面是HTTP请求中使用Cookie所实现的整个web交互过程
。
博主以一个访问豆瓣
的实际例子作为上述过程的具体说明和描述。
<1>步骤1的请求头
看到请求头里面没有Cookie,只是常规的头域字段信息。
<2>步骤2/3的响应头
服务器根据POST请求(用户名密码等)
生成一个Cookie,并通过响应头的set-Cookie
字段返回此Cookie信息。
<3>步骤5的请求头
再一次刷新页面的请求头中就有了获取Cookie信息。
<4>步骤7的响应头
第二次的响应头无set-Cookie
字段信息,因为服务器已经辨别了这个用户刚刚提交的Cookie信息。
5.Cookie的格式和属性
格式:
- 客户端发送Cookie(键值对):Cookie:key1=value1; key2=value2; key3=value3
- 服务器响应Cookie:Set-Cookie: name=value;expires=date;path=path;domain=domain_name;secure
属性:
- name:为一个Cookie的
名称
。 - domain:为可以访问此Cookie的
域名
,该域名可以使多个web服务器共享Cookie
。 - path:表示Cookie
所在目录
,“/”
表示根目录。 - expires/max-age:为Cookie的
生命周期
。若设置该值,则到此时间Cookie会失效。若没有设置该值,默认与session一起失效。浏览器关闭,Cookie失效。 - secure:布尔值,指定Cookie的
传输方式
,默认
是不安全的HTTP连接
。 - http:Cookie的
httponly
属性,若此属性为true
,则只能在http的请求头
中携带Cookie信息。
Session解读
1.什么是Session?
百度百科是这么解释的:
Session
: 在计算机中,尤其是在网络应用中,称为“会话控制
”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
2.为什么要使用Session?
同样是因为HTTP是一个无状态协议
。Session
和Cookie
的存在都是为了解决这个问题的。
由于服务器本身并不会维持用户的上下文,因此为了实现会话的跟踪,不得不想出一种办法。Session正是一种保存上下文的机制
,对于每一个用户来讲,用户所产生的变量值都保存在了服务器端,这样就使得整个会话都衔接的上,而每个用户有自己独一无二的ID,我们叫做SessionID
。
3.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
填写到隐藏字段
中提交表单,以让服务器知道用户身份。
隐藏字段也是爬虫中的反爬策略之一,如果我们爬虫提交的表单没有填写隐藏字段,那么服务器会认为这是一种爬虫行为而禁掉,或者提交的内容不正确也可能造成同样的后果。因此,每次爬取前有必要查看一下是否存在隐藏字段。当然,关于隐藏字段还有更复杂的玩法这里就不详细介绍了。
4.Session的关闭
<关闭浏览器>
有时候我们可能会误以为关闭了浏览器,Session
就消失了。其实,Session
并没有消失,如果消失,消失的也是Cookie
(如果储存在内存的话)。
Session是储存在服务端的,注意是服务端。而服务端是不会知道浏览器什么时候关闭了的,但是服务端又不能一直开着Session,那样会损耗服务器资源。因此,为了解决这个问题,服务端一般会设置Session超时,通过检测用户活动状态来判断是否超时。如果超时,那么整个会话Session才真正消失,不然还是会开着直到超时。
如果Cookie是本地储存在磁盘上的,在我们关闭浏览器的很短一段时间内再次打开浏览器,还是会回到刚才那个Session会话。但是如果Cookie储存在内存中,再次打开时浏览器已经忘记了Cookie,那么就无法和刚才的会话连接上了。
结论是:关闭浏览器并不会使服务端Session对象消失。
<注销>
注销和关闭浏览器有着本质的区别,注销实际上会使Session
对象消失。就比如我们在网页上点击注销一样,用户信息就都被清空了。如果需要连接Session,需要重新创建Session。
结论是:注销会使服务端Session对象消失。
HTTPs解读
1.什么是HTTPs?
依旧百度百科一下:
HTTPS
(全称:Hyper Text Transfer Protocol over Secure SocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版
。即HTTP下加入SSL
层,HTTPS的安全基础是SSL
,因此加密的详细内容就需要SSL。
它是一个URIscheme
(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP
与TCP
之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器NetscapeNavigator
中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
2.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协议安全。
3.HTTPs对爬虫的影响
乍一看感觉HTTPs有点像反爬的手段,通过上面的了解,我们发现HTTPs是对服务器端的验证,通过CA证书
保证了我们访问的网站是有身份的,而非其他假网站。相反,我们爬虫模拟的是客户端,并不受HTTPs的限制。
因此,HTTPs不影响我们爬虫。
但是,我们在爬虫的过程仍然也会遇到过类似SSL不通过之类的错误。比如,博主以前用requests访问HTTPs的时候遇到过这样的坑,但最后究其原因是同时打开了fiddler
造成的。
请参考知乎:https://www.zhihu.com/questio... 有相应的解决办法。
总结
本篇向大家介绍了爬虫中HTTP的高级使用内容,主要围绕Cookie
、Session
和HTTPS
进行展开。后续会针对本篇内容进行详细的爬虫模拟登录分享
。
如有不对的地方,欢迎大家指正。
关注微信公众号Python数据科学,获取 120G
人工智能 学习资料。