什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更常常的称为网页追逐者),是一种按照必定的规则,自动地抓取万维网信息的程序或者脚本。另一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

产生背景


随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,做为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。可是,这些通用性搜索引擎也存在着必定的局限性,如:
(1)不一样领域、不一样背景的用户每每具备不一样的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
(2)通用搜索引擎的目标是尽量大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不一样数据大量出现,通用搜索引擎每每对这些信息含量密集且具备必定结构的数据无能为力,不能很好地发现和获取。
(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
网络爬虫网络爬虫
为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的连接,获取所须要的信息。与通用爬虫(general purpose web crawler)不一样,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
1 聚焦爬虫工做原理以及关键技术概述
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,得到初始网页上的URL,在抓取网页的过程当中,不断从当前页面上抽取新的URL放入队列,直到知足系统的必定中止条件。聚焦爬虫的工做流程较为复杂,须要根据必定的网页分析算法过滤与主题无关的连接,保留有用的连接并将其放入等待抓取的URL队列。而后,它将根据必定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时中止。另外,全部被爬虫抓取的网页将会被系统存贮,进行必定的分析、过滤,并创建索引,以便以后的查询和检索;对于聚焦爬虫来讲,这一过程所获得的分析结果还可能对之后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还须要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2) 对网页或数据的分析与过滤;
(3) 对URL的搜索策略。
 

面临的问题

编辑
截止到 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)。 实际的网络爬虫系统一般是几种爬虫技术相结合实现的 [1]  。
通用网络爬虫
通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。 因为商业缘由,它们的技术细节不多公布出来。 这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时因为待刷新的页面太多,一般采用并行工做方式,但须要较长时间才能刷新一次页面。 虽然存在必定缺陷,通用网络爬虫适用于为搜索引擎搜索普遍的主题,有较强的应用价值 。
通用网络爬虫的结构大体能够分为页面爬行模块 、页面分析模块、连接过滤模块、页面数据库、URL 队列、初始 URL 集合几个部分。为提升工做效率,通用网络爬虫会采起必定的爬行策略。 经常使用的爬行策略有:深度优先策略、广度优先策略  。
1) 深度优先策略:其基本方法是按照深度由低到高的顺序,依次访问下一级网页连接,直到不能再深刻为止。 爬虫在完成一个爬行分支后返回到上一连接节点进一步搜索其它连接。 当全部连接遍历完后,爬行任务结束。 这种策略比较适合垂直搜索或站内搜索, 但爬行页面内容层次较深的站点时会形成资源的巨大浪费   。
2) 广度优先策略:此策略按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深刻下一层继续爬行。 这种策略可以有效控制页面的爬行深度,避免遇到一个无穷深层分支时没法结束爬行的问题,实现方便,无需存储大量中间节点,不足之处在于需较长时间才能爬行到目录层次较深的页面   。
聚焦网络爬虫
 
聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫[8]。 和通用网络爬虫相比,聚焦爬虫只须要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也因为数量少而更新快,还能够很好地知足一些特定人群对特定领域信息的需求 [1]  。
聚焦网络爬虫和通用网络爬虫相比,增长了连接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面内容和连接的重要性,不一样的方法计算出的重要性不一样,由此致使连接的访问顺序也不一样 [1]  。
1) 基于内容评价的爬行策略:DeBra将文本类似度的计算方法引入到网络爬虫中,提出了 Fish Search 算法,它将用户输入的查询词做为主题,包含查询词的页面被视为与主题相关,其局限性在于没法评价页面与主题相关 度 的 高 低 。 Herseovic对 Fish Search 算 法 进 行 了 改 进 ,提 出 了 Sharksearch 算法,利用空间向量模型计算页面与主题的相关度大小 [1]  。
2) 基于连接结构评价的爬行策略 :Web 页面做为一种半结构化文档,包含不少结构信息,可用来评价连接重要性。 PageRank 算法最初用于搜索引擎信息检索中对查询结果进行排序,也可用于评价连接重要性,具体作法就是每次选择 PageRank 值较大页面中的连接来访问。 另外一个利用 Web结构评价连接价值的方法是 HITS 方法,它经过计算每一个已访问页面的 Authority 权重和 Hub 权重,并以此决定连接的访问顺序 [1]  。
3) 基于加强学习的爬行策略:Rennie 和 McCallum 将加强学习引入聚焦爬虫,利用贝叶斯分类器,根据整个网页文本和连接文本对超连接进行分类,为每一个连接计算出重要性,从而决定连接的访问顺序 [1]  。
4) 基于语境图的爬行策略:Diligenti 等人提出了一种经过创建语境图(Context Graphs)学习网页之间的相关度,训练一个机器学习系统,经过该系统可计算当前页面到相关 Web 页面的距离,距离越近的页面中的连接优先访问。印度理工大学(IIT)和 IBM 研究中心的研究人员开发了一个典型的聚焦网络爬虫。 该爬虫对主题的定义既不是采用关键词也不是加权矢量,而是一组具备相同主题的网页。 它包含两个重要模块:一个是分类器,用来计算所爬行的页面与主题的相关度,肯定是否与主题相关;另外一个是净化器,用来识别经过较少连接链接到大量相关页面的中心页面 [1]  。
增量式网络爬虫
增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增 量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它可以在必定程度上保证所爬行的页面是尽量新的页面。 和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在须要的时候爬行新产生或发生更新的页面 ,并不从新下载没有发生变化的页面,可有效减小数据下载量,及时更新已爬行的网页,减少时间和空间上的耗费,可是增长了爬行算法的复杂度和实现难度。增量式网络爬虫的体系结构[包含爬行模块、排序模块、更新模块、本地页面集、待爬行 URL 集以及本地页面URL 集 [1]  。
增量式爬虫有两个目标:保持本地页面集中存储的页面为最新页面和提升本地页面集中页面的质量。 为实现第一个目标,增量式爬虫须要经过从新访问网页来更新本地页面集中页面内容,经常使用的方法有:1) 统一更新法:爬虫以相同的频率访问全部网页,不考虑网页的改变频率;2) 个体更新法:爬虫根据个体网页的改变频率来从新访问各页面;3) 基于分类的更新法:爬虫根据网页改变频率将其分为更新较快网页子集和更新较慢网页子集两类,而后以不一样的频率访问这两类网页 [1]  。
为实现第二个目标,增量式爬虫须要对网页的重要性排序,经常使用的策略有:广度优先策略、PageRank 优先策略等。IBM 开发的 WebFountain是一个功能强大的增量式网络爬虫,它采用一个优化模型控制爬行过程,并无对页面变化过程作任何统计假设,而是采用一种自适应的方法根据先前爬行周期里爬行结果和网页实际变化速度对页面更新频率进行调整。北京大学的天网增量爬行系统旨在爬行国内 Web,将网页分为变化网页和新网页两类,分别采用不一样爬行策略。 为缓解对大量网页变化历史维护致使的性能瓶颈,它根据网页变化时间局部性规律,在短时期内直接爬行屡次变化的网页 ,为尽快获取新网页,它利用索引型网页跟踪新出现网页 [1]  。
Deep Web 爬虫
Web 页面按存在方式能够分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎能够索引的页面,以超连接能够到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部份内容不能经过静态连接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能得到的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可访问信息容量是 Surface Web 的几百倍,是互联网上最大、发展最快的新型信息资源 [1]  。
Deep Web 爬虫体系结构包含六个基本功能模块 (爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源 [1]  。
Deep Web 爬虫爬行过程当中最重要部分就是表单填写,包含两种类型:
1) 基于领域知识的表单填写:此方法通常会维持一个本体库,经过语义分析来选取合适的关键词填写表单。 Yiyao Lu[25]等人提出一种获取 Form 表单信息的多注解方法,将数据表单按语义分配到各个组中 ,对每组从多方面注解,结合各类注解结果来预测一个最终的注解标签;郑冬冬等人利用一个预约义的领域本体知识库来识别 Deep Web 页面内容, 同时利用一些来自 Web 站点导航模式来识别自动填写表单时所需进行的路径导航 [1]  。
2) 基于网页结构分析的表单填写: 此方法通常无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各字段值。 Desouky 等人提出一种 LEHW 方法,该方法将 HTML 网页表示为DOM 树形式,将表单区分为单属性表单和多属性表单,分别进行处理;孙彬等人提出一种基于 XQuery 的搜索系统,它可以模拟表单和特殊页面标记切换,把网页关键字切换信息描述为三元组单元,按照必定规则排除无效表单,将 Web 文档构形成 DOM 树,利用 XQuery 将文字属性映射到表单字段[1]  。
Raghavan 等人提出的 HIWE 系统中,爬行管理器负责管理整个爬行过程,分析下载的页面,将包含表单的页面提交表单处理器处理,表单处理器先从页面中提取表单,从预先准备好的数据集中选择数据自动填充并提交表单,由爬行控制器下载相应的结果页面 [1]  。
 

抓取目标分类

