陈泽
摘 要:网络爬虫是计算机搜索领域内一块非常核心的内容,带偏好的网络爬虫则是目前搜索领域中的一大热点,也是目前较难解决的问题之一。现有的大多数爬虫算法都是根据关键词对网页链接进行搜索遍历,直接将结果展示出来,这种方法随着互联网上数据的增多,会使得搜索结果越来越偏离用户的真实需求。
关键词:网络爬虫;深度宽度优先算法;网页去噪
网络爬虫是计算机搜索领域的核心内容,是各大搜索引擎巨头都在努力研究的重点内容,在互联网中有着非常广泛的应用。当然,网络爬虫也是计算機领域的一块非常有难度的研究内容,因为面对复杂的使用群体、网络连接故障、数据存取错误以及爬虫自身追求效率带来的错误率,爬虫的结果都会出现不同程度的偏差,尤其对于带偏好的爬虫,设计上更加要注重解决以上的问题,而且还要兼顾搜索效率,这些都给爬虫设计带来了很大的困难。基于排序学习的爬虫设计难点就在于如何克服不同使用群体带来的搜索结果的偏差以及提高搜索的效率和搜索结果的准确度方面的问题。
大多数传统的爬虫算法,以宽度优先搜索遍历算法作为遍历url链接的基本方法,或者是以深度优先搜索算法,遍历抓取到的网页中的url链接。但是在遍历的过程中,这两种算法都缺少了对抓取到的网页中的url链接的权重值的计算,如果对某些不太重要的url进行大量时间的遍历,则会降低爬虫的爬行效率,也会导致结果与搜索预期出现很大偏差。
另一种是能够在抓取的过程中通过使用者的兴趣爱好以及抓取到的网页中的url出现频率来计算各个url的权重值,按照权重值的高低将url链接加入到爬虫的优先队列中,再对该队列进行出队和入队,这样重要的url链接往往会得到优先处理,提高爬行的准确性。
而一种基于使用人群和排序学习的网络爬虫的设计,获取更加符合使用人群的爬行结果。相比于现有的传统网络爬虫有以下的特点:1)通过关联度来确定网页链接的优先级,避免对不太相关的网络链接的抓取,减少服务器压力;2)基于排序学习,能很好的适应使用群体,更好的满足带有偏好的爬行需求;3)爬行效率有所增加,由于使用了Rank算法来过滤掉一下相关性不高的网页URL,使得爬虫爬行时能减少爬行的路径,降低爬虫程序的计算量,从而提高爬行的效率。
一、主要采用的设计方式
(1)将传统的爬虫算法进行改进,与基础的深度、宽度优先搜索策略相合,利用Rank算法减少爬虫程序的爬行量。
传统的网络爬虫普遍使用宽度、深度优先搜索算法对指定的网页URL中的其他网页的链接进行处理,往往由于数据量太大造成搜索结果出现较长时间的等待,虽然数据量较为全面,但是包含许多不必要的网页,往往使得程序在一段较长的时间内白白消耗服务器资源,因此,使用Rank算法对网页URL进行重要度评价是非常有必要的,是否启用此Rank算法,往往还需要结合爬行结构的复杂度,抓取到的各个网页中URL链接的数量。本课题将对不同情况下使用Rank算法的效率进行测试,综合实验结果来考虑使用算法的情景,从算法原理,算法速度上来综合对比以及进行改进融合,设计出实用性更好的网络爬虫。
(2)设计出一种面向不同使用群体的爬行方法,对不同偏好下的搜索展示出不一样的结果,满足使用群体的搜索预期,提高爬虫的适用度。
在获取到使用群体的偏好后,结合网页重要度来重新排列抓取到的网页中URL的优先级,计算出URL在该应用场景下的权重值,通过权重值来判断下一个要抓取的节点,结合传统的深度、宽度优先搜索策略对链接内容进行抓取,减少传统爬虫的爬行量,因为同一标签下的内容大致可视为同一类内容,所以通过标签对内容进行判定也可以减轻评价网页重要度的难度。
(3)设计一种简单有效的网页评价算法。利用大多数网页之间相互关联,计算出网页引用和被引用的频率,更新链接的重要度以及优先级。
由于网页中,往往同一标签下的内容属于同一类的信息,所以,通过标签可预测该标签下内容的大致信息,对网页内容分析时可以不用花费太多时间逐一分析网页文本,减少分析的复杂性,提高效率,而网页被引用的频率可以通过在其他网页中该链接的出现频次进行分析,结合二者,便可以快速判断出该网页在不同分类下的权重值,结合搜索条件便能计算出网页的重要度,从而决定网页链接在进行爬行时的优先级别。
(4)设计一种有效的过滤算法。由于互联网中巨大的数据量,各个网页之间往往会出现相互引用,重复引用的情况,若对重复出现的URL链接进行爬行,往往浪费许多服务器资源和时间。
使用过滤器,避免对同一网页进行重复抓取,在爬虫程序每次对网页进行抓取的过程中,可设计出一种数据结构,来存储爬虫爬行时的记录,将已经爬行过的URL放入到已经访问的URL队列中,在进行下一次爬行时,先比较爬行的链接是否存在于已访问的URL队列中,若存在着跳过对此链接的抓取,若不存在才对链接进行处理,这样能大大减少爬行的路径,同时也能避免爬虫陷入某条循环路径中,从而快速的给出爬行的结果。
二、网络爬虫中的爬行队列设计
要实现设计基于排序学习的网络爬虫,首先要设计出一个能记录URL的队列,由于爬虫是按照顺序逐条对抓取到的URL链接进行分析处理,所以设计出的URL队列要满足对URL链接始终能优先按照网页重要程度排序,且队列中的URL必须与搜索的内容有所关联,这样才能防止爬虫在无效的URL或不相关的URL链接上浪费资源。一次,优先队列的设计对本网络爬虫程序来说是十分重要的,是网络爬虫中较为核心的内容,好的优先队列必须具备存取速度快,出队入队效率高的特点,这样才能应用到实际的网络抓取中。
很多情况下,网页中都包含许多与主要内容无关的文本、图片、广告链接、推广链接、flash动画等,比如一个新闻网页,除了主要的新闻正文标题内容以外,都可以视为内容无关文本,也就是俗称的“噪声”。
在建立优先队列之前,应该先对这些噪声进行处理,不处理的话会引起主题搜索时主题飘移的情况。而且不去掉网页中的多余内容,爬虫系统对这些噪声也建立索引,从而导致某张网页的噪声内容中出现了搜索关键词,噪声内容代表的网页也会被返回,而实际进行的搜索可能与这个查询词毫无关系,这样,噪声内容不仅增加了爬行的时间,还引起了索引结构规模的巨大化,也影响了最后搜索结果的准确性,由于网页种类繁多,虽然用人工去除噪聲的方法效果最好,但是付出的代价往往太大,所以一般用通用的去出网页噪声的方法——统计法。
三、过滤器的设计
在平时的学习生活中,往往存在对重复事物的判断,这些都可以抽象为数学中判断元素是否在某一个集合中,在计算机软件设计时也是如此,比如对单词拼写的检查,就是判断单词是否出现在字典中,换作爬虫,就是判断该链接是否已经被访问过。当然,最直接的方法就是将集合的全部元素存储到计算机内部,每次都将计算机内部的元素与新出现的元素进行比较,这就是最简单的过滤功能了,在爬虫中,过滤器的功能就是防止对已经访问过的网页出现重复访问的情况发生。设计一个好的过滤器能大大提高爬虫搜索效率。
采用了布隆过滤器对爬虫网址进行过滤,其设计基本步骤如下:
(1)将要过滤的地址哈希到一个很大的地址空间,主要是根据地址中各种不同的字母进行计算,使得各个不同的链接能够根据规则哈希到某个独一无二的空间中,并且把内容设置为true。
(2)当爬虫抓取到一个网址时,对这个网址使用设计好的哈希规则映射到每一位上,看看是否每一位都为true,如果是这说明这个网址在过滤器中已经存在,否则不存在。
四、网页抓取的设计
在网络爬虫中,抓取最多的内容就是Html页面,但是信息都是隐藏在Html页面之中的,搜索引擎感兴趣的并不是页面本身,所以关于页面的抓取和对内容的处理成了爬虫之中一个很重要的环节,通过对HTML页面的处理,我们才能得到真正需要的内容。
在对Html页面进行处理时,需要用到正则表达式。正则表达式能帮助我们将某种特定格式的内容抽取出来,而其他不符合的内容则直接丢弃。在本课题中,主要使用正则表达式提取特定格式的URL链接,对URL链接进行过滤和对网页内容进行提取。
网页展现给我们的只是它的文本,所以爬虫程序的主题就是抽取网页的文本内容,利用正则表达式和抽取工具(HtmlParser)来抽取这些内容。
HtmlParser工具能实现文本抽取,链接抽取,资源抽取,链接检查,站点检查等功能,在转换功能方面,也能提供URL重写,广告清除,将Html页面转化为XML页面以及对Html页面进行清理。HtmlParser中有描述HTML元素的各种Tag,利用抓取功能对各种Tag进行分类处理就能很好的提取出网页的主要内容。在本课题中,由于需要对正文进行抽取,考虑到目前各种网页的不规范设计,所以从统计的角度,往往将正文定义为在一个Table,Div,ParagraphTag里的内容,所以在本课题中,处理正文主要是对Table,Div,ParagraphTag进行处理。
根据正则表达式的相关用法,可以结合HtmlParser实现一个网页内容抽取程序,对网页内容处理之前会判断网址受欢迎程度,本次采用Berkeley DB存储网址的信息,如网址权重,标题,类型,爬取层数,作者,引用的链接,域名的ip地址等,数据库中的数据为key,value格式,其中key值为网址的md5码。数据库中分为行键和列族,主要通过行键对数据进行定位,查询,列族是指相似的数据的集合,主要是方便同一类数据的存储,在本课题中,列族为网址的主域名地址,方便数据的查找。将查找后的数据进行权重值的比较,按权重优先顺序将网址加入优先队列,爬行程序按照优先顺序进行网页的抓取,这样能快速的得到想要搜索的网页,使得爬行更加高。
通过对网络爬虫的基本算法进行了改进,优化了爬虫的去重,过滤步骤,使用统计法对网页噪声进行清除,防止噪声干燥搜索的正确性,通过布隆过滤器对重复出现的URL进行过滤操作,这些都大大降低了爬虫的计算量。还对一些重复文档的存储进行了校验,通过使用checksum来判断文档是否唯一,防止重复文档浪费大量存储空间。对网页内容的抓取也进行了优化,使用HtmlParser工具,将网页提取为串行节点,在对各个标签的处理中有充分考虑到实际情况,对网页内容按照不同的标签进行划分。对不同链接进行了引用与被引用的统计,使用这些数据能在后续过程中对网页的权重值进行计算,方便判断网页链接以及网页内容中链接的重要程度,通过各种占比剔除掉一些与主题关联度低的链接内容。