第一章 爬虫基础概念 1.3爬虫基本原理

目录

1.3  爬虫基本原理

1.  爬虫基本流程

2.爬取的数据形式

3. JavaScript渲染的页面

4. Session和Cookie

4.1 静态网页和动态网页

4.2  无状态HTTP

4.3  Session

4.4  Cookie

5.Session和Cookie的存储


1.3  爬虫基本原理

1.爬虫基本流程

  • 获取网页

        网页源代码里包含网页的部分有用信息,爬虫的工作首先是获取网页源代码,以便从中提取信息。向网站的服务器发送一个请求, 服务器返回的响应体便是网页源代码。所以最关键的部分是构造一个请求并发送给服务器,然后接收到响应并对其进行解析。
        Python 提供了爬虫库可以帮助实现这一流程,如urllib、requests 等。
请求和响应都用类库提供的数据结构来表示,因此得到响应之后只需要解析数据结构中的body部分,即可得到网页的源代码。

  • 提取信息

        网页源代码最通用且万能的提取方法是采用正则表达式,但是构造正则表达式的过程复杂且容易出错。另外,Beautiful Soup、pyquery、lxml 等爬虫库是根据网页节点属性、CSS选择器和XPath来定义方法的,遵循网页结构规则。使用这些库,可以高效地从源代码中提取网页信息,如节点的属性、文本值等。

  • 保存数据

        数据保存的形式包括txt文本或JSON数据,也可以保存到MySQL和MongoDB等数据库,或借助SFTP协议保存至远程服务器。

  • 自动化程序

      当数据量大或者想快速获取大量数据的时候,需要借助程序实现自动化。自动化程序能够在爬取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行。

2.爬取的数据形式

        网页对应HTML代码,但是有些网页响应所返回的不是HTML代码,而是一个JSON字符串(其中API接口大多采用这样的形式),这种格式的数据方便传输和解析。网页中包含各种二进制数据如图片、视频和音频等,以及扩展名文件,如CSS、JavaScript 和配置文件。利用爬虫可以将这些二进制数据和文件抓取下来,并保存成对应的文件名。上述内容都需要有各自对应的URL,URL基于HTTP或HTTPS协议,爬虫可以抓取任何基于URL的数据。

3.JavaScript渲染的页面

        使用urlib或requests抓取网页时,得到的源代码和在浏览器中实际看到的可能不一样。因为现在有越来越多的网页是采用Ajax、前端模块化工具构建的,可能整个网页都是通过JavaScript渲染出来的,而原始的HTML代码就是一个空壳, 例如:

< !DOCTYPE>

<html>
        <head>
                <meta charset="UTF-8">
                        <title>This is a Demo</title>
        </head>
        <body>
                <div id=" container">
                </div>
        </body>
        <script src=" app. js"></script>
</html>

        在上述实例中,body 节点里面只有一个id为container 的节点,需要注意在body节点后引入了
app.js
,它负责整个网站的渲染。在浏览器中打开这个页面时,首先会加载这个HTML内容,接着浏览器会发现其中引入了一个appjs文件,便去请求这个文件。获取该文件后,执行其中的JavaScript代码,JavaScript 会改变HTML中的节点,向其中添加内容,最后得到完整的页面。
        在用urlib或requests等库请求页面时,得到的只是HTML代码,而HTML代码不会继续加载
JavaScript文件,我们也就无法看到完整的源码内容。对于这样的情况,可以分析源代码后台Ajax接口,也可使用Selenium、Splash、 Pyppeteer库来模拟JavaScript渲染。
        后面章节会详细介绍如何采集JavaScript 渲染出来的网页。

4.Session和Cookie

        有网页只有登录之后才可以访问,登录之后可以连续多次访问网站,但是过一段时间就需要 重新登录;而部分网站在打开浏览器时就自动登录了,而且在很长时间内都不会失效,这里就涉及Session和Cookie的相关知识。

4.1 静态网页和动态网页

         之前章节所使用的的HTML代码如下:

< !DOCTYPE html>
<html>
<head>
        <meta charset="UTF-8">
        <title>This is a Demo</title>
< /head>
< body>
        <div id=" container' >
                <div class="wrapper">
                        <h2 class="title" >Hello World</h2>
                        <p class="text">Hello, this is a paragraph. </p>
                </div>
        </div>
</body>
</html>

        将该.html 文件放在某台具有固定公网IP且安装有Apache或Nginx等服务器的主机上,这台主机就可以作为服务器,其他人可以通过访问服务器看到那个实例页面,这就搭建了一个最简单的网站。这种网页的内容是由HTML代码编写的,文字、图片等内容均通过写好的HTML代码来指定,这种页面叫作静态网页。静态网页加载速度快、编写简单,同时也存在很大的缺陷,如可维护性差、不能根据URL灵活多变地显示内容等。如果需要给静态网页的URL传人一个name参数,让其在网页中显示出来,静态网页是无法做到的。

        于是动态网页应运而生,它可以动态解析URL中参数的变化,关联数据库并动态呈现不同的页面内容。现在的网站几乎都是动态网站,它们不再是一个简单的HTML页面,可能是由JSP、PHP、Python 等语言编写的,功能要比静态网页强大、丰富太多。此外,动态网站还可以实现用户登录和注册的功能。

        很多页面是需要登录之后才可以查看的,输入用户名和密码拿到凭证才能保持登录状态,访问那些登录之后才能看得到的页面,这种凭证就是Session和Cookie共同产生的结果