编辑
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。
现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。
基于目标网页特征
基于目标网页特征的爬虫所抓取、存储并索引的对象通常为网站或网页。根据种子样本获取方式可分为:
(1) 预先给定的初始抓取种子样本;
(2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;
(3) 经过用户行为肯定的抓取目标样例,分为:
(a) 用户浏览过程当中显示标注的抓取样本;
(b) 经过用户日志挖掘获得访问模式及相关样本。
其中,网页特征能够是网页的内容特征,也能够是网页的连接结构特征,等等。
基于目标数据模式
基于目标数据模式的爬虫针对的是网页上的数据,所抓取的数据通常要符合必定的模式,或者能够转化或映射为目标数据模式。
基于领域概念
另外一种描述方式是创建目标领域的本体或词典,用于从语义角度分析不一样特征在某一主题中的重要程度。
 

网页搜索策略

编辑
网页的抓取策略能够分为深度优先、广度优先和最佳优先三种。深度优先在不少状况下会致使爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。
 

广度优先搜索

广度优先搜索策略是指在抓取过程当中,在完成当前层次的搜索后,才进行下一层次的搜索。该算法的设计和实现相对简单。在目前为覆盖尽量多的网页,通常使用广度优先搜索方法。也有不少研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是认为与初始URL在必定连接距离内的网页具备主题相关性的几率很大。另一种方法是将广度优先搜索与网页过滤技术结合使用,先用广度优先策略抓取网页,再将其中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。
 

最佳优先搜索

最佳优先搜索策略按照必定的网页分析算法,预测候选URL与目标网页的类似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问通过网页分析算法预测为“有用”的网页。存在的一个问题是,在爬虫抓取路径上的不少相关网页可能被忽略,由于最佳优先策略是一种局部最优搜索算法。所以须要将最佳优先结合具体的应用进行改进,以跳出局部最优势。将在第4节中结合网页分析算法做具体的讨论。研究代表,这样的闭环调整能够将无关网页数量下降30%~90%。
 

深度优先搜索

深度优先搜索策略从起始网页开始,选择一个URL进入,分析这个网页中的URL,选择一个再进入。如此一个连接一个连接地抓取下去,直处处理完一条路线以后再处理下一条路线。深度优先策略设计较为简单。然而门户网站提供的连接每每最具价值,PageRank也很高,但每深刻一层,网页价值和PageRank都会相应地有所降低。这暗示了重要网页一般距离种子较近,而过分深刻抓取到的网页却价值很低。同时,这种策略抓取深度直接影响着抓取命中率以及抓取效率,对抓取深度是该种策略的关键。相对于其余两种策略而言。此种策略不多被使用。
 

网页分析算法

编辑
网页分析算法能够概括为基于网络拓扑、基于网页内容和基于用户访问行为三种类型。
拓扑分析算法
基于网页之间的连接,经过已知的网页或数据,来对与其有直接或间接连接关系的对象(能够是网页或网站等)做出评价的算法。又分为网页粒度、网站粒度和网页块粒度这三种。
1 网页(Webpage)粒度的分析算法
PageRank和HITS算法是最多见的连接分析算法,二者都是经过对网页间连接度的递归和规范化计算,获得每一个网页的重要度评价。PageRank算法虽然考虑了用户访问行为的随机性和Sink网页的存在,但忽略了绝大多数用户访问时带有目的性,即网页和连接与查询主题的相关性。针对这个问题,HITS算法提出了两个关键的概念:权威型网页(authority)和中心型网页(hub)。
基于连接的抓取的问题是相关页面主题团之间的隧道现象,即不少在抓取路径上偏离主题的网页也指向目标网页,局部评价策略中断了在当前路径上的抓取行为。文献[21]提出了一种基于反向连接(BackLink)的分层式上下文模型(Context Model),用于描述指向目标网页必定物理跳数半径内的网页拓扑图的中心Layer0为目标网页,将网页依据指向目标网页的物理跳数进行层次划分,从外层网页指向内层网页的连接称为反向连接。
2 网站粒度的分析算法
网站粒度的资源发现和管理策略也比网页粒度的更简单有效。网站粒度的爬虫抓取的关键之处在于站点的划分和站点等级(SiteRank)的计算。SiteRank的计算方法与PageRank相似,可是须要对网站之间的连接做必定程度抽象,并在必定的模型下计算连接的权重。
网站划分状况分为按域名划分和按IP地址划分两种。文献[18]讨论了在分布式状况下,经过对同一个域名下不一样主机、服务器的IP地址进行站点划分,构造站点图,利用相似PageRank的方法评价SiteRank。同时,根据不一样文件在各个站点上的分布状况,构造文档图,结合SiteRank分布式计算获得DocRank。文献[18]证实,利用分布式的SiteRank计算,不只大大下降了单机站点的算法代价,并且克服了单独站点对整个网络覆盖率有限的缺点。附带的一个优势是,常见PageRank 造假难以对SiteRank进行欺骗。
3 网页块粒度的分析算法
在一个页面中,每每含有多个指向其余页面的连接,这些连接中只有一部分是指向主题相关网页的,或根据网页的连接锚文本代表其具备较高重要性。可是,在PageRank和HITS算法中,没有对这些连接做区分,所以经常给网页分析带来广告等噪声连接的干扰。在网页块级别(Block?level)进行连接分析的算法的基本思想是经过VIPS网页分割算法将网页分为不一样的网页块(page block),而后对这些网页块创建page?to?block和block?to?page的连接矩阵,?分别记为Z和X。因而,在page?to?page图上的网页块级别的PageRank为?W?p=X×Z;?在block?to?block图上的BlockRank为?W?b=Z×X。已经有人实现了块级别的PageRank和HITS算法,并经过实验证实,效率和准确率都比传统的对应算法要好。
网页内容分析算法
基于网页内容的分析算法指的是利用网页内容(文本、数据等资源)特征进行的网页评价。网页的内容从原来的以超文本为主,发展到后来动态页面(或称为Hidden Web)数据为主,后者的数据量约为直接可见页面数据(PIW,Publicly Indexable Web)的400~500倍。另外一方面,多媒体数据、Web Service等各类网络资源形式也日益丰富。所以,基于网页内容的分析算法也从原来的较为单纯的文本检索方法,发展为涵盖网页数据抽取、机器学习、数据挖掘、语义理解等多种方法的综合应用。本节根据网页数据形式的不一样,将基于网页内容的分析算法,概括如下三类:第一种针对以文本和超连接为主的无结构或结构很简单的网页;第二种针对从结构化的数据源(如RDBMS)动态生成的页面,其数据不能直接批量访问;第三种针对的数据界于第一和第二类数据之间,具备较好的结构,显示遵循必定模式或风格,且能够直接访问。
基于文本的网页分析算法
1) 纯文本分类与聚类算法
很大程度上借用了文本检索的技术。文本分析算法能够快速有效的对网页进行分类和聚类,可是因为忽略了网页间和网页内部的结构信息,不多单独使用。
2) 超文本分类和聚类算法
根据网页连接网页的相关类型对网页进行分类,依靠相关联的网页推测该网页的类型。

补充

编辑
这些处理被称为网络抓取或者蜘蛛爬行。不少站点,尤为是搜索引擎,都使用爬虫提供最新的数据,它主要用于提供它访问过页面的一个副本,而后,搜索引擎就能够对获得的页面进行索引,以提供快速的访问。蜘蛛也能够在web上用来自动执行一些任务,例如检查连接,确认html代码;也能够用来抓取网页上某种特定类型信息,例如抓取电子邮件地址(一般用于垃圾邮件)。
一个网络蜘蛛就是一种机器人,或者软件代理。大致上,它从一组要访问的URL连接开始,能够称这些URL为种子。爬虫访问这些连接,它辨认出这些页面的全部超连接,而后添加到这个URL列表,能够称做检索前沿。这些URL按照必定的策略反复访问。
1. 爬行策略
下述的三种网络特征,形成了设计网页爬虫抓取策略变得很难:
 它巨大的数据量;
 它快速的更新频率;
 动态页面的产生
它们三个特征一块儿产生了不少种类的爬虫抓取连接。
巨大的数据量暗示了爬虫,在给定的时间内,只能够抓取所下载网络的一部分,因此,它须要对它的抓取页面设置优先级;快速的更新频率说明在爬虫抓取下载某网站一个网页的时候,颇有可能在这个站点又有新的网页被添加进来,或者这个页面被更新或者删除了。
最近新增的不少页面都是经过服务器端脚本语言产生的,无穷的参数组合也增长了爬虫抓取的难度,只有一小部分这种组合会返回一些独特的内容。例如,一个很小照片存储库仅仅经过get方式可能提供就给用户三种操做方式。若是这里存着四种分类方式,三种缩略图方式,两种文件格式,和一个禁止用户提供内容的选项,那么,一样的内容就能够经过48种方式访问。这种数学组合给网络爬虫创造的难处就是,为了获取不一样的内容,他们必须筛选无穷仅有微小变化的组合。
正如爱德华等人所说的:“用于检索的带宽不是无限的,也不是免费的;因此,若是引入衡量爬虫抓取质量或者新鲜度的有效指标的话,不但伸缩性,连有效性都将变得十分必要”(爱德华等人,2001年)。一个爬虫就必须当心的选择下一步要访问什么页面。网页爬虫的行为一般是四种策略组合的结果。
♦ 选择策略,决定所要下载的页面;
♦ 从新访问策略,决定何时检查页面的更新变化;
♦ 平衡礼貌策略,指出怎样避免站点超载;
♦ 并行策略,指出怎么协同达到分布式抓取的效果;
1.1 选择策略:
就如今网络资源的大小而言,即便很大的搜索引擎也只能获取网络上可获得资源的一小部分。由劳伦斯河盖尔斯共同作的一项研究指出,没有一个搜索引擎抓取的内容达到网络的16%(劳伦斯河盖尔斯,2001)。网络爬虫一般仅仅下载网页内容的一部分,可是你们都仍是强烈要求下载的部分包括最多的相关页面,而不只仅是一个随机的简单的站点。
这就要求一个公共标准来区分网页的重要程度,一个页面的重要程度与他自身的质量有关,与按照连接数、访问数得出的受欢迎程度有关,甚至与他自己的网址(后来出现的把搜索放在一个顶级域名或者一个固定页面上的垂直搜索)有关。设计一个好的搜索策略还有额外的困难,它必须在不彻底信息下工做,由于整个页面的集合在抓取时是未知的。
Cho等人(Cho et al,1998)作了第一份抓取策略的研究。他们的数据是斯坦福大学网站中的18万个页面,使用不一样的策略分别模仿抓取。排序的方法使用了广度优先,后链计数,和部分pagerank算法。计算显示,若是你想要优先下载pagerank高的页面,那么,部分PageRank策略是比较好的,其次是广度优先和后链计数。而且,这样的结果仅仅是针对一个站点的。
Najork和Wiener (Najork and Wiener, 2001)采用实际的爬虫,对3.28亿个网页,采用广度优先研究。他们发现广度优先会较早的抓到PageRank高的页面(可是他们没有采用其余策略进行研究)。做者给出的解释是:“最重要的页面会有不少的主机链接到他们,而且那些连接会较早的发现,而不用考虑从哪个主机开始。”
Abiteboul (Abiteboul 等人, 2003),设计了一种基于OPIC(在线页面重要指数)的抓取战略。在OPIC中,每个页面都有一个相等的初始权值,并把这些权值平均分给它所指向的页面。这种算法与Pagerank类似,可是他的速度很快,而且能够一次完成。OPIC的程序首先抓取获取权值最大的页面,实验在10万个幂指分布的模拟页面中进行。而且,实验没有和其它策略进行比较,也没有在真正的WEB页面测试。
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页面开始检索的方法,迭代次数明显小于使用随机种子的检索。使用这种方式,能够从之前抓取页面之中找到好的种子,使用这些种子是十分有效的。
1.1.1 限定访问连接
一个爬虫可能仅仅想找到html页面的种子而避免其余的文件类型。为了仅仅获得html的资源,一个爬虫能够首先作一个http head的请求,以在使用request方法获取全部的资源以前,决定这个网络文件的类型。为了不要发送过多的head请求,爬虫能够交替的检查url而且仅仅对以html,htm和反斜杠结尾的文件发送资源请求。这种策略会致使不少的html资源在无心中错过,一种类似的策略是将网络资源的扩展名同已知是html文件类型的一组扩展名(如.html,.htm,.asp,.php,.aspx,反斜杠)进行比较。
一些爬虫也会限制对任何含有“?”的资源(这些是动态生成的)进行获取请求,以免蜘蛛爬行在某一个站点中陷入下载无穷无尽的URL的困境。
1.1.2 路径检索
一些爬虫会尽量多的尝试下载一个特定站点的资源。Cothey(Cothey,2004)引入了一种路径检索的爬虫,它会尝试抓取须要检索资源的全部URL。例如,给定一个种子地址:它将会尝试检索/hamster/menkey/,/hamster/和/ 。Cothey发现路径检索对发现独立资源,或者一些一般爬虫检索不到的的链接是很是有效的。
一些路径检索的爬虫也被称为收割机软件,由于他们一般用于收割或者收集全部的内容,多是从特定的页面或者主机收集相册的照片。
1.1.3 聚焦抓取
爬虫所抓取页面的重要程度也能够表述成它与给定查询之间类似程度的函数。网络爬虫尝试下载类似页面,能够称为聚焦检索或者主题检索。关于主题检索和聚焦检索的概念,最先是由Menczer(Menczer 1997; Menczer and Belew, 1998)和Chakrabarti等人首先提出来的(Chakrabarti et al., 1999)。
聚焦检索的主要问题是网页爬虫的使用环境,咱们但愿在实际下载页面以前,就能够知道给定页面和查询之间的类似度。一个可能的方法就是在连接之中设置锚点,这就是在早期时候,Pinkerton(Pinkerton,1994)曾经在一个爬虫中采用的策略。Diligenti等人(Diligenti等人,2000)建议使用已经抓取页面的内容去推测查询和未访问页的类似度。一个聚焦查询的表现的好坏主要依赖于查询主题内容的丰富程度,一般还会依赖页面查询引擎提供的查询起点。
1.1.4 抓取深层的网页
不少的页面隐藏的很深或隐藏在在看不到的网络之中。这些页面一般只有在向数据库提交查询的时候才能够访问到,若是没有连接指向他们的话,通常的爬虫是不能访问到这些页面的。谷歌站点地图协议和mod oai(Nelson等人,2005)尝试容许发现这些深层次的资源。
深层页面抓取器增长了抓取网页的连接数。一些爬虫仅仅抓取形如<a href=”url”连接。某些状况下,例如Googlebot,WEB抓取的是全部超文本所包含的内容,标签和文本。
1.1.5 WEB3.0检索
Web3.0为下一代搜索技术定义了更先进的技术和新的准则,能够归纳为语义网络和网站模板解析的概念。第三代检索技术将创建在人机巧妙的联系的基础上。
1.2从新访问策略
网络具备动态性很强的特性。抓取网络上的一小部份内容可能会花费真的很长的时间,一般用周或者月来衡量。当爬虫完成它的抓取的任务之后,不少操做是可能会发生的,这些操做包括新建,更新和删除。
从搜索引擎的角度来看,不检测这些事件是有成本的,成本就是咱们仅仅拥有一份过期的资源。最常使用的成本函数,是新鲜度和过期性(2000年,Cho 和Garcia-Molina)
新鲜度:这是一个衡量抓取内容是否是准确的二元值。在时间t内,仓库中页面p的新鲜度是这样定义的:
新鲜度新鲜度
过期性:这是一个衡量本地已抓取的内容过期程度的指标。在时间t时,仓库中页面p的时效性的定义以下:
过期性过期性
在页面抓取中,新鲜度和过期性的发展
Coffman等人(Edward G. Coffman,1998)是从事爬虫对象定义的,他们提出了一个至关于新鲜度的概念,可是使用了不一样的措词:他们建议爬虫必须最小化过期页面部分。他们指出网络爬行的问题就至关于多个队列,一个投票系统;这里,爬虫是服务器,不一样的站点是队列。页面修改是到达的顾客,页面切换的时间是页面进入一个单一站点的间隔。在这个模型下,每个顾客在投票系统的平均时间,至关于爬虫的平均过期性。
爬虫的目标是尽量高的提升页面的新鲜度,同时下降页面的过期性。这一目标并非彻底同样的,第一种状况,爬虫关心的是有多少页面时过期的;在第二种状况,爬虫关心的页面过期了多少。
两种最简单的从新访问策略是由Cho和Garcia-Molina研究的(Cho 和Garcia-Molina,2003):
统一策略:使用相同的频率,从新访问收藏中的全部的连接,而不考虑他们更新频率。
正比策略:对变化越多的网页,从新访问的频率也越高。网页访问的频率和网页变化的频率直接相关。
(两种状况下,爬虫的从新抓取均可以采用随机方式,或者固定的顺序)
Cho和Garcia-Molina证实了一个出人意料的结果。以平均新鲜度方式衡量,统一策略在模拟页面和真实的网络抓取中都比正比策略出色。对于这种结果的解释是:当一个页面变化太快的时候,爬虫将会将会在不断的尝试从新抓取而浪费不少时间,可是却仍是不能保证页面的新鲜度。
为了提升页面的新鲜度,咱们应该宣判变化太快的页面死罪(Cho和Garcia-Molina, 2003a)。最佳的从新访问策略既不是统一策略,也不是正比策略;保持平均页面新鲜度高的最佳方法策略包括忽略那些变化太快的页面,而保持页面平均过期性低的方法则是对每一页按照页面变化率单调变化的策略访问。两种状况下,最佳的策略较正比策略,都更接近统一策略。正如Coffman等人(Edward G.Coffman,1998)所注意到的:“为了最小化页面过期的时间,对任一个页面的访问都应该尽量的均匀间隔地访问。”对于从新访问的详尽的策略在大致上是不能够达到的,可是他们能够从数学上获得,由于他们依赖于页面的变化。(Cho和Garcia-Molina,2003a)指出指数变化是描述页面变化的好方法,同时(Ipeirotis等人,2005)指出了怎么使用统计工具去发现适合这些变化的参数。注意在这里的从新访问策略认为每个页面都是相同的(网络上全部的页面价值都是同样的)这不是现实的状况,因此,为了获取更好的抓取策略,更多有关网页质量的信息应该考虑进去。
1.3 平衡礼貌策略
爬虫相比于人,能够有更快的检索速度和更深的层次,因此,他们可能使一个站点瘫痪。不须要说一个单独的爬虫一秒钟要执行多条请求,下载大的文件。一个服务器也会很难响应多线程爬虫的请求。
就像Koster(Koster,1995)所注意的那样,爬虫的使用对不少工做都是颇有用的,可是对通常的社区,也须要付出代价。使用爬虫的代价包括:
 网络资源:在很长一段时间,爬虫使用至关的带宽高度并行地工做。
 服务器超载:尤为是对给定服务器的访问太高时。
 质量糟糕的爬虫,可能致使服务器或者路由器瘫痪,或者会尝试下载本身没法处理的页面。
 我的爬虫,若是过多的人使用,可能致使网络或者服务器阻塞。
