栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

搜索引擎篇---网络爬虫学习

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

搜索引擎篇---网络爬虫学习

目录

前言

通用爬虫框架

五类界面分类

爬虫的种类分类

优秀爬虫的特性

抓取标准

抓取策略

宽度优先策略

非完全PageRank策略(争议很大,未必比宽度优先好.故而了解即可) 

OCIP策略(online Page importance Computation)

 大站优先策略

网页更新策略

历史参考策略

用户体验策略

聚类抽样策略

 暗网抓取

查询组合问题

文本框填写问题

分布式爬虫

主从式分布爬虫

对等式爬虫 


前言

本文沿袭上文的架构逻辑,这一节总结网络爬虫的相关基础知识.

通用爬虫框架

图2-1所示是一个通用的爬虫框架流程。首先从互联网页面中精心 选择一部分网页,以这些网页的链接地址作为种子URL,将这些种子 URL放入待抓取URL队列中,爬虫从待抓取URL队列依次读取,并将 URL通过DNS解析,把链接地址转换为网站服务器对应的IP地址。然后 将其和网页相对路径名称交给网页下载器,网页下载器负责页面内容的 下载。对于下载到本地的网页,一方面将其存储到页面库中,等待建立 索引等后续处理;另一方面将下载网页的URL放入已抓取URL队列中, 这个队列记载了爬虫系统已经下载过的网页URL,以避免网页的重复抓 取。对于刚下载的网页,从中抽取出所包含的所有链接信息,并在已抓 取URL队列中检查,如果发现链接还没有被抓取过,则将这个URL放入 待抓取URL队列末尾,在之后的抓取调度中会下载这个URL对应的网 页。如此这般,形成循环,直到待抓取URL队列为空,这代表着爬虫系 统已将能够抓取的网页尽数抓完,此时完成了一轮完整的抓取过程。

 从更加宏观的角度来考虑,爬虫的过程无非就是一个从已知下载界面的过程到未知下载界面的过程.

五类界面分类

已下载网页集合: 爬虫已经从互联网下载到本地进行索引的网 页集合。 · 已过期网页集合: 由于网页数量巨大,爬虫完整抓取一轮需要 较长时间,在抓取过程中,很多已经下载的网页可能过期。之所以如 此,是因为互联网网页处于不断的动态变化过程中,所以易产生本地网 页内容和真实互联网网页不一致的情况。 · 待下载网页集合: 即处于图2-1中待抓取URL队列中的网页,这 些网页即将被爬虫下载。 · 可知网页集合: 这些网页还没有被爬虫下载,也没有出现在待 抓取URL队列中,不过通过已经抓取的网页或者在待抓取URL队列中的 网页,总是能够通过链接关系发现它们,稍晚时候会被爬虫抓取并索 引。 · 不可知网页集合: 有些网页对于爬虫来说是无法抓取到的,这 部分网页构成了不可知网页集合。事实上,这部分网页所占的比例很 高。

爬虫的种类分类

批量性爬虫:这类爬虫也许是抓取到一定数量,或者是抓取到一定时间,即不再抓取

增量型爬虫:保持持续不断的抓取,不是在抓取新网页,就是在更新已经抓取的网页

垂直型爬虫:只爬取特定主题或者特定行业内的网页.难点在于如何确定是特定内容的网页.

优秀爬虫的特性

1)高性能:由于爬取的网页特别多,由于访问磁盘的操作和具体实现时数据结构选择十分的重要,所以选择合适的数据结构对于爬虫性能影响极大

2)可扩展性:很容易通过增加服务器数量和爬虫数量来提高爬取速度.目前大型网络公司的爬虫一定是分布式的实现,使用多台机器,每个机器上安排多个爬虫,每个爬虫安排多个线程运行

3)健壮性:处理各种异常状况,健壮的爬虫程序应该做到在死机或者宕机后重新开启,能够恢复之前爬取数据结构和内容,而不是从头开始

4)友好性:有些网站的某一些内容是不被允许抓取的,我们可以参考爬虫禁抓协议

        如果是网页不想被抓取,我们可以加上

 不要抓取网页所包含的链接,我们可以加上

我们在爬虫时还要考虑目标服务器,尽量不要对目标服务器单一节点高频次访问.

爬虫只是对互联网上的部分网页进行了爬取,而不是说所有的网页都进行爬取

抓取标准

1)覆盖率

2)时新性

3)抓取网络重要性

为了满足不同的抓取需求,大型网络搜索引擎公司(eg:GOOGLE开发了两套爬虫方案,一套是考虑是时新性,以秒为周期,另一套以天为周期)

抓取策略

