Python爬虫学习( 二 )——会话和Cookies

Python爬虫学习( 二 )

Python爬虫的基本原理

​ 我们可以把互联网比作一张大网,而爬虫( 即网络爬虫 )便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。

爬虫概述

​ 简单来说,爬虫就是获取页面并提取和保存信息的自动化程序。

1、获取网页

​ 爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以

只要把源代码获取下来,就可以从中提取想要的信息了。

​ 向网站的服务器发送一个请求,返回的响应体便是网页源代码。所以,最关键的部分就是构造一个请求并发送给服务器,然后接受到响应并将其解析出来。

​ 我们可以利用urllib、requests等这些库来帮助我们实现HTTP请求操作,请求和响应都可以用类库提供的数据结构来表示,得到响应之后只需要解析数据结构中的Body部分即可,即得到网页的源代码,这样我们可以用程序来实现获取网页的过程了。

2、提取信息

​ 获取网页源代码后,接下来就是分析网页源代码,从中提取我们想要的数据。首先,最通用的方法便是采用正则表达式进行提取,这是一个万能的方法,但是在构造正则表达式比较复杂且容易出错。

​ 另外,由于网页的结构有一定规则,所以还有一些根据网页节点属性、CSS选择器或 XPath来提取网页信息的库,如Beautiful Soup、pyquery、lxml等。

3、保存数据

​ 提取信息后,我们一般会将提取道的数据保存到某处以便后续使用。这里保存形式有多种多样,如可以简单保存为TXT文本或JSON文本,也可以保存到数据库,如MySQL 和 MongoDB 等,也可以保存至远程服务器,如借助 SFTP 进行操作等。

JavaScript渲染的页面

​ 有时候,我们在用 urllib 或 requests 抓取网页时,得到的源代码实际和浏览器中看到的不一样

​ 这是一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说HTML代码就是一个空壳。

​ 例如:在html引入app.js,它便负责整个网站的渲染。

<script src='app.js'>script>

​ 在浏览器中打开这个页面时,首先会加载这个 HTML 内容,接着浏览器会发现其中引入了一个app.js文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的JavaScript代码,而 JavaScript 则会改变HTML中的节点,向其添加内容,最后得到完整的页面。

​ 但是再用urllib或requests等库请求当前页面时,我们得到的只是这个HTML代码,它不会帮助我们去继续加载这个JavaScript文件,这样也就看不到浏览器中的内容了。

​ 这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。

​ 因此,使用基本HTTP请求库得到的源代码可能跟浏览器中的页面源代码不太一样。对于这样的情况,我们可以分析其后台Ajax接口,也可使用Selenium、Splash这样的库来实现模拟 JavaScript 渲染

会话和Cookies

​ 在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以进行访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且很长时间都不会失效,这些情况就跟我们之前提到的会话( Session )和 Cookies 有关。

​ 在开始之前,先了解一下静态网页和动态网页的概念。

1、静态网页和动态网页

​ 一般写一个网站的时候,我们会将其保存为一个.html文件,然后把它放在某台具有固定公网IP的主机上,主机上装上Apache 或 Nginx 等服务器,这样这台主机就可以作为服务器了,其他人便可以通过访问服务器看到这个页面,这就搭建了一个最简单的网站。

​ 这种网页的内容是HTML代码编写的,文字、图片等内容均通过写好的HTML代码来进行指定,这种页面叫做静态网页。它加载速度快,编写简单,但是存在很大的缺陷,如可维护性差,不能根据URL灵活多变地显示内容等。例如,我们想要给这个网页的URL传入一个name参数,让其在网页中显示出来,是无法做到的。

​ 因此,动态网页就随之产生了,它可以动态解析URL中参数的变化,关联数据库并动态呈现不同的页面内容,非常灵活多变。

​ 此外,动态网站还可以实现用户登录和注册的功能。这就可以联想到我们刚才说的关于登录的问题。按照一般的逻辑来说,输入用户名和密码登录之后,肯定是拿到了一种类似凭证的东西,有了它,我们才能保证登录状态,才能访问登录之后才能看到的页面。这个凭证其实就是会话和Cookies共同产生的结果

2、无状态HTTP( 出现会话和Cookies的理由 )

​ 我们还需要了解HTTP的一个特点,叫做无状态

​ HTTP的无状态是指HTTP协议对事物处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。当我们向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的。服务器不会记录前后状态的变化,也就是缺少状态记录。

​ 这意味着如果后续需要处理前面的信息,则必须重传,这将会导致需要额外传递一些前面的重复请求,才能获取后续响应,然而这种效果显然不是我们想要的。

​ 这时两个用于保持HTTP连接状态的技术就出现了,它们分别是会话和Cookies。

会话:在服务端,也就是网站的服务器,用来保存用户的会话信息;