对这些问题的一个部分解决方法是漫游器排除协议(Robots exclusion protocol),也被称为robots.txt议定书(Koster,1996),这份协议对于管理员指明网络服务器的那一部分不能到达是一个标准。这个标准没有包括从新访问一台服务器的间隔的建议,虽然访问间隔是避免服务器超载的最有效的办法。最近的商业搜索软件,如Ask Jeeves,MSN和Yahoo能够在robots.txt中使用一个额外的 “Crawl-delay”参数来指明请求之间的延迟。
对链接间隔时间的第一个建议由Koster 1993年给出,时间是60秒。按照这个速度,若是一个站点有超过10万的页面,即便咱们拥有零延迟和无穷带宽的完美链接,它也会须要两个月的时间来下载整个站点,而且,这个服务器中的资源,只有一小部分能够使用。这彷佛是不能够接受的。
Cho(Cho和Garcia-Molina, 2003)使用10秒做为访问的间隔时间,WIRE爬虫(Baeza-Yates and Castillo, 2002)使用15秒做为默认间隔。MercatorWeb(Heydon 和Najork, 1999)爬虫使用了一种自适应的平衡策略:若是从某一服务器下载一个文档须要t秒钟,爬虫就等待10t秒的时间,而后开始下一个页面。Dill等人 (Dill et al., 2002) 使用1秒。
对于那些使用爬虫用于研究目的的,一个更详细的成本-效益分析是必要的,当决定去哪个站点抓取,使用多快的速度抓取的时候,伦理的因素也须要考虑进来。
访问记录显示已知爬虫的访问间隔从20秒钟到3-4分钟不等。须要注意的是即便很礼貌,采起了全部的安全措施来避免服务器超载,仍是会引来一些网络服务器管理员的抱怨的。Brin和Page注意到:运行一个针对超过50万服务器的爬虫,会产生不少的邮件和电话。这是由于有无数的人在上网,而这些人不知道爬虫是什么,由于这是他们第一次见到。(Brin和Page,1998)
1.4 并行策略
一个并行爬虫是并行运行多个进程的爬虫。它的目标是最大化下载的速度,同时尽可能减小并行的开销和下载重复的页面。为了不下载一个页面两次,爬虫系统须要策略来处理爬虫运行时新发现的URL,由于同一个URL地址,可能被不一样的爬虫进程抓到。
2. 网络爬虫体系结构
网页爬虫的高层体系结构
一个爬虫不能像上面所说的,仅仅只有一个好的抓取策略,还须要有一个高度优化的结构。
Shkapenyuk和Suel(Shkapenyuk和Suel,2002)指出:设计一个短期内,一秒下载几个页面的颇慢的爬虫是一件很容易的事情,而要设计一个使用几周能够下载百万级页面的高性能的爬虫,将会在系统设计,I/O和网络效率,健壮性和易用性方面遇到众多挑战。
网路爬虫是搜索引擎的核心,他们算法和结构上的细节被看成商业机密。当爬虫的设计发布时,总会有一些为了阻止别人复制工做而缺失的细节。人们也开始关注主要用于阻止主要搜索引擎发布他们的排序算法的“搜索引擎垃圾邮件”。
2.1 URL通常化
爬虫一般会执行几种类型的URL规范化来避免重复抓取某些资源。URL通常化也被称为URL标准化,指的是修正URL而且使其先后一致的过程。这里有几种通常化方法,包括转化URL为小写的,去除逗号(如‘.’ ‘..’等),对非空的路径,在末尾加反斜杠。
3. 爬虫身份识别
网络爬虫经过使用http请求的用户代理(User Agent)字段来向网络服务器代表他们的身份。网络管理员则经过检查网络服务器的日志,使用用户代理字段来辨认哪个爬虫曾经访问过以及它访问的频率。用户代理字段可能会包含一个可让管理员获取爬虫更多信息的URL。邮件抓取器和其余怀有恶意的网络爬虫一般不会留任何的用户代理字段内容,或者他们也会将他们的身份假装成浏览器或者其余的知名爬虫。
对于网路爬虫,留下用户标志信息是十分重要的;这样,网络管理员在须要的时候就能够联系爬虫的主人。有时,爬虫可能会陷入爬虫陷阱或者使一个服务器超负荷,这时,爬虫主人须要使爬虫中止。对那些有兴趣了解特定爬虫访问时间网络管理员来说,用户标识信息是十分重要的。
4.用户爬虫的例子
如下是一系列已经发布的通常用途的网络爬虫(除了主题检索的爬虫)的体系结构,包括了对不一样组件命名和突出特色的简短的描述。
 RBSE (Eichmann,1994)是第一个发布的爬虫。它有两个基础程序。第一个是“spider”,抓取队列中的内容到一个关系数据库中,第二个程序是“mite”,是一个修改后的www的ASCII浏览器,负责从网络上下载页面。
 WebCrawler(Pinkerton,1994)是第一个公开可用的 用来创建全文索引的一个子程序,他使用库www来下载页面;另一个程序使用广度优先来解析获取URL并对其排序;它还包括一个根据选定文本和查询类似程度爬行的实时爬虫。
 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。平衡礼貌方面考虑到了第2、三级网域,由于第三级网域一般也会保存在同一个网络服务器上。
 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]找到。
 Labrador,一个工做在开源项目Terrier Search Engine上的非开源的爬虫。
 TeezirCrawler是一个非开源的可伸缩的网页抓取器,在Teezir上使用。该程序被设计为一个完整的能够处理各类类型网页的爬虫,包括各类JavaScript和HTML文档。爬虫既支持主题检索也支持非主题检索。
 Spinn3r, 一个经过博客构建反馈信息的爬虫。 Spinn3r是基于java的,它的大部分的体系结构都是开源的。
 HotCrawler,一个使用c语言和php编写的爬虫。
 ViREL Microformats Crawler,搜索公众信息做为嵌入到网页的一小部分。
