Heritrix项目介绍
Heritrix工程始于2003年初,IA的目的是开发一个特殊的爬虫,对网上的资源进行归档,建立网络数字图书馆。在过去的6年里,IA已经建立了400TB的数据。 IA期望他们的crawler包含以下几种:
宽带爬虫:能够以更高的带宽去站点爬。
主题爬虫:集中于被选择的问题。
持续爬虫:不仅仅爬更当前的网页还负责爬日后更新的网页。
实验爬虫:对爬虫技术进行实验,以决定该爬什么,以及对不同协议的爬虫 爬行结果进行分析的。
Heritrix工作原理
Heritrix是一个爬虫框架,可加如入一些可互换的组件。它的执行是递归进行的,主要有以下几步:
在预定的URI中选择一个。
获取URI
分析,归档结果
选择已经发现的感兴趣的URI。加入预定队列。
标记已经处理过的URI
Heritrix主要有三大部件:范围部件,边界部件,处理器链
范围部件:主要按照规则决定将哪个URI入队。
边界部件:跟踪哪个预定的URI将被收集,和已经被收集的URI,选择下一个 URI,剔除已经处理过的URI。
处理器链:包含若干处理器获取URI,分析结果,将它们传回给边界部件
Heritrix的其余部件有:
WEB管理控制台:大多数都是单机的WEB应用,内嵌JAVA HTTP 服务器。 操作者可以通过选择Crawler命令来操作控制台。
Crawler命令处理部件:包含足够的信息创建要爬的URI。
Servercache(处理器缓存):存放服务器的持久信息,能够被爬行部件随时查到,包括IP地址,历史记录,机器人策略。
处理器链:
预取链:主要是做一些准备工作,例如,对处理进行延迟和重新处理,否决随后的操作。
提取链:主要是获得资源,进行DNS转换,填写请求和响应表单
抽取链:当提取完成时,抽取感兴趣的HTML,JavaScript,通常那里有新的也适合的URI,此时URI仅仅被发现,不会被评估
写链:存储爬行结果,返回内容和抽取特性,过滤完存储。
提交链:做最后的维护,例如,测试那些不在范围内的,提交给边 界部件
Heritrix 1.0.0包含以下关键特性:
用单个爬虫在多个独立的站点一直不断的进行递归的爬。
从一个提供的种子进行爬,收集站点内的精确URI,和精确主机。
主要是用广度优先算法进行处理。
主要部件都是高效的可扩展的
良好的配置,包括:
可设置输出日志,归档文件和临时文件的位置
可设置下载的最大字节,最大数量的下载文档,和最大的下载时间。
可设置工作线程数量。
可设置所利用的带宽的上界。
可在设置之后一定时间重新选择。
包含一些可设置的过滤机制,表达方式,URI路径深度选 择等等。
Heritrix的局限
单实例的爬虫,之间不能进行合作。
在有限的机器资源的情况下,却要复杂的操作。
只有官方支持,仅仅在Linux上进行了测试。
每个爬虫是单独进行工作的,没有对更新进行修订。
在硬件和系统失败时,恢复能力很差。
很少的时间用来优化性能。
爬虫信息
爬虫名称: Heritrix
爬行强度: 低
HTTP User Agent:
Mozilla/5.0 (compatible; heritrix/1.10.2 +http://i.stanford.edu/)
来访IP:171.64.75.233
对Heritrix爬虫进行控制
Heritrix被设计成严格遵循robots.txt文件的排除指示和META robots标签。
邀请Heritrix来访
如果你在在robots.txt中限制了部分爬虫,那么你可能需要在robots.txt中增加下述内容:
User-agent: Heritrix Disallow:
禁止Heritrix访问
如果你不希望Heritrix爬虫占用服务器资源,可以这样封锁它:
User-agent: Heritrix
Disallow: /
如果你仅仅不希望Heritrix爬行某些目录,则可以这样:
User-agent: Heritrix
Disallow: /somedir/
Heritrix 的架构示意图:
下面有一个heritrixProject.rar可以下来使用一些。。
运行org.archive.crawler.Heritrix 然后访问http://localhost:8080就可以了登入用户/密码为admin/admin
Heritrix和Nutch的差异:
Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌
Nutch 可以修剪内容,或者对内容格式进行转换。
Nutch 保存内容为数据库优化格式便于以后索引;刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。
Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。
Nutch 的定制能力不够强,不过现在已经有了一定改进。Heritrix 可控制的参数更多。
Nutch 的架构示意图:
网络爬虫浅析
在万维网飞速发展的网络背景下,搜索引擎在人们的生活工作中无疑扮演着重要的角色,而网络爬虫则是搜索引擎技术的最基础部分。
一、 网络爬虫概述
在搜索引擎成为主流检索工具的今天,互联网上的网络爬虫各式各样,但爬虫爬取网页的基本步骤大致相同:
1) 人工给定一个URL 作为入口,从这里开始爬取。
万维网的可视图呈蝴蝶型,网络爬虫一般从蝴蝶型左边结构出发。这里有一些门户网站的主页,而门户网站中包含大量有价值的链接。
2) 用运行队列和完成队列来保存不同状态的链接。
对于大型数据量而言,内存中的队列是不够的,通常采用数据库模拟队列。用这种方法既可以进行海量的数据抓取,还可以拥有断点续抓功能。
3) 线程从运行队列读取队首URL ,如果存在,则继续执行,反之则停止爬取。
4) 每处理完一个URL ,将其放入完成队列,防止重复访问。
5) 每次抓取网页之后分析其中的URL (URL 是字符串形式,功能类似指针),将经过过滤的合法链接写入运行队列,等待提取。
6) 重复步骤 3 )、4 )、5 )。
1.1 网页搜索策略
万维网高阔无边,为了最大限度利用有限的资源,我们需要进行资源配置,并运用某些策略使爬虫优先爬取重要性较高的网页。
目前主流的网页搜索策略主要有三,即:深度优先、广度优先、最佳优先。
深度优先,即从起始网页开始,选择一个URL ,进入,分析这个网页中的URL ,选择一个再进入。如此一个链接一个链接地深入追踪下去,处理完一条路线之后再处理下一条路线。
有一个例子是:在封建制度中,封建帝王的继承制度是长子优先级最高,长孙次之,次子随后。即如果长子去世,那么长孙的优先级比次子高。
该类爬虫设计时较为简单。然而深度优先型网络爬虫存在一个问题:门户网站提供的链接往往最具价值,PageRank 也很高,而每深入一层,网页价值和PageRank 都会相应地有所下降。这暗示了重要网页通常距离种子较近,而过度深入抓取到的网页却价值很低。
由于这个缺陷,广度优先策略产生了。
广度优先(又称宽度优先),即从起始网页开始,抓取其中所有链接的网页,然后从中选择一个,继续抓取该网页中的所有链接页面。
网络爬虫在抓取网页时普遍采用这种策略,这其中有两个原因:
第一,万维网的实际深度最大能达到17 层,网页之间四通八达,因此存在从一个网页到另一个网页的最短路径问题。如果采用深度优先,则有可能从一个PageRank 很低的网页爬取到一个PageRank 实际很高的网页,不方便计算PageRank (个人理解)。
第二,采用宽度优先策略有利于多个爬虫并行爬取。这种多爬虫合作抓取通常是先抓取站内链接,遇到站外连接就爬出去,抓取的封闭性很强。
广度优先策略的优点在于其设计和实现相对简单,且这种策略的基本思想是:与种子在一定距离内的网页重要度较高,符合实际。
在聚焦爬虫的应用中,广度优先策略可以与网页过滤技术结合,即先用广度优先抓取一些网页,再将其中与主题无关的过滤掉。但这种方法的缺点是随着抓取网页的增多,算法的效率会变低。
另外,还有一种常用于聚焦爬虫的网页搜索策略——最佳优先策略。
最佳优先,即按照某种网页分析算法预测候选URL 与目标网页的相似度,或主题的相关性,并选取其中评价最好的一个或几个URL 进行进一步的爬取。
这种策略的缺陷是可能会有很多相关网页被忽略,但相对的,这种策略可以将无关网页数量降低30% —90% 。
1.2 对URL 的获取和处理
网络爬虫访问的是后台html 代码,它分析出URL 之后,对其进行过滤并将结果放入运行队列。
在取得URL 时要提防一种“爬虫陷阱”。因为即使一个URL 能访问到相应内容,也不能保证服务器端有一个相应页面存在,例如动态网页的应用可能会使网站中存在一些无法穷尽的地址,让爬虫在一个位置上无限循环而无法终结。
针对“爬虫陷阱”,其中一种应对方法是:检查URL 长度(或“/ ”的数量),一旦超出某个阈值就不再获取。
链接过滤处理涉及两个数组,第一个是“必须存在的关键字”组。分析链接时,链接中必须存在这个数组中所有关键字(例如关键字为http 和index ,则 http://www.mysite.com/index 符合要求, 而http://www.mysite.com/html 不符合要求)。另一个是“不可存在的关键字”组。分析链接时,链接中必须不存在这个数组中任何一个关键字(例如关键字为index ,则 http://www.mysite.com/index 不符合要求)。
对关键字的过滤方法包括以下两种:
1) 只取得包含给定关键字的链接,这样取得的链接为内部链接。
2) 只取得不包含给定关键字的链接,这样取得的链接为外部链接。
1.3 页面选取问题
为提高资源利用率,我们需要尽可能提取最为重要的网页。
网页的重要程度判断有许多依据,如:链接的欢迎程度(通过反向链接判断)、链接的重要度(通过某种URL 函数判断,如认为包含.com 和home 的URL 重要度高于包含.cc 和map 的网页)、链接平均深度(通过距离种子的深度判断)、历史权重、网页质量等。
当需要判断网页与某些给定关键字的相关性时,我们需要利用网页分析算法。
网页分析算主要有以下三种:基于网页拓补、基于网页内容、基于用户访问。
基于网页拓补,即通过已知的网页或数据,对其有间接关系的网页或网站做出评价的算法,这种算法广泛应用于实时搜索,其中又包括:网页粒度分析算法、网站粒度分析算法、网页块粒度分析算法三种。
1 、网页粒度分析算法
常见的有链接分析算法PageRank 和hits ,两者都得到网页的重要度评价。
其中PageRank 考虑了用户访问行为的随机性和sink 网页,但忽略了大多数用户访问时具有目的性的事实。针对这个问题,hits 提出了权威性网页和中心型网页两个概念。
2 、网站粒度分析算法
比网页粒度分析算法更加简单有效,其关键在于站点的划分和评级,SiteRank 的计算方法与PageRank 类似。利用分布式SiteRank 计算,不仅降低了单机站点的算法代价,而且克服了单独站点对整个网络覆盖率有限的缺点。另外,SiteRank 不会被常见的针对PageRank 的造假所蒙骗。
3 、网页块粒度分析算法
基本思想是通过某种网页分割算法,将网页分为不同网页块,排除其中与主题无关的链接后在进行进一步处理。这种分析算法可以避免广告等噪声链接的干扰。
基于网页内容,即利用网页内容(文本、锚文本、其他数据等)特征进行的网页评价。其针对网页数据形式不同可分为三类:
1 、针对以文本和超链接为主的无结构或结构很简单的网页。
随着如今网页内容的多样化,该方法已不再单独使用。
2 、针对从结构化的数据源(RDBMS )动态生成的页面,其数据不能直接批量访问。
3 、介于1 和2 之间的,具有较好结构,遵循一定模式或风格,可直接访问的网页。
在提取html 文档的文本信息时要过滤标识符,但同时还要注意依照标识符来取得版式信息(如标题、粗体、关键字等),另外还要过滤无用链接(如广告链接)。
锚文本可以作为所在页面内容的评估和所指向的页面内容的评估,还可以收集一些搜索引擎不能索引的文件(例如图片)。
多媒体,图片等文件一般通过锚文本和相关文件注释来判断文件内容。
对于doc 、pdf 等有专业厂商提供的软件生成的文档,厂商会会为爬虫提供相应的文本提取接口的插件。
Google 对网页优先性的考虑因素有以下几点:
1 )查询驱动的爬取
此方法适于实时搜索。对于一些最新出现的热门话题,或随时变动的数据(如股市信息),数据库里没有这些网页的信息,如果此时接受了用户的查询,则会通过已爬取的其他网页来判断未爬取的网页的相关性。
2 )反向链接数
3 )PageRank 值
4 )前向链接数
5 )路径深度
路径深度浅的页面被认为更重要。
1.4 网页去重方法
网页之间的链接关系错综复杂,为了避免重复抓取同一页面,要把需要入库的链接与数据库中的运行队列和完成队列都进行比较。
另外,大型搜索引擎多采取多爬虫并行合作抓取的方法,这也产生了一些问题。
例如Google 为了避免多爬虫合作时重复抓取同一页面,而采用了Crawl Caching Proxy (缓存代理)。
网络爬虫在工作时,首先通过DNS 解析一个URL 的主机IP 地址,然后连接相应服务器的端口并发送请求,通过服务器响应来获取相关页面内容。
URL 与IP 之间的对应关系可能是一对一、一对多或多对一的。
一个URL 对应多个IP 通常出现在访问量较大的域名,将一个URL 与多个IP 绑定以分流访问量,减小单个服务器的访问压力(如Baidu 、Google );一个IP 对应多个URL 则是出于节约服务器的目的,或是由于公网IP 地址匮乏而产生的策略,当客户端对该IP 进行访问时,先通过请求的协议头部来获取需要访问的URL ,再将该请求通过反向代理或虚拟主机的方式转发到相应服务。
由于这种情况,若用IP 作为判断重复网页的标准,则可能因为URL 与IP 的一对多而出现重复获取,或因为URL 与IP 的多对一而出现遗漏。因此,爬虫在判断重复页面时主要以URL 所谓判断标准,以保证服务的唯一性。
1.5 网络爬虫的效率
单线程的爬虫由于页面的分析和下载不能同时而效率较低,因此出现了多线程爬虫。有一个例子可以帮助理解多线程的意义:现在很多下载软件都支持多线程同步下载,即将下载内容分成几部分同步下载,速度比单线程要快上很多。
爬虫采用线程进行循环,但这存在一定弊端:一旦发生网络阻塞,整个线程就一直处于等待状态而导致死亡。
一般采取线程监控的方法来解决,即存在一个主线程和一个监控线程,监控线程每隔一段时间去访问一次主线程并与其分享的变量,一旦发现超时,就认为网络阻塞,这时终止主线程并重新启动,由此避免了网络阻塞导致线程一直等待的问题。
1.6 网页更新
对于搜索引擎而言,评价网络爬虫效率的一个重要标准是爬虫的开销。
爬虫开销 = 重复抓取的老页面数 / 发掘的新页面数
即是说,爬虫应当尽量发掘新页面而减少重复页面的爬取,而决定对某个网页的更新频率涉及到时间更新控制。
一般做法是将这次抓取到的页面上的数据与上一次相比较,如果进行连续五次这样的比较都没有变化,则将以后爬取该网页的时间扩大为原来的2 倍;如果进行连续五次这样的比较都有变化,则将以后爬取该网页的时间缩短为原来的1/2 。
另外,爬虫在更新网页内容时,不需要将网页重新抓取一遍,只需对网页的一些属性加以判断(如日期),并与上次结果相比即可,如果相同则无需更新。
1.7 实时搜索
设想当用户查询一个热门话题,而爬虫还未抓取相关网页,这时就不能在用PageRank 来评价网页重要性了。PageRank 的计算对象是已经抓取下来的网页,即,在计算PageRank 过程中不会有新页面加入,这种方法被称为“离线”(off-line )的计算方法。这种方法适合于对结果的排序,但不适用于爬虫的调度(即动态决定URL 的抓取顺序),因而诞生了一种 OPIC (On-line Page Importance Computation) 的新型算法策略。
OPIC 的基本思想是:每个页面有一个初始 cash ,在抓取过程中,通过前向链接将 cash 平均分给该网页指向的所有页面(分配过程一次完成),而爬虫在爬取过程中只需优先抓取 cash 较多的页面。
1.8 其他
1 、对于一些出售资料的网站,他们希望搜索引擎能所引导他们的资料,但又不能无偿将资料的全部内容提供给搜索用户。因此,他们为网络爬虫提供了专门的用户名和密码,设置一定的权限,是爬虫能够对网页进行爬取而又不会让用户看到全部内容(用户点开网页时,需要提供权限验证)。
2 、每个网络爬虫都有自己的名字。在抓取网页时会向服务器端发送请求,该请求中包含一个用于表示爬虫身份的字段,这个请求会留在访问日志记录中,便于网站管理员查看。
3 、爬虫进入网站时会先访问网站服务器根目录下的 robots.txt ,这个协议告诉爬虫网站中那些内容希望被抓取,那些内容不希望被抓取。该协议不具备强制力。
二、网络爬虫实例
2.1 Heritrix
Heritrix 是一个爬虫框架,可以加入一些可互换的组件。 Heritrix 是用来获取完整精确的网站内容的爬虫,除文本内容之外,它还获取其他非文本内容(如图片等)并对其进行处理,且不对网页内容进行修改。当重复爬行相同 URL 时,不会对先前网页进行替换。
Heritrix 主要有以下几步:
1 )在预定的 URL 中选择一个并获取。
2 )分析,并将结果归档。
3 )选择已经发现的感兴趣的 URL ,加入运行队列。
4 )标记已经处理过的 URL
Heritrix 利用广度优先策略来进行网页获取,其主要部件都具有高效性和可扩展性。然而 Heritrix 也有其一定的局限性,如:
只支持单线程爬虫,多爬虫之间不能合作;
操作复杂,对有限的资源来说是一个问题;
在硬件是系统失败时,其恢复能力较差等等。
2.2 Nutch
Nutch 深度遍历网站资源,将这些资源抓取到本地,使用的方法都是分析网站每一个有效的 URL 并向服务器端提交请求来获得相应结果,生成本地文件及相应的日志信息等。
Nutch 与 Heritrix 有几点差异,即:
1 ) Nutch 只获取并保存可索引的内容。
2 ) Nutch 可以修剪内容,或者对内容格式进行转换。
3 ) Nutch 保存内容为数据库优化格式,便于以后索引;且对重复 URL ,刷新替换旧的内容。
4 ) Nutch 从命令行运行、控制。
5 ) Nutch 的定制能力不够强(不过现在已经有了一定改进)。
2.3 Larbin
Larbin 不同于以上两种网络爬虫,它只抓取网页,而不提供包括分析网页、将结果存储到数据库以及建立索引等服务。
Larbin 的目的是对页面上的 URL 进行扩展性的抓取,为搜索引擎提供广泛的数据来源。虽然工作能力较为单一,但 Larbin 胜在其高度可配置性和良好的工作效率(一个简单的 larbin 的爬虫可以每天获取500万的网页),这也是 Larbin 最初的设计理念。
2.4 Lucene
Lucene 是一个基于 Java 的全文信息检索工具包,它本身不是一个完整的全文索引应用程序,而是为各种应用程序提供索引和搜索功能。只要能把要索引的数据转化的文本格式, Lucene 就能对该文档进行索引和搜索。
Lucene 采用的是一种称为反向索引( inverted index )的方法。因此,在用户输入查询条件的时候, Lucebne 能非常快地得到搜索结果。
对文档建立好索引后,搜索引擎首先会对关键词进行解析,然后在建立好的索引上面进行查找并返回和用户输入的关键词相关联的文档。
三、个人体会
在如今信息爆炸的社会中,网络成为人们生活中不可或缺的工具,而搜索引擎又在这其中扮演者至关重要的角色。搜索引擎是一个实用性很强的研究领域,无论是网络爬虫、数据库管理、中文分词还是索引的建立方法,都值得我们去深入了解。
搜索引擎技术已成为如今的热门学科之一,针对搜索引擎而产生的 SEO (搜索引擎优化)也逐渐成为主流。对于网站来说,被搜索引擎索引是必要的,但近年来,随着良莠不齐的各类爬虫频繁出没,一些网站也承受着由爬虫带来的困扰。另外,各种针对搜索引擎的作 弊也逐渐浮出水面,这些都是今后有待解决的问题。
四、参考文献
* 基本资料全部来源于网络
http://www.dunsh.org/2006/08/20/anchor-text/
http://faceye.com/wiki/topic/4028808426231dbb0126232cd9470052
http://kb.cnblogs.com/a/1616586/
http://hi.baidu.com/dudiaodaoke/blog/item/9529de0bea32fe2f6b60fbf1.html
http://www.kuqin.com/searchengine/
http://zh.wikipedia.org/zh-cn/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E