Cookies:在客户端,也可以理解为浏览器端,有了Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别Cookies并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应。

​ 我们可以理解为Cookies里面保存了我们登录的凭证,有了他,只需要在下次请求携带Cookies发送请求而不必重新输入用户名、密码等信息重新登录了。

​ 因此在爬虫中,有时候处理需要登录才能访问的页面时,我们一般会直接将登录成功后获取的Cookies放在放在请求头里面直接请求,而不必重新模拟登录

3、会话

​ 会话,其本来的含义是指有始有终一系列动作/信息。比如,打电话时,从拿起电话拨号到挂断电话这中间的一系列过程可以称为一个会话。

​ 会话也可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

​ 在Web中,会话对象用来存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

​ 当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个会话对象。当会话过期或被放弃后,服务器将终止该会话。

4、Cookies

​ Cookies指某些网站为了辨别用户身份进行会话跟踪储存在用户本地终端上的数据

  • 会话维持

    ​ 当客户端第一次请求服务器时,服务器会返回一个请求头中带有Set-Cookies字段的响应给客户端‘,用来标记是哪一个用户,客户端浏览器会把Cookies保存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies放到请求头一起提交给服务器,Cookies携带了会话ID信息,服务器检查该Cookies即可找到对应的的会话是什么,然后再判断会话来一次辨认用户状态。

    ​ 在成功登录某个网站时候,服务器会告诉客户端设置哪些Cookies信息,在后续访问页面时客户端会把Cookies发送给服务器,服务器再找到对应的会话加以判断如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。

    ​ 反之,如果传给服务器的Cookies是无效的,或者会话已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。

    ​ 所以,Cookies和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。

  • 属性结构

    ​ 接下来,我们来看看Cookies都有哪些内容。

    ​ 以知乎为例,在浏览器开发工具中打开Application选项卡,然后再左侧会有一个Storage部分,将Cookies点开。

Python爬虫学习( 二 )——会话和Cookies_第1张图片

Name:该Cookies的名称。一旦创建,该名称便不可改变。

Value:该Cookies的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。

Domain:可以访问该Cookies的域名。例如,如果设置为.zhihu.com,则所有以zhihu.com结尾的域名都可以访问该Cookie。

Max Age:该Cookie失效的时间,单位为秒,也常和Expires一起使用,通过它可以计算出其有效时间。Max Age如果为整数,则该Cookie在Max Age秒之后失效。如果为负数 ,则关闭浏览器时Cookie即失效,浏览器也不会以任何形式保存该Cookie。

Path:该Cookie的使用路径。如果设置为/path/,则只有路径为/path/的页面可以访问该Cookie。如果设置为/,则本域名下的所有网页都可以访问该Cookie。

Size字段:此Cookie的大小。

HTTP字段:Cookie的 httponly 属性。若此属性为true,则只有在HTTP头中会带有此Cookie的信息,而不能通过document.cookie来访问此Cookie。

Secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等,在网络上传输数据之前先将数据加密。默认为false。

  • 会话Cookie和持久Cookie

    ​ 从表面意思来看,会话Cookie就是把Cookie放在浏览器内存里,浏览器在关闭之后该Cookie即失效;持久Cookie则会保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户登录状态。

    ​ 其实严格来说,没有会话Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires字段决定了过期时间。

    ​ 因此,一些持久化登录的网站其实就是把Cookie的有效时间和会话有效期设置得比较长,下次我们再访问页面时仍然携带之前的Cookie,就可以直接保持登录状态。

常见误区

​ 在谈论会话机制的时候,常常听到这样一种误解——”只要关闭浏览器,会话就消失了。“可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对会话来说,也是一样,除非程序通知服务器删除一个会话,否则服务器会一直保留。比如,程序一般都是在我们做注销操作时才去删除会话。

​ 但是当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭。之所有会有这种错觉,是因为大部分会话机制都是用会话Cookie来保存会话ID信息,而关闭浏览器后Cookies就小事了,再次连接服务器时,也就无法找到原来的会话了。如果服务器设置的Cookies保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Cookies发送给服务器,则再次打开浏览器,仍然能够找到原来的会话ID,依旧还是可以保持登录状态。

而且恰恰是由于关闭浏览器不会导致会话被删除,这就需要服务器为会话设置一个失效时间,当距离客户端上一次使用会话的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把会话删除以节省储存空间。

提示:
内容大多来自崔庆才《Python3——网络爬虫开发实战》
网址:https://www.ituring.com.cn/book/tupubarticle/29396
如有侵权,请联系本人删除,谢谢。
本人只是某大学学生,发布该篇博客作为该书的学习笔记,和大家一起分享学习和交流。

你可能感兴趣的:(Python,python,爬虫)