除了上面列出的几个特定的爬虫结构之外,还有Cho (Cho and Garcia-Molina, 2002)和Chakrabarti (Chakrabarti, 2003)发布的通常的爬虫体系结构。
4.1 开源爬虫
 DataparkSearch是一个在GNU GPL许可下发布的爬虫搜索引擎。
 GNU Wget是一个在GPL许可下,使用C语言编写的命令行式的爬虫。它主要用于网络服务器和FTP服务器的镜像。
 Heritrix是一个互联网档案馆级的爬虫,设计的目标为对大型网络的大部份内容的按期存档快照,是使用java编写的。
 Ht://Dig在它和索引引擎中包括了一个网页爬虫。
 HTTrack用网络爬虫建立网络站点镜像,以便离线观看。它使用C语言编写,在GPL许可下发行。
 ICDL Crawler是一个用C++编写,跨平台的网络爬虫。它仅仅使用空闲的CPU资源,在ICDL标准上抓取整个站点。
 JSpider是一个在GPL许可下发行的,高度可配置的,可定制的网络爬虫引擎。
 LLarbin由Sebastien Ailleret开发;
 Webtools4larbin由Andreas Beder开发;
 Methabot是一个使用C语言编写的高速优化的,使用命令行方式运行的,在2-clause BSD许可下发布的网页检索器。它的主要的特性是高可配置性,模块化;它检索的目标能够是本地文件系统,HTTP或者FTP。
 Nutch是一个使用java编写,在Apache许可下发行的爬虫。它能够用来链接Lucene的全文检索套件;
 Pavuk是一个在GPL许可下发行的,使用命令行的WEB站点镜像工具,能够选择使用X11的图形界面。与wget和httprack相比,他有一系列先进的特性,如以正则表达式为基础的文件过滤规则和文件建立规则。
 WebVac是斯坦福WebBase项目使用的一个爬虫。
 WebSPHINX(Miller and Bharat, 1998)是一个由java类库构成的,基于文本的搜索引擎。它使用多线程进行网页检索,html解析,拥有一个图形用户界面用来设置开始的种子URL和抽取下载的数据;
 WIRE-网络信息检索环境(Baeza-Yates 和 Castillo, 2002)是一个使用C++编写,在GPL许可下发行的爬虫,内置了几种页面下载安排的策略,还有一个生成报告和统计资料的模块,因此,它主要用于网络特征的描述;
 LWP:RobotUA(Langheinrich,2004)是一个在Perl5许可下发行的,能够优异的完成并行任务的 Perl类库构成的机器人。
 Web Crawler是一个为.net准备的开放源代码的网络检索器(C#编写)。
 Sherlock Holmes收集和检索本地和网络上的文本类数据(文本文件,网页),该项目由捷克门户网站中枢(Czech web portal Centrum)赞助而且主用商用于这里;它同时也使用在。
 YaCy是一个基于P2P网络的免费的分布式搜索引擎(在GPL许可下发行);
 Ruya是一个在广度优先方面表现优秀,基于等级抓取的开放源代码的网络爬虫。在英语和日语页面的抓取表现良好,它在GPL许可下发行,而且彻底使用Python编写。按照robots.txt有一个延时的单网域延时爬虫。
 Universal Information Crawler快速发展的网络爬虫,用于检索存储和分析数据;
 Agent Kernel,当一个爬虫抓取时,用来进行安排,并发和存储的java框架。
 是一个使用C#编写,须要SQL Server 2005支持的,在GPL许可下发行的多功能的开源的机器人。它能够用来下载,检索,存储包括电子邮件地址,文件,超连接,图片和网页在内的各类数据。
 Dine是一个多线程的java的http客户端。它能够在LGPL许可下进行二次开发。
网络爬虫的组成
在网络爬虫的系统框架中,主过程由控制器,解析器,资源库三部分组成。控制器的主要工做是负责给多线程中的各个爬虫线程分配工做任务。解析器的主要工做是下载网页,进行页面的处理,主要是将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工做是由解析器完成。资源库是用来存放下载到的网页资源,通常都采用大型的数据库存储,如Oracle数据库,并对其创建索引。
控制器
控制器是网络爬虫的中央控制器,它主要是负责根据系统传过来的URL连接,分配一线程,而后启动线程调用爬虫爬取网页的过程。
解析器
解析器是负责网络爬虫的主要部分,其负责的工做主要有:下载网页的功能,对网页的文本进行处理,如过滤功能,抽取特殊HTML标签的功能,分析数据功能。
资源库
主要是用来存储网页中下载下来的数据记录的容器,并提供生成索引的目标源。中大型的数据库产品有:Oracle、Sql Server等。
相关文章
相关标签/搜索