相关实战案例:[爬虫实战] 爬取小说标题与对应内容
相关爬虫专栏:JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例
一、引入场景
在http协议中,浏览器是无状态(即无记忆)的,对于请求与响应的产生数据,浏览器都不会保留。这对于某些希望记住用户当前状态,保存用户信息的网站就不太友好。cookie与session就是用于处理这个问题的,二者都用于保存用户当前的状态。
二、cookie的作用
概念:cookie 是浏览器端用来跟踪用户状态的机制。
当用户访问网站时会携带一个空cookie发起请求,而服务器返回响应数据时则会传回一个cookie给浏览器作为身份验证。此后再访问该网站就会自动携带这个,作为身份信息查询。
cookie最常见作用为会话管理(跟踪和管理用户的交互行为):
- 登录状态 -- 保存登录信息
- 购物车 -- 保存当前商品状态
- 个性化设置 -- 保存当前用户偏好(语言、主题等)
特点:
- 存储在客户端(浏览器)
- 有过期时间限制
- 安全性较差,可能会被恶意攻击
三、session的作用与其跟cookie的区别
概念:Session是服务器端用来跟踪用户状态的机制。
当用户首次访问服务器时,服务器会为其创建一个独特的Session ID,存储在服务器中。而为了能让浏览器后续请求能带上这个ID,一般也会将Sesion ID通过cookie形式传递给浏览器。
与cookie区别:
- 位置:cookie存于客户端 - session存于服务器端,只给客户端传一个session id
- 内容:cookie存少量、非敏感数据 - session存复杂,敏感数据
- 安全:cookie相对较差(客户端处容易被篡改) - session相对更优(服务器端难以修改)
结:
cookie与session经常协同合作。cookie更像是信使,主要作用是帮助传递session ID。而session因为其安全性高、存储量大,信息位于服务器端等优势,通常被认为是真正的“记忆”所在处。
四、cookie与session在爬虫中的涉及
爬虫中常有遇到需要正确理解cookie/session机制,从而破解含有分页、登录、反爬等的网站。
这里我们就会用到非常强大的工具:requests.session(取代requests.get/post):
1.requests.get/post()的痛点
(1) 无法维持自动化登录状态
HTTP协议是无状态的,requests.get每次都是独立请求,无法获得并保存之前浏览器返回的cookie。这个问题会导致每次请求都必须重新发送登录信息并手动解析与提取,导致代码明显复杂而且也无法维持自动化的登录。
(2) 效率底下
每次调用request.get都会尝试建立一个全新的TCP连接的三次握手还有可能存在的SSL/TLS(安全加密协议)握手。这个过程中重复建立与关闭连接的开销很大,明显拖累爬取进度,效率低下。
(3) 容易触发服务器的连接频率限制
对于部分爬取的网站,requests.get过高的连接/断开频率与真实浏览器的访问样式明显不同。当被识别为异常访问后很可能直接将其断开或拒绝服务。
怎么办呢?这里就轮到我们的requests.session大人登场了
2.requests.session的优点
以上的痛点都能被requests.session高效解决:
- 自动管理会话 -- 在发送请求的过程中会自动获取并返回对应cookie
- 高效连接复用 -- Session会自建一个连接池,在发送多个连接时会尝试复用已建立的TCP连接,显著减少建立连接时的开销。
- 有效规避对连接频率的反爬 -- 浏览器只会看到建立稳定持久链接上的数据传输
3. 用法
非常简单:
session = requests.session()
response =session.get/post()
只用加上句话,再把请求中的requests改成session,其他照常写即可。
这个实战与相关图文讲解可以帮你快速建立起对requests.session用法与其强大之处的感觉:
五、小结
cookie与session都是用来跟踪用户状态,保存用户信息,而session则在其中起主要作用。
在日常爬取中尽量把以前常用的requests的请求方式改为requests.session,能够明显提高爬虫代码的健壮度。