Python爬虫教程

第一章: 初学乍练-Python快速入门

第二章: 初窥门径-从全局把握网络爬虫

第三章: 爬虫数据-网页与JSON

第四章: 爬虫核心-HTTP协议

第五章: 手到擒来-数据的抓包

第六章: 利刃出鞘-HTTP请求库

第七章: 尘埃落定-数据的解析

第八章: 逆向初探-JS逆向

第九章: 爬虫进阶-Selenium, 中间人拦截

第十章:斗转星移-常用的反爬策略及应对方法

首页 > Python爬虫教程 > 第四章: 爬虫核心-HTTP协议 > 4.2节: HTTP是无状态协议

4.2节: HTTP是无状态协议

薯条老师 2021-02-19 09:42:04 238449 0

编辑 收藏

广州番禺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的欢迎信息。从用户登录到跳转到首页,浏览器一共发起了两次请求。第一次为登录请求,将用户的用户名和密码作为请求参数,服务器验证通过以后,向浏览器响应验证成功的消息。

第二次请求为访问站点首页,由于前后两次请求彼此独立,且第二次请求不包含第一次请求的上文信息,那么服务端无法识别当前用户是否已登录成功,也就无法在首页中显示欢迎信息。

1613699109(1).jpg 

承上,这里的上下文信息就是一种状态信息。状态信息可以通俗地理解为客户端的身份标识。同学们必须理解,无状态针对的是协议本身,我们在具体实现的过程中,可以对协议进行扩展,在每一次请求时都加上一个身份标识字段,这样客户端的每一次请求就有了“状态”。

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信息:

 1613699242(1).jpg

关于浏览器等调试工具的使用,在后续课程中会进行详细讲解。感兴趣的同学可以先自行学习如何使用浏览器来进行网络调试。通过浏览器工具获取到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学习资料:


欢迎 发表评论: