为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程式,它根据既定的抓取目标,有选择的访问全球资讯网上的网页与相关的连结,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询準备数据资源。
截止到 2007 年底,Internet 上网页数量超出 160 亿个,研究表明接近 30%的页面是重複的;动态页面的存在:客户端、伺服器端脚本语言的套用使得指向相同 Web 信息的 URL 数量呈指数级增长。 上述特徵使得网路爬虫面临一定的困难,主要体现在 Web 信息的巨大容量使得爬虫在给定时间内只能下载少量网页。 Lawrence 和 Giles 的研究表明没有哪个搜寻引擎能够索引超出 16%的Internet 上 Web 页面,即使能够提取全部页面,也没有足够的空间来存储。
为提高爬行效率,爬虫需要在单位时间内儘可能多的获取高质量页面,是它面临的难题之一。 当前有五种表示页面质量高低的方式[1]:Similarity(页面与爬行主题之间的相似度)、Backlink(页面在 Web 图中的入度大小)、PageRank(指向它的所有页面平均权值之和)、Forwardlink(页面在 Web 图中的出度大小)、Location(页面的信息位置);Parallel(并行性问题)[3]。 为了提高爬行速度,网路通常会採取并行爬行的工作方式,随之引入了新的问题:重複性(并行运行的爬虫或爬行执行绪同时运行时增加了重複页面)、质量问题(并行运行时,每个爬虫或爬行执行绪只能获取部分页面,导致页面质量下降)、通信频宽代价(并行运行时,各个爬虫或爬行执行绪之间不可避免要进行一些通信)。 并行运行时,网路爬虫通常採用三种方式:独立方式(各个爬虫独立爬行页面,互不通信)、动态分配方式(由一个中央协调器动态协调分配 URL 给各个爬虫)、静态分配方式(URL 事先划分给各个爬虫)。
分类
网路爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网路爬虫(General Purpose Web Crawler)、聚焦网路爬虫(Focused Web Crawler)、增量式网路爬虫(Incremental Web Crawler)、深层网路爬虫(Deep Web Crawler)。 实际的网路爬虫系统通常是几种爬虫技术相结合实现的。
通用网路爬虫
通用网路爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜寻引擎和大型 Web 服务提供商採集数据。 由于商业原因,它们的技术细节很少公布出来。 这类网路爬虫的爬行範围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常採用并行工作方式,但需要较长时间才能刷新一次页面。 虽然存在一定缺陷,通用网路爬虫适用于为搜寻引擎搜寻广泛的主题,有较强的套用价值。
4) 基于语境图的爬行策略:Diligenti 等人提出了一种通过建立语境图(Context Graphs)学习网页之间的相关度,训练一个机器学习系统,通过该系统可计算当前页面到相关 Web 页面的距离,距离越近的页面中的连结优先访问。印度理工大学(IIT)和 IBM 研究中心的研究人员开发了一个典型的聚焦网路爬虫。 该爬虫对主题的定义既不是採用关键字也不是加权矢量,而是一组具有相同主题的网页。 它包含两个重要模组:一个是分类器,用来计算所爬行的页面与主题的相关度,确定是否与主题相关;另一个是净化器,用来识别通过较少连结连线到大量相关页面的中心页面。
Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜寻引擎可以索引的页面,以超连结可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态连结获取的、隐藏在搜寻表单后的,只有用户提交一些关键字才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可访问信息容量是 Surface Web 的几百倍,是网际网路上最大、发展最快的新型信息资源。
Deep Web 爬虫体系结构包含六个基本功能模组 (爬行控制器、解析器、表单分析器、表单处理器、回响分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标籤/数值集合,用来表示填充表单的数据源。
Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:
1) 基于领域知识的表单填写:此方法一般会维持一个本体库,通过语义分析来选取合适的关键字填写表单。 Yiyao Lu[25]等人提出一种获取 Form 表单信息的多注解方法,将数据表单按语义分配到各个组中 ,对每组从多方面注解,结合各种注解结果来预测一个最终的注解标籤;郑冬冬等人利用一个预定义的领域本体知识库来识别 Deep Web 页面内容, 同时利用一些来自 Web 站点导航模式来识别自动填写表单时所需进行的路径导航。
2) 基于网页结构分析的表单填写: 此方法一般无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各栏位值。 Desouky 等人提出一种 LEHW 方法,该方法将 HTML 网页表示为DOM 树形式,将表单区分为单属性表单和多属性表单,分别进行处理;孙彬等人提出一种基于 XQuery 的搜寻系统,它能够模拟表单和特殊页面标记切换,把网页关键字切换信息描述为三元组单元,按照一定规则排除无效表单,将 Web 文档构造成 DOM 树,利用 XQuery 将文字属性映射到表单栏位。
Cho等人(Cho et al,1998)做了第一份抓取策略的研究。他们的数据是史丹福大学网站中的18万个页面,使用不同的策略分别模仿抓取。排序的方法使用了广度优先,后链计数,和部分pagerank算法。计算显示,如果你想要优先下载pagerank高的页面,那幺,部分PageRank策略是比较好的,其次是广度优先和后链计数。并且,这样的结果仅仅是针对一个站点的。
Najork和Wiener (Najork and Wiener, 2001)採用实际的爬虫,对3.28亿个网页,採用广度优先研究。他们发现广度优先会较早的抓到PageRank高的页面(但是他们没有採用其他策略进行研究)。作者给出的解释是:“最重要的页面会有很多的主机连线到他们,并且那些连结会较早的发现,而不用考虑从哪一个主机开始。”
Boldi等人(Boldi et al., 2004)的模拟检索实验进行在 从.it网路上取下的4000万个页面和从webbase得到的1亿个页面上,测试广度优先和深度优先,随机序列和有序序列。比较的基础是真实页面pageRank值和计算出来的pageRank值的接近程度。令人惊奇的是,一些计算pageRank很快的页面(特别明显的是广度优先策略和有序序列)仅仅可以达到很小的接近程度。
Baeza-Yates等人(Baeza-Yates et al., 2005) 在从.gr域名和.cl域名子网站上获取的300万个页面上模拟实验,比较若干个抓取策略。结果显示OPIC策略和站点伫列长度,都比广度优先要好;并且如果可行的话,使用之前的爬行抓取结果来指导这次抓取,总是十分有效的。
Daneshpajouh等人(Daneshpajouh et al., 2008)设计了一个用于寻找好种子的社区。它们从来自不同社区的高PageRank页面开始检索的方法,叠代次数明显小于使用随机种子的检索。使用这种方式,可以从以前抓取页面之中找到好的种子,使用这些种子是十分有效的。
爬虫所抓取页面的重要程度也可以表述成它与给定查询之间相似程度的函式。网路爬虫尝试下载相似页面,可以称为聚焦检索或者主题检索。关于主题检索和聚焦检索的概念,最早是由Menczer(Menczer 1997; Menczer and Belew, 1998)和Chakrabarti等人首先提出来的(Chakrabarti et al., 1999)。
Coffman等人(Edward G. Coffman,1998)是从事爬虫对象定义的,他们提出了一个相当于新鲜度的概念,但是使用了不同的措词:他们建议爬虫必须最小化过时页面部分。他们指出网路爬行的问题就相当于多个伫列,一个投票系统;这里,爬虫是伺服器,不同的站点是伫列。页面修改是到达的顾客,页面切换的时间是页面进入一个单一站点的间隔。在这个模型下,每一个顾客在投票系统的平均时间,相当于爬虫的平均过时性。
World Wide Web Worm (McBryan, 1994)是一个用来为档案建立包括标题和URL简单索引的爬虫。索引可以通过grep式的Unix命令来搜寻。
Google Crawler (Brin and Page, 1998)用了一些细节来描述,但是这些细节仅仅是关于使用C++和Python编写的、一个早期版本的体系结构。因为文本解析就是全文检索和URL抽取的过程,所以爬虫集成了索引处理。这里拥有一个URL伺服器,用来给几个爬虫程式传送要抓取的URL列表。在文本解析的时候,新发现的URL传送给URL伺服器并检测这个URL是不是已经存在,如果不存在的话,该URL就加入到URL伺服器中。
CobWeb (da Silva et al., 1999)使用了一个中央“调度者”和一系列的“分散式的蒐集者”。蒐集者解析下载的页面并把找到的URL传送给调度者,然后调度者反过来分配给蒐集者。调度者使用深度优先策略,并且使用平衡礼貌策略来避免伺服器超载。爬虫是使用Perl语言编写的。
Mercator (Heydon and Najork, 1999; Najork and Heydon, 2001)是一个分散式的,模组化的使用java编写的网路爬虫。它的模组化源自于使用可互换的的“协定模组”和“处理模组”。协定模组负责怎样获取网页(例如使用HTTP),处理模组负责怎样处理页面。标準处理模组仅仅包括了解析页面和抽取URL,其他处理模组可以用来检索文本页面,或者蒐集网路数据。
WebFountain (Edwards et al., 2001)是一个与Mercator类似的分散式的模组化的爬虫,但是使用C++编写的。它的特点是一个管理员机器控制一系列的蚂蚁机器。经过多次下载页面后,页面的变化率可以推测出来,这时,一个非线性的方法必须用于求解方程以获得一个最大的新鲜度的访问策略。作者推荐在早期检索阶段使用这个爬虫,然后用统一策略检索,就是所有的页面都使用相同的频率访问。
PolyBot [Shkapenyuk and Suel, 2002]是一个使用C++和Python编写的分散式网路爬虫。它由一个爬虫管理者,一个或多个下载者,一个或多个DNS解析者组成。抽取到的URL被添加到硬碟的一个伫列里面,然后使用批处理的模式处理这些URL。平衡礼貌方面考虑到了第二、三级网域,因为第三级网域通常也会保存在同一个网路伺服器上。
WebRACE (Zeinalipour-Yazti and Dikaiakos, 2002)是一个使用java实现的,拥有检索模组和快取模组的爬虫,它是一个很通用的称作eRACE的系统的一部分。系统从用户得到下载页面的请求,爬虫的行为有点像一个聪明的代理伺服器。系统还监视订阅网页的请求,当网页发生改变的时候,它必须使爬虫下载更新这个页面并且通知订阅者。WebRACE最大的特色是,当大多数的爬虫都从一组URL开始的时候,WebRACE可以连续地的接收抓取开始的URL地址。
Ubicrawer (Boldi et al., 2004)是一个使用java编写的分散式爬虫。它没有中央程式。它由一组完全相同的代理组成,分配功能通过主机前后一致的散列计算进行。这里没有重複的页面,除非爬虫崩溃了(然后,另外一个代理就会接替崩溃的代理重新开始抓取)。爬虫设计为高伸缩性和允许失败的。
FAST Crawler (Risvik and Michelsen, 2002) 是一个分散式的爬虫,在Fast Search&Transfer中使用,关于其体系结构的一个大致的描述可以在[citation needed]找到。