在万维网飞速发展的网络背景下,搜索引擎在人们的生活工作中无疑扮演着重要的角色,而网络爬虫则是搜索引擎技术的最基础部分。
一、网络爬虫概述
在搜索引擎成为主流检索工具的今天,互联网上的网络爬虫各式各样,但爬虫爬取网页的基本步骤大致相同:
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
http://zh.wikipedia.org/zh-cn/Robots.txt