做者:xiaoyuweb
微信公众号:Python数据科学算法
知乎:Python数据分析师浏览器
上期回顾:解读爬虫中HTTP的秘密(基础篇)缓存
上一篇咱们介绍了爬虫中HTTP的基础内容
,相信看过的朋友们应该对HTTP已经有个初步的认识了。本篇博主将分享一些HTTP的高级内容,以及在爬虫中的应用,让你们更深刻理解。这些内容包括:安全
Cookie
原意是"小甜点"的意思,可是在互联网上被用做储存在用户本地终端上的数据。 百度百科是这么解释的:服务器
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(一般通过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265。(能够叫作浏览器缓存)微信
首先,须要明确一个很重要的概念:HTTP是一个无状态的协议。
网络
什么意思呢?举一个简单的例子来理解一下。session
<应用一>dom
好比,咱们网上购物的时候,浏览了几个网页,选了几样商品放入了购物车。可是因为HTTP的无状态特色,当咱们结帐的时候服务器并不知道操做的用户是谁,即没法记录上下文的信息,这严重的妨碍了web应用程序交互式的操做。
为了解决HTTP的无状态的问题,Cookie就应运而生了。Cookie绕开了HTTP的无状态性,提供了一种"额外手段"维护了用户跟服务器会话中的状态。说白了,Cookie就是一小段数据储存在本地,记录并标识了用户身份,以便服务器辨认。
这其实至关于让一个失忆的人今后有了记忆。所以,不管当咱们购买几回商品,退货,结帐等,服务器都能经过这个标识来判断出你是谁。
还有一个常见的例子,就是登陆
。
<应用二>
当咱们登陆某个网站输入用户名和密码后,通常浏览器会提示是"是否保存密码"。咱们一般会勾选保存,那么这样带来的好处就是在之后的一段时间咱们访问该网站都会自动登陆而没必要每次都去敲用户名和密码了。
也正是这个缘由,简化了爬虫中模拟登陆的问题,每次登陆只要post
一个Cookie
信息就能够了,而避免了每次都post
登陆信息。固然,这只针对一部分网站而言,一些复杂的网站会按期的变换一些算法,使得Cookie频繁的失效,这时候就须要post登陆信息了或者模拟找到算法的规律。
关于爬虫模拟登陆
的详细内容后续后专门开一篇和你们分享。
Cookie有两种类型:持久化Cookie
,非持久化Cookie
。
持久化Cookie:表示Cookie会保存到本地磁盘上,关闭浏览器再次打开,Cookie依然有效直到设置的expire时间。
**非持久化Cookie:**表示Cookie会在本地内存中,生命周期会受浏览器开关状态影响,只要浏览器关闭,Cookie则失效。
下面是HTTP请求中使用Cookie所实现的整个web交互过程
。
博主以一个访问豆瓣
的实际例子做为上述过程的具体说明和描述。
<1>步骤1的请求头
<2>步骤2/3的响应头
POST请求(用户名密码等)
生成一个Cookie,并经过响应头的
set-Cookie
字段返回此Cookie信息。
<3>步骤5的请求头
<4>步骤7的响应头
无set-Cookie
字段信息,由于服务器已经辨别了这个用户刚刚提交的Cookie信息。
格式:
属性:
名称
。域名
,该域名可使多个web服务器共享Cookie
。所在目录
,“/”
表示根目录。生命周期
。若设置该值,则到此时间Cookie会失效。若没有设置该值,默认与session一块儿失效。浏览器关闭,Cookie失效。传输方式
,默认
是不安全的HTTP链接
。httponly
属性,若此属性为true
,则只能在http的请求头
中携带Cookie信息。百度百科是这么解释的:
Session
: 在计算机中,尤为是在网络应用中,称为“会话控制
”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,若是该用户尚未会话,则 Web服务器将自动建立一个 Session 对象。当会话过时或被放弃后,服务器将终止该会话。
一样是由于HTTP是一个无状态协议
。Session
和Cookie
的存在都是为了解决这个问题的。
因为服务器自己并不会维持用户的上下文,所以为了实现会话的跟踪,不得不想出一种办法。 Session正是一种保存上下文的机制
,对于每个用户来说,用户所产生的变量值都保存在了服务器端,这样就使得整个会话都衔接的上,而每一个用户有本身独一无二的ID,咱们叫作SessionID
。
这个要从SessionID
提及。咱们上面提到服务器会每一个用户建立一个SessionID
,那么咱们该如何使用它呢?
SessionID
有以下几种使用方式:
这是咱们最经常使用的方式,Cookie至关于一个SessionID的高级应用
,是SessionID的载体或者容器
。咱们说Cookie能够用来识别用户身份,也是由于SessionID的缘故。
所以,能够说Session是服务端的解决方案,实现了web的会话跟踪,而Cookie是客户端的解决方案,实现了跟踪过程的用户识别。
Session是真正解决HTTP无状态的方案,而Cookie只是实现了Session过程当中的SessionID方式。
Cookie的使用给用户带来了极大的方便,以及很好的用户体验。可是Cookie存在着一些安全问题,Cookie储存在本地会很大程度暴露用户信息。所以,用户能够选择禁用Cookie。
那么另外一种实现SessionID的方式就是URL重写
。URL重写就是把SessionID附加在URL里,能够做为URL路径附加信息或者查询字符串附加在URL后面。
就是说用户全部的请求的URL中都要有sesssionID这个东西,不然没法保持会话的持久状态。
服务器会修改表单,设置一个SessionID
的隐藏字段,用户须要将SessionID
填写到隐藏字段
中提交表单,以让服务器知道用户身份。
隐藏字段也是爬虫中的反爬策略之一,若是咱们爬虫提交的表单没有填写隐藏字段,那么服务器会认为这是一种爬虫行为而禁掉,或者提交的内容不正确也可能形成一样的后果。所以,每次爬取前有必要查看一下是否存在隐藏字段。固然,关于隐藏字段还有更复杂的玩法这里就不详细介绍了。
有时候咱们可能会误觉得关闭了浏览器,Session
就消失了。其实,Session
并无消失,若是消失,消失的也是Cookie
(若是储存在内存的话)。
Session是储存在服务端的,注意是服务端。而服务端是不会知道浏览器何时关闭了的,可是服务端又不能一直开着Session,那样会损耗服务器资源。所以,为了解决这个问题,**服务端通常会设置Session超时,经过检测用户活动状态来判断是否超时。**若是超时,那么整个会话Session才真正消失,否则仍是会开着直到超时。
若是Cookie是本地储存在磁盘上的,在咱们关闭浏览器的很短一段时间内再次打开浏览器,仍是会回到刚才那个Session会话。可是若是Cookie储存在内存中,再次打开时浏览器已经忘记了Cookie,那么就没法和刚才的会话链接上了。
结论是:关闭浏览器并不会使服务端Session对象消失。
注销和关闭浏览器有着本质的区别,注销实际上会使Session
对象消失。就好比咱们在网页上点击注销同样,用户信息就都被清空了。若是须要链接Session,须要从新建立Session。
结论是:注销会使服务端Session对象消失。
依旧百度百科一下:
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
中,提供了身份验证与加密通信方法。如今它被普遍用于万维网上安全敏感的通信,例如交易支付方面。
超文本传输协议
HTTP协议
被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式
发送内容,不提供任何方式的数据加密,若是攻击者截取了Web浏览器和网站服务器之间的传输报文,就能够直接读懂其中的信息,所以HTTP协议不适合传输一些敏感信息,好比信用卡号、密码
等。为了解决HTTP协议的这一缺陷,须要使用另外一种协议:
安全套接字层超文本传输协议HTTPS。
为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议
,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。
HTTPS和HTTP的区别主要为如下四点:
1、https协议须要到
ca申请证书
,通常免费证书不多,须要交费。2、http是超文本传输协议,信息是明文传输,
https
则是具备安全性的ssl加密传输协议
。3、http和https使用的是彻底不一样的链接方式,用的
端口
也不同,前者是80
,后者是443
。4、http的链接很简单,是
无状态
的;HTTPS协议
是由SSL+HTTP协议
构建的可进行加密传输、身份认证的网络协议,比http协议安全。
乍一看感受HTTPs有点像反爬的手段,经过上面的了解,咱们发现HTTPs是对服务器端的验证,经过CA证书
保证了咱们访问的网站是有身份的,而非其余假网站。相反,咱们爬虫模拟的是客户端,并不受HTTPs的限制。
所以,HTTPs不影响咱们爬虫。
可是,咱们在爬虫的过程仍然也会遇到过相似SSL不经过之类的错误。好比,博主之前用requests访问HTTPs的时候遇到过这样的坑,但最后究其缘由是同时打开了fiddler
形成的。
请参考知乎:www.zhihu.com/question/40… 有相应的解决办法。
本篇向你们介绍了爬虫中HTTP的高级使用内容,主要围绕Cookie
、Session
和HTTPs
进行展开。后续会针对本篇内容进行详细的爬虫模拟登陆分享
。
若有不对的地方,欢迎你们指正。
关注微信公众号Python数据科学,获取 120G
人工智能 学习资料。
知乎:Python数据分析师