最简单的一种:按照队列顺序,当前下载网页的URL地址加入到队列的尾部,以此类推.但是这样做往往不太理想,我们的目标是优先抓取最重要的网页.下面介绍四种比较好的解决策略:宽度优先遍历策略,非完全PageRank策略,OCIP策略,大站优先策略

1)宽度优先遍历策略

2)非完全PageRank策略

3)OCIP策略

4)大站优先策略

宽度优先策略

这种策略是一种非常强悍的策略,很多开发者一般采用这种策略.这种策略隐含了一些链接优先级的假设:先出现的链接往往就是最重要的链接.

非完全PageRank策略(争议很大,未必比宽度优先好.故而了解即可) 

PageRank是一种著名的链接分析算法,用来衡量网页的重要性,但是PageRank是一个全局性的算法,就是说网页必须全部下载到了本地端后才可以看出来哪些是最重要的,但是我们往往不能全部下载下来,怎么解决呢?

对于已经下载的网页,加上待下载队列中的URL地址一起进行PageRank计算,按照优先级从高往低的顺序依次抓取URL即可,一般是攒够了K个网页之后再计算PageRank值,不然效率实在是太低了.

图2-8是非完全PageRank策略的一个简略示意图。我们设定每下载3 个网页即进行新的PageRank计算,此时已经有{P1,P2,P3}3个网页下 载到本地,这3个网页包含的链接指向{P4,P5,P6},形成了待抓取 URL队列,如何决定其下载顺序?将这6个网页形成新的集合,对这个 集合计算PageRank值,这样P4、P5和P6就获得自己对应的PageRank 值,由大到小排序,即可得出其下载顺序。这里可以假设顺序为:P5、 P4、P6,当下载P5页面后抽取出链接,指向页面P8,此时赋予P8临时 PageRank值,如果这个值大于P4和P6的PageRank,则接下来优先下载 P8。如此不断循环,即形成了非完全PageRank策略的计算思路

OCIP策略(online Page importance Computation)

"在线网页重要性计算"策略:规定每一个页面有一定的金钱,每个页面被下载后,就将自己网页的金币平分到页面中已有的链接,对于待抓取队列,根据手头上有的现金金额多少排序,优先下载资金最富裕的页面.OCIP策略略优于宽度优先策略

 大站优先策略

对于抓取的URL队列中的网页,根据所属的网站归类,哪个网站等待下载的页面最多,则优先下载这个链接.这个策略也是略高于宽度优先搜索

网页更新策略

网页更新策略的任务是要决定何时重新抓取之前已经下载过的网 页,以尽可能使得本地下载网页和互联网原始页面内容保持一致。常用 的网页更新策略有3种:历史参考策略、用户体验策略和聚类抽样策略。

历史参考策略

建立的假设基础:过去频繁发生变化的网页将来也会频繁更新.这种方法往往利用泊松过程来对网页的变化进行建模,根据每个网 页过去的变动情况,利用模型预测将来何时内容会再次发生变化,以此 来指导爬虫的抓取过程。但是不同方法侧重不尽相同,比如有的研究将 一个网页划分成不同的区域,抓取策略应该忽略掉广告栏或者导航栏这 种不重要区域的频繁变化,而集中在主题内容的变化探测和建模上。

用户体验策略

影响力越大的网页,应该尽快更新.

聚类抽样策略

,首先根据网页所表现出的特 征,将其聚类成不同的类别,每个类别内的网页具有相似的更新周期。 从类别中抽取一部分最有代表性的网页(一般抽取最靠近类中心的那些 网页),对这些网页计算其更新周期,那么这个更新周期适用于类别内 的所有网页,之后即可根据网页所属类别来决定其更新频率。

相关实验表明,聚类抽样策略效果好于前述两种更新策略,但是对 以亿计的网页进行聚类,其难度也是非常巨大的。 

 暗网抓取

所谓暗网,是指目前搜索引擎爬虫按照常规方式很难抓取到的互联 网页面。如前所述,搜索引擎爬虫依赖页面中的链接关系发现新的页 面,但是很多网站的内容是以数据库方式存储的,典型的例子是一些垂 直领域网站,比如携程旅行网的机票数据,很难有显式链接指向数据库 内的记录,往往是服务网站提供组合查询界面,只有用户按照需求输入 查询之后,才可能获得相关数据。所以,常规的爬虫无法索引这些数据 内容,这是暗网的命名由来.

而暗网爬虫为了能够挖掘数据库的记录,必须模拟人的行为,填 写内容并提交表单。对于暗网爬虫来说,其技术挑战有两点:一是查询 组合太多,如果一一组合遍历,那么会给被访问网站造成太大压力,所 以如何精心组合查询选项是个难点;第二点在于:有的查询是文本框, 比如图书搜索中需要输入书名,爬虫怎样才能够填入合适的内容?这个 也颇具挑战性。

