网络爬虫的研究与设计
2018-12-17郑定超麻少秋
郑定超 麻少秋
摘要:针对当前网络上信息呈爆炸式增长的态势,我们如何更好更快地获取有效信息就成了一个问题。我们获得信息最主要的途径就是通过搜索引擎,网络爬虫在整个搜索引擎中起着最为重要的作用。研究网络爬虫的功能和结构、设计并实现一个基于广度优先爬行策略的带URL消重功能的网络爬虫、对该网络爬虫进行测试验证爬行效果和对设计的三种消重算法的性能进行比较研究,提高爬虫的爬行效率;最后,采用广度优先的爬行策略,验证了该爬虫的爬行效果。
关键词:网络爬虫;广度优先;搜索引擎
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2018)25-0043-03
Research and Design of Web Crawler based on Breadth Strategy
ZHENG Ding-chao,MA Shao-qiu
(Zhejiang Oriental Vocational and Technical College, Wenzhou 325000,China)
Abstract:In view of the explosive growth of information on the Internet, how to get effective information faster and faster has become a problem. The most important way for us to get information is through search engines, and web crawlers play the most important role in the whole search engine. This paper studies the function and structure of the web crawler, designs and implements a network crawler with URL weight elimination function based on the breadth first crawling strategy, tests the crawl effect on the web crawler, and compares the performance of the three design algorithms to improve the crawling efficiency. Finally, the breadth priority is adopted. The crawling strategy verifies the crawling effect of the crawler.
Key words:web crawler; breadth priority; search engine
现在网络上信息是以爆炸式的速度在增长,怎么样更多、更快、更好地获得这些网络信息资源就成了一个问题。在如此海量的信息源中,我們获得信息最主要的途径就是通过搜索引擎,而基于网络爬虫(即网络蜘蛛)的搜索引擎(即第四代搜索引擎)已经是当今搜索引擎技术和Web信息挖掘中的研究热点和难点。
网络爬虫是搜索引擎系统所有模块当中最为核心的模块之一。作为搜索引擎系统最核心的模块,网络爬虫在整个搜索引擎中起着最为重要的作用,因为它是整个搜索引擎的数据来源,没有它,搜索引擎的所有后继工作都将停滞下来。而网络爬虫设计的好与坏就直接决定了整个引擎系统的内容丰富与否,还有信息能否得到及时的更新,而这也直接决定了搜索引擎的成败。而还有一些网络爬虫是定制的,这些爬虫得到的数据,可以用作实时检测与监控以及网络安全等许多实际应用的数据来源。因此,对网络爬虫的研究具有非常重要的现实意义。
1 网络爬虫设计
网络爬虫程序采用Java语言和Berkeley DB来实现。在Java包中有便捷和丰富的HTTP访问和保存的API接口,从而对网络爬虫的网页抓取这个关键技术的实现提供了保障。而从HTML文本里提取出URL链接的时候采用了正则表达式提取的方式,这样可以将文字的匹配速度以及运行的效率和运用Java包匹配的效率相比都有较大的提高。这样,网络爬虫的另一个关键技术——URL提取技术也可以顺利的实现。同时,在处理HTML文本的内容过滤,也就是提取文字信息的时候,也是采用了正则式匹配的技术。
1.1 框架设计
网络爬虫总体框架划分如图1所示。
在总体框架结构图中,开始和结束的控制都由Contoller来负责,而GetPage模块负责发起HTTP访问和进行链接并保存文件到本地的工作。之后有TextFilter模块处理文本文档的过滤和页面分析的工作,并将提取出来的URL全都交给URL_Filter模块进行消重的处理。在处理之后,不重复的URL链接交给URL_List模块进行入队的操作。爬行完一个URL链接之后,由Contoller判断是否停止,如果要继续的话,从URL_List中出队一个新的URL链接,重复之前的操作。
1.2 功能和结构分析
在研究了爬虫程序的背景知识和共有功能后,设计了一个爬虫程序。改爬虫程序采取Java2开发平台在MyEclipse 7.0开发环境中实现。
本文所设计的爬虫主要提供了以下几个主要的功能:
1) 从一个目标URL地址或者URL地址集开始爬行,能够通过访问相应URL获取源文件并保存在本地;
2) 将源文件保存为html文档格式,方便用户直观了解得到的页面;
3) 将源文件过滤处理以后保存文字内容;
4) 将源文件中所有的URL链接提取出来;
5) 在将解析出的URL作为后继爬行目标地址前可进行URL消重;
6) 可以将消重之后剩下的URL加入待爬行队列中去以供后继爬行;
7) 可连续爬行;
8) 可自行设定停止条件;
9) 提供爬行轨迹的记录。
该爬虫程序所涉及的数据包括目标URL地址或目标URL地址集、爬行目标URL地址得到的源文件和页面、从得到的源文件中解析出的URL、URL消重以后得到的URL地址集和爬行记录。
1.3 爬行策略的选择
网络爬虫的爬行方式主要是基于图论来工作的,以事先就已经选取好的一些种子链接作为爬行的起始点,使用某种爬行策略,宽度优先或者深度优先等,对网络上存在的网页进行遍历,其目标是尽最大可能地爬行到整个网络。
在本文所设计的网络爬虫中,采用的宽度策略,对当前URL地址层进行访问时,对于每一个URL,获取到页面以后,从该页面提取出了所有的URL地址,会用消重模块对每一个提取出的URL地址进行消重处理,之后会记录从该页面中提取出了多少有效的URL地址。当访问完了整个一层的URL以后,记录在该层中提取出的有效URL总数。这样,和在已经在URL队列里的URL数相加,就得到了包含下一层URL地址数量的队列总数量m。这样,用这个m来作为URL层级的标志就十分简单而方便了。在每一层URL爬行完毕时,将当前总数m记录在层级标志数组中。当前已经爬行过的URL数量和作为标志的数量相比较,就可以很容易地知道是否是爬行完了一层。策略的流程图如图2所示。
2 网络爬虫实现
该爬虫程序共由六个模块来实现全部功能。分别是爬虫总体控制模块、抓取源文件模块、过滤源文件模块、解析URL模块、URL消重模块、URL总队列管理模块。
2.1 抓取目标页面模块的实现
实现的功能有接受用户输入的目标URL地址或者目标URL地址集,控制爬虫程序连续爬行、爬行的策略和爬行深度,判断是否达到停止条件,并提供爬行记录。
提供爬行的功能有两块程序来实现。第一块将第一个爬行的URL地址和时间记录下来,第二块程序采用循环控制的方式自动记录所有爬行的过的URL地址。用FileWriter类的对象fw调用write()函数来实现写在本地的功能。并用Date类的对象dd来调用getHours()函数、getMinutes()函数和getSeconds()函数来得到爬行各个URL地址的时间。
2.2 抓取目标页面模块的实现
在GetPage类中实现的功能有,链接目标URL地址,得到该URL地址对应的页面和源文件并以html格式和txt文本文档的格式分别保存在本地。鏈接目标URL地址,首先需要将目标URL地址传给GetPage类的对象,在Controller类中创建GetPage类对象后,将目标URL和其在总队列的当前位置作为参数传入。其代码如下:
GetPagetogeturllink=new GetPage();//创建GetPage类的链接对象togeturllink.SetLink(list.get(0),0);//开始爬行初始URL
2.3 源文件过滤模块的实现
TextFilter类对得到的源文件做简单标签去除等处理后以文本文档形式保存在本地,方便用户查阅和做后继的工作,如进行主题爬行时,方便检查页面内容从而确定该页面是否是用户需求的页面,处理后也便于保存。对源文件进行过滤就是对HTML文档的处理过程。
2.4 URL模块的实现
在GetURLsFromTXT类中实现了将源文件中的URL解析出来,并使用URL_Filter类的对象进行URL消重的功能。在Controller类中创建GetURLsFromTXT类的对象,该对象调用GetaURL()函数,将要处理的源文件的标号i作为参数传入。返回一个链表,该链表的内容是处理这个源文件后得到的消重以后的所有的URL地址集。在得到一个匹配结果后,检查该结果是否是一个有效地URL,应为有的匹配结果中包含了一些字符,如<,会使该匹配结果成为一个无效的URL地址。
在URL_Filter类中实现了对单个URL消重的功能。在一个页面中,相同的URL非常的多,如果不消重,则爬虫的效率将会非常的底下。对于每一个URL地址,将其每个字符所对应的ASCII码相加,算出一个k值,将k值映射到hashTable[i][0]。hashTable[i][0]用于标记在爬虫的目标URL地址总队列中是否有相同k值的URL存在,N表示没有,Y表示有。在一次函数调用中,如果hashTable[i][0]值为N,则该URL地址是一个新的目标URL地址,应该要加入到总队列地址集中,于是将N置为Y,将该URL地址放入hashTable[i][1];如果是Y,则表示总队列中已经存在有相同K值的URL,于是将该URL与有相同k值的URL依次进行比较,如果是重复的,则放弃,如果没有重复,则将该URL加入到总队列地址集中,并在二维hashTable[i][]中添加进相应的位置。
3 网络爬虫测试
爬虫程序整体测试在真实网络环境中运行爬虫程序,URL消重模块采用IntString算法,得到的结果包括:爬行轨迹、爬下地网页源文件(txt文档)、页面形式的文档(html文档)、初步过滤的源文件(txt文档),并计算出爬行的平均速度。
用http://blog.sohu.com的源文件作为输入,以html结尾的URL作为解析的目标URL,三种URL消重算法的比较研究的测试结果见表1。
爬虫抓取源文件的平均效率在40KB/S以上。用http://blogz.sohu.com作为输入的起始URL目标地址的实验中,将源文件过滤掉了93.6%的内容,剩下了6.4%。用http://sports.163.com作为输入的起始URL目标地址的实验中,将源文件过滤掉了98.3%的内容,剩下了1.7%。在试验中,采用的是StringHash算法进行URL消重,URL消重的情况良好,没有出现任何重复页面。
4 结束语
研究网络爬虫的功能和结构、设计并实现一个基于广度优先爬行策略的带URL消重功能的网络爬虫、对该网络爬虫进行测试验证爬行效果和对设计的三种消重算法的性能进行比较研究,提高了爬虫的爬行效率;最后,利用真实站点,采用广度优先的爬行策略,从获取的页面源文件数量、解析出的URL地址状况、爬行轨迹、爬行速度、过滤源文件标签质量等方面,验证了该爬虫的爬行效果。
参考文献:
[1] 陈魁.基于Java语言提取网站内部URL的算法[J].电脑编程技巧与维护,2004(8).
[2] 经济观察网http://www.eeo.com.cn/today_media/sjg/2008/09/09/113029.html.
[3] 刘金红.主题网络爬虫研究综述[J].计算机应用研究,2007,24(10).
[4] 夏诏杰.化学主题网络爬虫的设计和实现[J].计算机工程与应用,2006(10).
[5] 徐远超.基于Web 的网络爬虫的设计与实现[J].微计算机信息,2007,23(7-3).
【通联编辑:唐一东】