广州番禺Python, Java小班周末班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6
4.2.1什么是无状态协议?
在4.1节中讲解网络协议时,讲到网络通信的过程是一个请求+响应的过程。网络协议中的无状态是指,每一次请求都是独立的,不会携带状态信息。
请求独立意味着请求与请求之间不保存上下文信息。例如浏览器前后向http服务器发起两次请求,服务器处理完第1次请求,立即关闭连接,处理浏览器的第2个请求时再重新建立连接。这两次请求彼此独立,互不依赖。
HTTP协议的这种特性简化了服务端的处理。服务端无需关心客户端的N次请求是否相关,只需简单地根据当前请求的参数进行特定处理,处理完毕以后,再关闭连接。但在某些场景中,我们需要保存请求的上下文信息,以进行会话跟踪。
比如用户A登录成功以后,需要在网站首页显示对用户A的欢迎信息。从用户登录到跳转到首页,浏览器一共发起了两次请求。第一次为登录请求,将用户的用户名和密码作为请求参数,服务器验证通过以后,向浏览器响应验证成功的消息。
第二次请求为访问站点首页,由于前后两次请求彼此独立,且第二次请求不包含第一次请求的上文信息,那么服务端无法识别当前用户是否已登录成功,也就无法在首页中显示欢迎信息。
承上,这里的上下文信息就是一种状态信息。状态信息可以通俗地理解为客户端的身份标识。同学们必须理解,无状态针对的是协议本身,我们在具体实现的过程中,可以对协议进行扩展,在每一次请求时都加上一个身份标识字段,这样客户端的每一次请求就有了“状态”。
HTTP协议的这种无状态特性以及对保持连接状态的必要性,应运而生了客户端cookie和服务端session的解决方案。
4.2.2 客户端cookie
上节讲到了保持客户端连接状态的必要性,而cookie正是这样的一种解决方案。关于cookie的定义,可以参考某百科的解释:
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
根据百科对cookie的解释,我们可以总结出以下三点关键信息:
(1) cookie是文本文件
(2) cookie文件中存储的数据用来识别用户身份
(3) cookie暂时或永久地保存于用户所在的计算机中
进一步理解cookie, 需要再回到HTTP协议。在HTTP协议中定义了两个字段,分别是Cookie和Set-Cookie。
(1) Set-Cookie
Set-Cookie是在HTTP服务器对用户验证成功以后向客户端发送的一个响应字段,包含在HTTP响应的头部中。HTTP Set-Cookie响应头的格式如下所示:
Set-Cookie: <name>=<value>[; <name>=<value>]...
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure]
注:<>表示必传参数,[]表示可选参数
Set-Cookie包含若干个键值对,每个键值以英文的;进行分隔。其中expires, domain, path, secure为预定义的选项名。各选项解释如下表所示:
选项名 | 描述
|
expires | 设置cookie的有效期,如超出有效期,cookie将失效。未设置该选项时,cookie会在浏览器关闭时失效。expires的日期格式可查阅HTTP协议文档。
|
domain | 用来设置服务器所在的域名。cookie中的域名为该域名,或该域名的父级域名时,才可以发送。 |
path | 设置一个 URL 路径。该路径必须出现在客户端请求的资源的路径中,否则不会发送 Cookie。 |
secure | 用来指定,只有在请求使用SSL和HTTPS协议的时候才会发送cookie到服务器。 |
(2) Cookie
Cookie是HTTP客户端向HTTP服务器请求时所携带的请求字段,包含在HTTP头部,用来向服务器发送用户的状态信息。这里的状态信息实际是服务器在Set-Cookie字段中响应的状态信息。服务器会根据HTTP请求头中的cookie字段的信息来进行验证,验证通过以后,用户的状态才得以延续。
浏览器不仅是HTTP客户端,还是一个方便的网络调试工具,在浏览器中可以分析HTTP的请求过程,以及查找HTTP请求的字段信息。下图为薯条老师使用谷歌浏览器登录知乎以后所查找到的cookie以及UA信息:
关于浏览器等调试工具的使用,在后续课程中会进行详细讲解。感兴趣的同学可以先自行学习如何使用浏览器来进行网络调试。通过浏览器工具获取到cookie以后,我们可以将cookie复制下来, 用于爬虫程序中。
代码实例-使用requests模块发送cookie:
import requests """ (1) 字典类型变量headers,用来定义HTTP请求头。我们可以在headers变量中定义User-Agent,cookie等字段 """ headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36', # 在HTTP请求头中发送cookie 'cookie':'id=22932bc7cac200a2||t=1596548529|et=730|cs=002213fd4896b0a597850f7bf7' } # 以下url并不存在,同学们在实际练习时,可将之替换为待抓取的网页的url url = "http://www.justtest.com" response = requests.get(url, headers = headers)
4.2.3 服务端session
用户登录成功站点以后,服务端会创建一个标识用户身份的cookie,然后将cookie响应给客户端。用户下次访问站点时,浏览器会从缓存或磁盘中读取cookie信息,如果cookie未过期,并且与请求的站点信息(域名,请求URL等)匹配,那么会将cookie写入HTTP请求头,发送至服务端进行验证。
那么,服务端是怎么进行验证的呢?
以用户登录进行举例,用户在登录成功以后,服务端会为该用户创建一个session,该session保存了用户的状态信息。同时为当前session分配一个唯一的编号。在上节中讲到了Set-Cookie,服务端在发送cookie时,会将该编号写入Set-Cookie的字段中。
HTTP Set-Cookie请求头举例:
Set-Cookie:uid=xxxxxxx;Path=/;
例子中的uid即为标识用户的唯一编号,服务端在具体实现中会采用其它的名称来进行表示,例如sessionid, jsessionid等。服务端的验证逻辑主要为:判断客户端cookie中的session编号是否存在,以及是否过期。
关于服务端session的验证逻辑,安全性等,感兴趣的同学们可以查找相关资料作进一步学习。
4.2.4 知识要点
(1) 网络通信的过程是一个请求+响应的过程。网络协议中的无状态是指,每一次请求都是独立的,不会携带状态信息。
(2) HTTP协议是无状态协议。网络协议中的无状态是指,每一次请求都是独立的,不会携带状态信息。
(1) cookie是文本文件,文件中存储的数据用来识别用户身份.cookie文件暂时或永久地保存于用户所在的计算机中
(2) Set-Cookie是在HTTP服务器对用户验证成功以后向客户端发送的一个响应字段,包含在HTTP响应的头部中。Cookie是HTTP客户端向HTTP服务器请求时所携带的请求字段,包含在HTTP头部,用来向服务器发送用户的状态信息。
(3) 在session机制中,服务端会为用户创建一个session,同时为当前session分配一个唯一的编号。服务端的验证逻辑主要为,判断客户端cookie中的session编号是否存在,以及是否过期等。
4.2.5 最具实力的小班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4) Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲
扫码免费领取Python学习资料: