第二章:网络爬虫技术
搜索引擎的处理对象是互联网网页,目前的网页数量以百亿计算,所以需要设计出高效的下载系统,以将如此海量的网页数据传送到本地,在本地形成互联网网页的镜像备份。而这高效的下载系统就是网络爬虫
通用爬虫框架
通用爬虫框架流程如下:
-
从互联网页面中精心选择一部分网页,将这些网页的链接地址作为种子URL,将种子 URL 放进待抓取 URL 队列中
-
爬虫从待抓取URL 队列中依次读取,并将 URL 通过 DNS 解析,得到网站服务器对应的 IP地址,并将其和网页相对路径名称交给网页下载器,由网页下载器负责页面内容的下载。
-
网页处理
- 从下载的网页中抽取出所包含的所有链接信息,并在已经抓取的 URL 队列中检查,去重。将还没有被抓取过的URL 放入待抓取 URL 队列中。
- 对于下载到本地的网页,一方面将其存储到页面库中,等待后续建立索引以及其他处理。
- 将下载网页的 URL 放入已经抓取的 URL 队列中,这个队列记载了已经下载过的 URL,用于后续去重处理。
-
循环上述步骤,直到待抓取 URL 队列为空。
网页的去重以及网页反作弊等操作留待之后处理
以上是通用的爬虫框架流程,根据具体应用的不同,爬虫系统在许多方面存在差异,大体而言,可以将其划分为如下 3 种类型。
- 批量型爬虫(Batch Crawler):有比较明确的抓取范围和目标(抓了多少网页或者抓取消耗了多少时间),当爬虫达到这个设定的目标后,即停止抓取过程。
- 增量型爬虫(Incremental Crawler):增量型爬虫会保持持续不断的抓取,同时对于抓取到的网页,要定期更新,及时反映网页的变化。所以增量型爬虫处于持续不断的抓取过程中,不是在抓取新网页,就是在更新已有网页。通用的商业搜索引擎爬虫基本都属此类。
- 垂直型爬虫(Focused Crawler):垂直型爬虫关注特定主题内容或者属于特定行业的网页。比如健康网站只需要从互联网页面中找到与健康相关的页面内容即可。其他的不考虑。
下面的内容主要围绕增量型爬虫展开。
优秀爬虫的特性
从爬虫开发者的角度来看,优秀爬虫应该具备的几个特性如下:
- 高性能:性能主要是指爬虫下载网页的抓取速度,常见的评价方式是以爬虫每秒能够下载的网页数量作为性能指标。要提高爬虫的性能,关键在于设计时程序访问磁盘的操作方法及具体实现时数据结构的选择
- 可扩展性:单个爬虫无法完成所有网页的爬取,爬虫系统应该有很好的可扩展性,很容易通过增加抓取服务器和爬虫数量来达到此目的。
- 健壮性:爬虫对各种异常情况要能够正确处理。宕机后能做到恢复之前抓取的内容和数据结构,而不是将每次都需要将所有的工作完全从头做起。
- 友好性:爬虫会保护网站的部分私密性,爬虫会减少被抓取网站的网络负载。
爬虫质量的评价标准
从搜索引擎用户体验的角度考虑,对爬虫的工作效果有不同的评价标准,其中最主要的3个标准是:
- 抓取网页覆盖率:目前还没有哪一个搜索引擎可以将所有的网页都下载下来并建立索引,抓取网页覆盖率指的是爬虫抓取的网页数量占互联网所有网页数量的比例,覆盖率越高,等价于搜索引擎的召回率越高,用户体验也越好。
- 抓取网页时新性:对于爬虫抓到本地的网页来说,很多网页可能已经发生变化,或者被删除,或者内容被更改,因为爬虫完整抓取一轮需要较长的时间周期,所以抓取到的网页中必有一部分是过期的数据,即不能在网页变化后第一时间反映到网页库中,所以网页库中过期的数据越少,则网页的时新性越好。
- 抓取网页重要性:互联网尽管网页众多,但是每个网页重要性差异很大。如果搜索引擎爬虫抓回的网页大都是比较重要的网页,则可说其在抓取网页重要性方面做得很好。等价于搜索引擎的精度高。
综上所述,可以将目前爬虫研发的目标简单描述如下:
在资源有限的情况下,既然搜索引擎只能抓取互联网现存网页的一部分,那么就尽可能选择比较重要的那部分页面来索引;对于已经抓取到的网页,尽可能快地更新其内容,使得索引网页和互联网对应页面内容同步更新;在此基础上,尽可能扩大抓取范围,抓取到更多以前无法发现的网页。
爬虫相关技术
爬虫系统关键技术如下:
- 抓取策略
- 网页更新策略:增加下载网页时的时新性
- 暗网抓取:增加网页覆盖率
- 分布式爬虫:决定了爬虫的性能
这几样技术决定了爬虫系统的质量和性能
抓取策略
爬虫是从待抓取 URL 队列中取URL 进行处理的。而抓取策略,就是利用某个方法来确定待抓取URL队列中URL优先顺序的。
具体有:宽度优先遍历策略、非完全PageRank策略、OCIP策略及大站优先策略。
不论方法如何,其基本目标一致:优先选择重要网页进行抓取。
宽度优先遍历策略
基本思路:将新下载网页包含的链接直接追加到待抓取URL队列末尾。
如果某个网页包含很多入链,那么更有可能被宽度优先遍历策略早早抓到,而入链个数从侧面体现了网页的重要性,即实际上宽度优先遍历策略隐含了一些网页优先级假设。
非完全PageRank策略
基本思路:对于已经下载的网页,加上待抓取URL队列中的URL一起,形成网页集合,在此集合内进行PageRank计算,计算完成后,将待抓取URL队列里的网页按照PageRank得分由高到低排序,形成的序列就是爬虫接下来应该依次抓取的URL列表。
Q1 :如果每次新抓取到一个网页,就将所有已经下载的网页重新计算新的非完全 PageRank 值,会拉低效率
一个折中的办法是:每当新下载的网页攒够K个,然后将所有下载页面重新计算一遍新的非完全PageRank。
Q2:在展开下一轮PageRank计算之前,从新下载的网页抽取出包含的链接,很有可能这些链接的重要性非常高,理应优先下载,这种情况该如何解决?
A2: 非完全PageRank赋予这些新抽取出来但是又没有PageRank值的网页一个临时PageRank值,将这个网页的所有入链传导的PageRank值汇总,作为临时PageRank值,如果这个值比待抓取URL队列中已经计算出来PageRank值的网页高,那么优先下载这个URL。
OCIP策略
基本思路:在算法开始之前,每个互联网页面都给予相同的“现金”(cash),每当下载了某个页面P后,P将自己拥有的“现金”平均分配给页面中包含的链接页面,把自己的“现金”清空。而对于待抓取URL队列中的网页,则根据其手头拥有的现金金额多少排序,优先下载现金最充裕的网页。
OCIP与PageRank思路基本一致,区别在于:PageRank每次需要迭代计算,而OCIP策略不需要迭代过程,所以计算速度远远快于PageRank。
大站优先策略
基本思路:以网站为单位来衡量网页重要性,对于待抓取URL队列中的网页,根据所属网站归类,如果哪个网站等待下载的页面最多,则优先下载这些链接。其本质思想倾向于优先下载大型网站。
网络更新策略
网页更新策略的任务是要决定何时重新抓取之前已经下载过的网页,以尽可能使得本地下载网页和互联网原始页面内容保持一致。常用的有:历史参考策略、用户体验策略和聚类抽样策略。
历史参考策略
历史参考策略建立于如下假设之上:过去频繁更新的网页,那么将来也会频繁更新。所以,为了预估某个网页何时进行更新,可以通过参考其历史更新情况来做出决定。
用户体验策略
用户体验策略以用户体验为核心,即使本地索引的网页内容是过时的,但是如果不影响用户体验,那么晚些更新这些过时网页也未尝不可。所以判断一个网页何时更新为好,取决于这个网页的内容变化所带来搜索质量的变化(往往采用搜索结果排名的变化来衡量),影响越大的网页,则应该越快更新。
上面介绍的两种网页更新策略严重依赖网页的历史更新信息,因为这是能够进行后续计算的基础。但是在现实中,
-
为每个网页保存其历史信息,搜索系统会大量增加额外负担。
-
首次抓取到的网页没有历史信息,所以也就无法按照这两种思路去预估其更新周期。
聚类抽样策略即是为了解决上述缺点而提出的。
聚类抽样策略
聚类抽样策略认为:网页具有一些属性,根据这些属性可以预测其更新周期,具有相似属性的网页,其更新周期也是类似的。于是,可以根据这些属性将网页归类,同一类别内的网页具有相同的更新频率。为了计算某个类别的更新周期,只需对类别内网页进行采样,以这些被采样网页的更新周期作为类别内所有其他网页的更新周期。
暗网抓取
什么是暗网:目前搜索引擎爬虫按照常规方式很难抓取到的互联网页面。
如前所述,搜索引擎爬虫依赖页面中的链接关系发现新的页面,但是很多网站的内容是以数据库方式存储的,典型的例子是一些垂直领域网站,比如携程旅行网的机票数据,很难有显式链接指向数据库内的记录,往往是服务网站提供组合查询界面,只有用户按照需求输入查询之后,才可能获得相关数据。所以,常规的爬虫无法索引这些数据内容,这是暗网的命名由来。
查询组合问题
垂直搜索网站往往会给用户提供多个查询输入框,不同输入框代表了搜索对象某方面的属性,通过组合这些属性来将搜索范围缩小。爬虫系统需要完成这些输入框,从而得到具体的数据库记录。
方法一:将各个输入框可能的输入值组合起来形成查询。提交给垂直搜索引擎,从其搜索结果里提炼数据库记录。缺点在于:很多组合是无效的,大量的返回结果为空,同时对被访问的网站造成了巨大的流量压力。
方法二:富含信息查询模板(Informative Query Templates)技术。
文本框填写问题
对于输入中的文本框,需要爬虫自动生成查询。通用的解决流程如下:
解决办法如下:
- 人工观察网站进行定位,提供不同的词表
- 爬虫根据初始种子词表,向垂直搜索引擎提交查询,并下载返回的结果页面。
- 从返回结果页面里自动挖掘出相关的关键词,并形成一个新的查询列表,依次将新挖掘出的查询提交给搜索引擎。
- 重复1-3,直到无法下载到新的内容为止。通
分布式爬虫
分布式爬虫架构是必须采用的技术。面对海量待抓取网页,只有采取分布式架构,才有可能在较短时间内完成一轮抓取工作。常见的分布式架构有两种:主从式分布爬虫和对等式分布爬虫。
主从式分布式爬虫
分为 URL 服务器和 抓取服务器
-
URL服务器 专门负责对其他服务器提供URL分发服务,维护待抓取URL队列,并从中获得待抓取网页的URL,分配给不同的抓取服务器,另外还要对抓取服务器之间的工作进行负载均衡,使得各个服务器承担的工作量大致相等。
-
抓取服务器则进行实际的网页下载。抓取服务器之间没有通信联系,每个抓取服务器只和URL服务器进行消息传递。
缺点:URL服务器承担很多管理任务,同时待抓取URL队列数量巨大,所以URL服务器容易成为整个系统的瓶颈。
对等式分布式爬虫
服务器之间不存在分工差异,每台服务器承担相同的功能,各自负担一部分URL的抓取工作。由服务器来判断某个URL 是否应该由自己来抓取。
判断方法有:
- 哈希计算+取模
- 一致性哈希(Consisting Hash)