当前位置: 首页 > 后端技术 > Python

小白学习Python爬虫(十):Session和Cookies

时间:2023-03-25 19:58:48 Python

人生苦短,我用Python)基础类库安装小白学习Python爬虫(三):前期准备(二)Linux基础介绍小白学习Python爬虫(4):前期准备(三)Docker基本介绍小白学习Python爬虫(五):前期准备(四)数据库基础知识小白学习Python爬虫(六):前期准备(五)爬虫框架安装小白学习Python爬虫(7):HTTP基础知识小白学习Python爬虫(8):网页基础知识小白学习Python爬虫(9):爬虫基础知识介绍。在介绍Session和Cookies之前,我们先介绍另一个概念——静态网页和动态网页。静态网页静态网页就是我们在上一篇文章中写的那种html页面,后缀为.html的文件可以直接部署或者放在web容器中,在浏览器中直接通过链接访问。常用的流行的web容器有Nginx、Apache、Tomcat、Weblogic、Jboss、Resin等等,很多很多。如果要举个例子,那么我的个人博客站点:https://www.geekdigging.com/是一个纯静态的网页。这类网页的内容是用纯HTML代码编写的,包括一些资源文件:图片、视频等内容的介绍都是用HTML标签来完成的。它的优点当然是加载速度快,写法简单,访问时对web容器基本没有压力。但是缺点也很明显,可维护性比较差,不能根据参数动态显示内容等。有需求会不会有开发,动态网页就会应运而生。动态网页先不说动态网页的概念,先说说动态网页建立的网站有哪些。常用的魔宝、魔动、品喜喜等网站都是由动态网页组成的。动态网页可以通过解析URL中的参数,或者关联数据库中的数据来展示不同的网页内容。您现在访问的大多数网站都是动态网站。它们不再简单地由HTML组成,而是可能用JSP、PHP等语言编写。当然现在很多前端框架写的小网页在这里编辑也属于动态网页。说到动态网页,同学们最常使用的功能之一就是登录。像各种电商网站一样,必须先登录,才能下单买东西。那么,问题来了,后面的服务器怎么知道当前人已经登录了呢?HTTP/1.1现在大多数网站使用的协议是HTTP/1.1,HTTP/1.1最大的特点就是无状态、无连接。无状态是指HTTP协议没有发送和处理请求的记忆功能。也就是说,每次HTTP请求到达服务器,服务器并不知道当前客户端(浏览器)处于什么状态。客户端向服务器发送请求后,服务器处理请求,然后响应将内容返回给客户端,完成一次交互。这个过程是完全相互独立的。服务器不会记录前后的状态变化,即状态记录缺失。这就引出了上面的问题,服务器怎么知道当前在浏览器前面操作的人是谁呢?实际上,当用户进行登录操作时,服务端会颁发一个类似于token证书的东西,返回给客户端(浏览器)。有了这个证书,就可以保持登录状态。那么这个凭据是什么?这就是本文要讲解的核心内容,Session和Cookies。session是会话的意思。Session是在服务器端生成的,用来保存当前用户的会话信息,而Cookies是在客户端(浏览器)保存的。cookie可用后,客户端(浏览器)再次访问服务器。,会带上这个cookie。这时候,服务器就可以通过cookie来识别谁在访问这个请求。可以简单理解为登录凭证保存在Cookies中。只要我们持有这个凭据,我们就可以在服务器上保持登录状态。在爬虫中,有时遇到需要登录才能访问的网页,只需要登录后获取Cookies,下次访问时将登录后获取的Cookies放入请求头即可。这个时候服务器就会认为我们的爬虫是一个正常登录的用户。会话保持那么,Cookies是如何保持会话状态的呢?当客户端(浏览器)第一次向服务器发起请求时,服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端(浏览器)来标记是哪个用户,客户端(浏览器)会保存此Cookie。我们使用PostMan这个工具访问下东东的登录页面,看看返回的响应头:当我们输入用户名和密码时,客户端会将Cookies连同请求头发送给服务器。这时候,服务端就知道是谁在进行登录操作了,可以判断这个人输入的用户名和密码是否正确。如果输入正确,就会在服务器的session中记录此人已经成功登录。下次请求时,此人会登录。如果客户端向服务器发送的Cookies无效,或者服务器根本就没有发出Cookie,或者Cookie已经过期,那么后面的请求将无法再访问需要登录的页面。所以Session和Cookies需要互相配合,一个在server端,一个在client端。对于cookie,我们打开某网站的网站,看看这些cookie包含什么:具体操作方法是在Chrome中按F12打开开发者工具,选择应用选项卡,点击Cookies栏。名称:这是cookie的名称。一旦创建,此名称便无法更改。值:这是cookie的值。域:这是可以访问cookie的域名。例如设置为.jd.com,所有以jd.com结尾的域名,都可以访问cookie。MaxAge:cookie的过期时间,以秒为单位,常与Expires一起使用。如果MaxAge是正数,它将在MaxAge秒后过期。如果为负数,则cookie在浏览器关闭时过期,浏览器不会保存cookie。Path:cookie的使用路径。如果设置为/path/,只有路径为/path/的页面才能访问cookie。如果设置为/,则该域名下的所有页面都可以访问该cookie。大小:cookie的大小。HTTPOnly:如果勾选此项,则不会通过JS脚本读取cookie信息,可以有效防止XSS攻击,窃取cookie内容,增加cookie的安全性。Secure:勾选此项,则此Cookie只能使用HTTPS协议发送给服务器,不能使用HTTP协议发送。那么为什么有的网站这次关闭了,下次打开时为什么还是登录状态呢?这是关于cookie的持久性。其实也不能说是执着。意思是把cookies的过期时间设置的长一点。比如直接设置为2099年过期。这样浏览器关闭后,这个cookie就会被保存下来。在我们的硬盘里,下次你打开浏览器的时候,这个cookie就会从我们的硬盘里读取出来,用来维护用户的session状态。第二个问题来了,server端的session会一直保持下去吗?当然不是,这样会在Cookie和Session上做文章。可以将用户名以加密的方式记录在Cookie中,记录下一次cookie被请求读取并发送到服务器后,服务器悄悄创建一个用户已经登录的session,所以我们将客户端视为始终保持登录会话。误解当我们关闭浏览器时,服务器上的session会自动销毁。这是错误的,因为当浏览器关闭时,浏览器不会额外通知服务器我要关闭。会话被销毁。因为服务器上的session是保存在内存中的,所以一个session虽然不会很大,但是也不能支持太多的session。毕竟硬件会有限制,不能无限扩展,所以在服务器上设置session的过期时间就很重要了。是必要的。当然有没有办法让浏览器在关闭的时候同步关闭服务器会话呢?当然有可能。我们可以使用脚本语言JS来监听浏览器的关闭动作。当浏览器触发关闭动作时,JSLike服务器发起请求,通知服务器销毁会话。由于不同浏览器对JS事件的实现机制不一致,不一定保证JS能监听到关闭浏览器的动作,所以现在常见的做法是在服务器端自己设置session过期时间。参考https://baike.baidu.com/item/...如果我的文章对你有帮助,欢迎扫码关注作者的公众号:获取最新干货推送:)