4.2  无状态HTTP

        在了解Session和Cookie之前,还需要了解HTTP的无状态特点。HTTP的无状态是指HTTP协议对事务处理是没有记忆能力的,或者说服务器并不知道客户端处于什么状态。客户端向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。

        这意味着之后如果需要处理前面的信息,客户端就必须重传,导致需要额外传递一些重复请求,才能获取后续响应,这种效果显然不是我们想要的。为了保持前后状态,肯定不能让客户端将前面的请求全部重传一次,这太浪费资源了,对于需要用户登录的页面来说,更是棘手。这时,两种用于保持HTTP连接状态的技术出现了,分别是Session和Cookie。Session 在服务端,即服务器端,用来保存用户的Session信息;Cookie 在客户端即浏览器端,有了Cookie浏览器在下次访问相同网页时就会自动附带上它,并发送给服务器,服务器通过识别Cookie鉴定出是哪个用户在访问,然后判断此用户是否处于登录状态,并返回对应的响应。Cookie里保存着登录的凭证,客户端在下次请求时只需要将其携带上,就不必重新输人用户名、密码等信息重新登录了。因此在爬虫中,处理需要先登录才能访问的页面时,我们一般会直接将登录成功后获取的Cookie放在请求头里面直接请求,而不重新模拟登录

4.3  Session

        Session(会话)本义是指有始有终的一系列动作、消息。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一次Session。而在Web中,Session 对象用来存储特定用户Session所需的属性及配置信息。这样,当用户在应用程序的页面之间跳转时,存储在Session对象中的变量将不会丢失。当用户请求来自应用程序的页面时,如果该用户还没有Session, 那么Web服务器将自动创建一个Session对象。Session过期或被放弃后,服务器将终止该Session。

4.4  Cookie

Cookie指网站为了鉴别用户身份、进行Session跟踪而存储在用户本地终端上的数据。

        1.Session维持

        在客户端第一次请求服务器时,服务器会返回一个响应头中带有Set-Cookie字段的响应给客户端,这个字段用来标记用户。客户端浏览器会把字段中的Cookie保存起来,当下一次请求相同的网站时,把保存的Cookie放到请求头中一起提交给服务器。Cookie 中携带着Session ID相关信息,服务器通过检查接收到的Cookie找到所存储的对应Session,然后通过判断Session来辨认用户状态。如果Session在当前是有效的,就证明用户处于登录状态,此时服务器返回登录之后才可以查看的网页内容,交由浏览器进行解析展示。反之,如果传给服务器的Cookie是无效的,或者Session 已经过期了,客户端将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。Cookie和Session需要配合,一个在客户端,一个在服务端,二者共同协作实现登录控制。

        2.属性结构

        以知乎为例(登录后),在浏览器开发者工具中选中应用程序(Application)选项卡,在左侧存储(Storage)模块中选中Cookies选项,点击查看Cookie。如图所示:

其中,Cookie属性包括

  • 名称(Name):Cookie 的名称。Cookie 一旦创建,名称不可更改;
  • 值(Value): Cookie 的值。如果值为Unicode字符,则需要为字符编码。如果值为二进制数据,则需要使用BASE64编码;
  • 域名(Domain):指定可以访问该Cookie 的域名。例如设置Domain为.baidu.com, 表示所有以baidu.com结尾的域名都可以访问该Cookie;
  • 路径(Path):Cookie的使用路径。如果设置为/path/, 则只有路径为/path/的页面才可以访问该Cookie;如果设置为1,则本域名下的所有页面都可以访问该Cookie。
  • 有效时间(expires/Max-Age):Cookie 失效的时间,单位为秒。常和Expires一起使用,通过此属性可以计算出Cookie的有效时间。Max-Age 如果为正数,则表示Cookie在Max-Age指定的秒数之后失效;如果为负数,则表示Cookie在关闭浏览器时失效,而且浏览器不会以任何形式保存该Cookie;
  • 大小(Size): Cookie 的大小;
  • HTTP字段:Cookie 的http only属性。若此属性为true,则只有在HTTP Headers中才会带有此Cookie的信息,而不能通过document.cookie来访问Cookie;
  • 安全(Secure):指明是否只允许使用安全协议传输Cookie,默认值为false。安全协议有HTTPS和SSL等,使用这些协议在网络上传输数据之前会先将数据加密。

        3.会话Cookie和持久Cookie

        会话Cookie就是把Cookie放在浏览器内存里,关闭浏览器之后,Cookie即失效;而持久Cookie则会把Cookie保存到客户端的硬盘中,下次打开浏览器后还可以继续使用,用于长久保持用户的登录状态。严格来说,其实没有会话Cookie和持久Cookie之分,只是Max Age或Expires字段决定了Cookie失效的时间。因此,一些持久化登录的网站实际上就是把Cookie的有效时间和Session有效期设置得比较长。

5.Session和Cookie的存储

        服务器中的Session信息需要通过程序通知服务器删除,否则服务器会一直保留在服务器上(一般都是在做注销操作时,才删除Session)。但是大部分网站使用会话Cookie来保存Session ID信息,浏览器关闭后Cookie就消失了,等浏览器再次连接服务器时,就无法找到原来的Session。

        为了避免因为浏览器关闭操作而造成Session的丢失,需要把服务器设置的Cookie保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Cookie发送给服务器,那么再次打开浏览器时,仍然能够找到原来的Session ID,依旧保持登录状态。
        当解决上述问题后,关闭浏览器不会导致Session被删除。这时需要服务器为Session设置一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间时,服务器可认为客户端已经停止了活动,并删除掉Session以节省服务器存储空间。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值