查询组合问题

垂直搜索网站往往会给用户提供多个查询输入框,不同输入框代表 了搜索对象某方面的属性,通过组合这些属性来将搜索范围缩小。对于 暗网爬虫来说,一个简单粗暴的方式就是:将各个输入框可能的输入值 组合起来形成查询,比如对于机票查询来说,将所有出发城市、所有目 的城市和时间范围的选项一一组合,形成大量的查询,提交给垂直搜索 引擎,从其搜索结果里提炼数据库记录。这么做比较野蛮,而且也不是 很必要,因为很多组合是无效的,大量的返回结果为空,同时对被访问 网站造成了巨大的流量压力。

垂直搜索网站往往会给用户提供多个查询输入框,不同输入框代表 了搜索对象某方面的属性,通过组合这些属性来将搜索范围缩小。对于 暗网爬虫来说,一个简单粗暴的方式就是:将各个输入框可能的输入值 组合起来形成查询,比如对于机票查询来说,将所有出发城市、所有目 的城市和时间范围的选项一一组合,形成大量的查询,提交给垂直搜索 引擎,从其搜索结果里提炼数据库记录。这么做比较野蛮,而且也不是 很必要,因为很多组合是无效的,大量的返回结果为空,同时对被访问 网站造成了巨大的流量压力。 Google对此提出了解决方案,称之为富含信息查询模板 (Informative Query Templates)技术,为了了解其技术原理,首先需要 明白什么是查询模板。我们以图2-11所示的“职位搜索”垂直网站来说 明。 图2-11 “职位搜索”垂直网站 在图2-11的示例中,为了描述一个职位,完整的查询由3个不同的 属性构成:职位类别、行业类别和工作地点。如果在向搜索引擎提交查 询的时候,部分属性被赋予了值,而其他属性不赋值,则这几个赋值的 属性一起构成了一个查询模板。 图2-12是若干个“查询模板”的示例,如果模板包含一个属性,则称 之为一维模板,图中模板1是一维模板,模板2和模板3是两个二维模 板,模板4是三维模板。

 

假设按照上面方式对所有查询模板一一试探,判断其是否富含信息 查询模板,则因为查询模板数量太多,系统效率还是会很低。为了进一 步减少提交的查询数目,Google的技术方案使用了ISIT算法。 ISIT算法的基本思路是:首先从一维模板开始,对一维查询模板逐 个考察,看其是否富含信息查询模板,如果是的话,则将这个一维模板 扩展到二维,再次依次考察对应的二维模板,如此类推,逐步增加维 数,直到再也无法找到富含信息查询模板为止。通过这种方式,就可以 找到绝大多数富含信息查询模板,同时也尽可能减少了提交的查询总 数,有效达到了目的。Google的评测结果证明,这种方法和完全组合方 式比,能够大幅度提升系统效率。 如果读者对于数据挖掘有所了解,可以看出,Google提出的算法和 数据挖掘里经典的Apriori规则挖掘算法有异曲同工之处。

文本框填写问题

对于输入中的文本框,需要爬虫自动生成查询,图2-13给了一个常 用做法的流程图。 图2-13 文本框自动填写 在爬虫运转起来之前,因为对目标网站一无所知,所以必须人工提 供一些提示。在此例中,通过人工观察网站进行定位,提供一个与网站 内容相关的初始种子查询关键词表,对于不同的网站,需要人工提供不 同的词表,以此作为爬虫能够继续工作的基础条件。爬虫根据初始种子 词表,向垂直搜索引擎提交查询,并下载返回的结果页面。之后从返回 结果页面里自动挖掘出相关的关键词,并形成一个新的查询列表,依次 将新挖掘出的查询提交给搜索引擎。如此往复,直到无法下载到新的内 容为止。通过这种人工启发结合递归迭代的方式,尽可能覆盖数据库里 的记录。 

分布式爬虫

三个层级

 分布式数据中心,分布式抓取服务器,分布式爬虫程序

每个数据中心又由多台高速网络连接的抓取服务器构成,而每台服 务器又可以部署多个爬虫程序。通过多层级的分布式爬虫体系,才可能 保证抓取数据的及时性和全面性。

主从式分布爬虫

对于主从式分布爬虫,不同的服务器承担不同的角色分工(参考图 2-15),其中有一台专门负责对其他服务器提供URL分发服务,其他机 器则进行实际的网页下载。URL服务器维护待抓取URL队列,并从中获 得待抓取网页的URL,分配给不同的抓取服务器,另外还要对抓取服务 器之间的工作进行负载均衡,使得各个服务器承担的工作量大致相等, 不至于出现忙的过忙、闲的过闲的情形。抓取服务器之间没有通信联 系,每个抓取服务器只和URL服务器进行消息传递

Google在早期即采用此种主从分布式爬虫,在这种架构中,因为 URL服务器承担很多管理任务,同时待抓取URL队列数量巨大,所以 URL服务器容易成为整个系统的瓶颈

对等式爬虫 

在对等式分布爬虫体系中,服务器之间不存在分工差异,每台服务 器承担相同的功能,各自负担一部分URL的抓取工作,如图2-16所示即 是其中一种对等式分布爬虫,Mercator爬虫采用此种体系结构(关于 Mercator爬虫具体技术细节可以参考文献7)。在对等式分布爬虫体系中,服务器之间不存在分工差异,每台服务 器承担相同的功能,各自负担一部分URL的抓取工作,如图2-16所示即 是其中一种对等式分布爬虫,Mercator爬虫采用此种体系结构(关于 Mercator爬虫具体技术细节可以参考文献7)。

由于没有URL服务器存在,每台抓取服务器的任务分工就成为问 题。在如图2-16所示体系结构下,由服务器自己来判断某个URL是否应 该由自己来抓取,或者将这个URL传递给相应的服务器。至于采取的判 断方法,则是对网址的主域名进行哈希计算,之后取模(即hash[域 名]%m,这里的m对应服务器个数),如果计算所得的值和抓取服务 器编号匹配,则自己下载该网页,否则将该网址转发给对应编号的抓取 服务器。 以图2-16的例子来说,因为有3台抓取服务器,所以取模的时候m设 定为3。图中的1号抓取服务器负责抓取哈希取模后值为1的网页,当其 接收到网址www.google.com时,首先利用哈希函数计算这个主域名的哈 希值,之后对3取模,发现取模后值为1,属于自己的职责范围,于是就 自己下载网页;如果接收到网址www.baidu.com,哈希后对3取模,发现 其值等于2,不属于自己的职责范畴,则会将这个要下载的URL转发给2 号抓取服务器,由2号抓取服务器来进行下载。通过这种方式,每台服 务器平均承担大约1/3的抓取工作量。 由于没有URL分发服务器,所以此种方法不存在系统瓶颈问题,另 外其哈希函数不是针对整个URL,而只针对主域名,所以可以保证同一 网站的网页都由同一台服务器抓取,这样一方面可以提高下载效率 (DNS域名解析可以缓存),另外一方面也可以主动控制对某个网站的 访问速度,避免对某个网站访问压力过大。 图2-16这种体系结构也存在一些缺点,假设在抓取过程中某台服务 器宕机,或者此时新加入一台抓取服务器,因为取模时m是以服务器个 数确定的,所以此时m值发生变化,导致大部分URL哈希取模后的值跟 着变化,这意味着几乎所有任务都需要重新进行分配,无疑会导致资源 的极大浪费。 为了解决哈希取模的对等式分布爬虫存在的问题,UbiCrawler爬虫 提出了改进方案,即放弃哈希取模方式,转而采用一致性哈希方法 (Consisting Hash)来确定服务器的任务分工(参考图2-17)。

一致性哈希将网站的主域名进行哈希,映射为一个范围在0到2 32 之 间的某个数值,大量的网站主域名会被均匀地哈希到这个数值区间。可 以如图2-17所示那样,将哈希值范围首尾相接,即认为数值0和最大值 重合,这样可以将其看做有序的环状序列,从数值0开始,沿着环的顺 时针方向,哈希值逐渐增大,直到环的结尾。而某个抓取服务器则负责 这个环状序列的一个片段,即落在某个哈希取值范围内的URL都由该服 务器负责下载。这样即可确定每台服务器的职责范围。 我们以图2-17为例说明其优势,假设2号抓取服务器接收到了域名 www.baidu.com,经过哈希值计算后,2号服务器知道在自己的管辖范围 内,于是自己下载这个URL。在此之后,2号服务器收到了 www.sina.com.cn这个域名,经过哈希计算,可知是3号服务器负责的范 围,于是将这个URL转发给3号服务器。如果3号服务器死机,那么2号 服务器得不到回应,于是知道3号服务器出了状况,此时顺时针按照环 的大小顺序查找,将URL转发给第一个碰到的服务器,即1号服务器, 此后3号服务器的下载任务都由1号服务器接管,直到3号服务器重新启 动为止。 从上面的流程可知,即使某台服务器出了问题,那么本来应该由这 台服务器负责的URL则由顺时针的下一个服务器接管,并不会对其他服 务器的任务造成影响,这样就解决了哈希取模方式的弊端,将影响范围 从全局限制到了局部,如果新加入一台下载服务器也是如此。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号