1、山东财经大学学士学位论文基于JAVA的搜索引擎设计与实现摘 要网络中资源丰富,但是互联网上海量的信息,任何一个人都不能全部浏览,为了获取我们需要的信息,由此就产生了搜索引擎。而如今搜索引擎无法满足增长着的网页数量,搜索引擎技术已经成为计算机界积极研究和开发的对象,网络爬虫是搜索引擎的基础,是最底层的技术。所以研究网络爬虫的实现技术并研究其应用十分重要。论文详细说明了如何用java语言实现一个简易搜索引擎,同时描述了搜索引擎的原理,系统功能,简要介绍了系统开发的背景,开发环境,系统的需求分析,以及功能的设计与实现。关键词:搜索引擎;网络爬虫;搜索策略Design and Implementati
2、on of Search Engine Based on JAVAABSTRACTThe resources on the internet are abundant, but any one of us cant browse the great quantity information on the Internet, so the search engine appeared to obtain the information which we need. However, search engines can not meet the growth in the number of p
3、ages nowadays. Search engine technology has become the object of active research and development of computer industry. Web crawler is the foundation of all and this is the underlying technology. So it is very important to develop the Web crawler technology, also it is very important to study the app
4、lication of the Web crawler technology. This paper details how to implement a simple search engine with java language, describes the principle of the search engine, system functions, and briefly introduces the background of the system development, development environment, requirements analysis, and
5、functional designation and implementation. Keywords:Search engine; Web spider; Search strategy目 录一、引言1二、搜索引擎1(一)搜索引擎的工作原理1(二)搜索引擎的分类1(三)搜索引擎技术发展2三、网络爬虫知识储备2(一)深入学习URL3(二)指定URL获取网页3(三)爬虫策略41、宽度优先搜索42、深度优先搜索5(四)爬取链接5四、相关技术6(一)WEB访问过程6(二)JAVA技术7(三)网络编程8(四)HTML知识8五、需求分析8(一)同步环境8(二)功能需求9(三)性能需求9(四)输入输出要求
6、9(五)运行需求9六、概要设计9(一)可行性论述9(二)系统设计方案9(三)各功能划分10(四)主要存储结构10七、详细设计10(二)获取网页实现13(三)解析HTML实现13(四)ROBOTS文件18(五)信息输出19八、结束语20参考文献20致谢20一、引言自从WWW于1991年诞生以来,已经发展成为拥有超过亿位用户和约400万站点、几十亿页面的巨大信息空间,而且其信息容量仍在以指数形式飞速增长。WWW是以超文本的形式呈现给用户的,包含了从技术资料、商业信息到新闻报道、娱乐信息等多种类别和形式的信息。超文本标识语言以其简单精练的语法、极易掌握的通用性与易学性,使WEB网页可以亲近于每一个普
7、通人,互联网也才得以普及发展以至今日的辉煌。然而,电子商务、电子图书、远程教育等全新领域如异军突起,迅猛发展并逐渐成为互联网世界必不可少且愈发重要的组成部分,随之而来的是WEB文件的复杂化、多样化、智能化,于是高容量、高信息量、高效率便成为网络信息传输技术发展的追求。与此同时还有另一种需求变得愈发广泛而迫切,那便是如何得到用户感兴趣的信息。由于Internet是一个具有开放性、动态性和异构性的全球分布式网络,资源分布很分散,且没有统一的管理和结构,这就导致了信息获取的困难。如何快速、准确地从浩瀚的信息资源中寻找到所需信息己经成为困扰网络用户的一大难题,这也就是所谓的Rich Data Poor
8、 Information 问题。于是搜索引擎便随之产生,像mp3搜索、视频搜索、图片搜索正是搜索的初步雏形。根据用户的搜索意图,直接返回相关信息。对搜索引擎技术的研究,国外比中国要早近十年,从最早的Archie,到后来的Excite、ahvista、overture、google等搜索引擎问世。虽然在国外搜索引擎技术早就开始研究,但在国内还是陆续涌现出优秀的搜索引擎,像百度、中搜等。随着搜索引擎技术的成熟,它将成为获取信息、掌握知识的利器。但是现有的搜索引擎对于用户所提出的查询要求仅限于关键词的简单逻辑组合,搜索结果重视的是返回的数量而不是质量,在结果文档的组织和分类上也有所欠缺因此,如何提高
9、搜索引擎的智能化程度,如何按照知识应用的需要来组织信息,使互联网不仅提供信息服务,而且能为用户提供知识服务,将成为计算机工业界和学术界有待研究的方向。而网络爬虫是这一切的基础,是最底层的技术。所以解决这一问题就需要我们研究网络爬虫的实现技术并研究其应用。二、搜索引擎(一)搜索引擎的工作原理搜索引擎的原理,可以看作三步:从互联网上抓取网页,建立索引数据库,在索引数据库中搜索。搜索引擎利用能够从互联网上自动收集网页的爬虫程序,自动访问互联网,并沿着网页中的所有URL爬到其它网页,重复这过程,并把爬过的所有网页收集回来。然后建立索引数据库,由分析索引程序对收集回来的网页进行分析,提取相关网页信息(包
10、括网页所在URL、编码类型、页面内容包含的关键词、关键词位置、生成时间、大小、与其它网页的链接关系等),然后用这些相关信息建立网页索引数据库。接下来在索引数据库中搜索排序,当用户输入关键词搜索后,由搜索系统程序从网页索引数据库中找到符合该关键词的所有相关网页。最后,由页面生成系统将搜索结果的链接地址和页面内容摘要等内容组织起来返回给用户。(二)搜索引擎的分类获得网站网页资料,能够建立数据库并提供查询的系统,都可以把它叫做搜索引擎。真正意义上的搜索引擎,通常指的是收集了因特网上几千万到几十亿个网页并对网页中的每一个词(即关键词)进行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,
11、所有在页面内容中包含了该关键词的网页都将作为搜索结果被搜出来。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度排列。按照工作原理的不同,可以把它们分为两个基本类别:全文搜索和分类目录。全文搜索引擎通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户。从搜索来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序,即爬虫程序,并自建网页数据库,搜索结果直接从自身的数据库中调用;另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果。分类目录则是通过人工的方式收集整理网站资料形成数据库
12、的,比如雅虎中国以及国内的搜狐、新浪、网易分类目录。另外,在网上的一些导航站点,也可以归属为原始的分类目录。(三)搜索引擎技术发展长期以来,人们只是通过传统的媒体(如电视、报纸、杂志和广播等)获得信息。但随着计算机网络的发展,人们想要获取信息,已不再满足于传统媒体那种单方面传输和获取的方式,而希望有一种主观的选择性。现在,网络上提供各种类别的数据库系统,如文献期刊、产业信息、气象信息、论文检索等等。由于计算机网络的发展,信息的获取变得非常及时、迅速和便捷。到了1993年,WWW的技术有了突破性的进展,它解决了远程信息服务中的文字显示、数据连接以及图像传递的问题,使得WWW成为Internet上
13、最为流行的信息传播方式。现在,Web服务器成为Internet上最大的计算机群,Web文档之多、链接的网络之广,令人难以想象。可以说,Web为Internet的普及迈出了开创性的一步,是近年来Internet上取得的最激动人心的成就。面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以从搜索出发到达自己想去的网上任何一个地方。搜索引擎技术伴随着WWW的发展是引人注目的。搜索引擎大约经历了三代的更新发展:第一代搜索引擎出现于1994年前后。以Altavista、Yahoo、Infoseek为代表,注重反馈结果的数量,主要特征是“求全”。它主要依靠人工分拣
14、的分类目录搜索,通常由网页制作人自行建立网站名称、网站内容的文字摘要,并将其加入到搜索引擎的资料库中。搜索引擎根据用户键入的信息,根据预先设定的规则进行简单的匹配、排序和显示。这种方法只能进行简单的字符串匹配,无法进行全文搜索。研究表明,搜索引擎性能并没有想象中的那么优秀,在全球11个主要的搜索引擎中,搜索引擎仅能搜索到国际互联网上全部页面的16%,甚至更低,造成这种情况的原因,主要是这些搜索引擎没有及时更新资料。第二代搜索引擎,利用超链接分析为基础的机器抓取技术,由搜索引擎使用一个程序在网络上撷取资料,并自动将得到的结果存入索引库中。搜索引擎根据用户键入的信息进行匹配、排序和显示。这些引擎的
15、主要特点是提高了查准率,可以用“求精”来描述它的优点,即不需要网站制作人单独键入供搜索的信息,并且从理论上讲,可将任意网站的所有网页加入到它的资料库中。第二代搜索引擎的大多数查询都会返回成千上万条信息,查询结果中无关信息太多,而且查询结果显示比较混乱,使用者仍然难以找到真正想要的资料。第三代搜索引擎是对第二代搜索引擎的改进,相对于前两代,其更注重智能化和用户使用的个性化,主要增加了互动性和个性化等高级的技术,采用了中文自动分类、自动聚类等人工智能技术,而且使用了中文内容分析技术以及区域智能识别技术,增强了搜索引擎的查询能力。同时,搜索技术将更加智能化,可搜索资源将更加广泛,搜索方式也将更加便捷
16、有效,为用户使用搜索引擎获取信息获得更好的体验。三、网络爬虫知识储备(一)深入学习URLURI通常由三部分组成(1)访问资源的命名机制;(2)存放资源的主机名;(3)资源自身的名称,由路径表示。如URL是URI的一个子集。它是Uniform Resource Locator 的缩写,译为“统一资源定位符”。也可以说URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL 可以用一种统一的格式来描述各种信 息资源,包括文件、服务器的地址和目录等。URL 的格式由三部分组成:第一部分是协议(或称为服务方式);第二部分是存有该资源
17、的主机IP 地址(有时也包括端口号);第三部分是主机资源的具体地址,如目录和文件名等。第一部分和第二部分用“:/”符号隔开,第二部分和第三部分用“/”符号隔开,第一部分和第二部分是不可缺少的,第三部分有时可以省略。 HTTP协议的URL:使用超级文本传输协议HTTP,提供超级文本信息服务的资源。 其计算机域名为。超级文本文件(文件类型为.html)是在目录 /channel 下的welcome.htm。 其计算机域名为。超级文本文件(文件类型为.html)是在目录/talk 下的talk1.htm。文件的URL:用URL 表示文件时,服务器方式用file 表示,后面要有主机IP 地址、文件的存
18、取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。file:/ 代表存放在主机 上的pub/files/目录下的一个文件,文件名是foobar.txt。file:/ 代表主机 上的目录/pub。file:/ 代表主机 的根目录。爬虫最主要的处理对象就是URL,它根据URL 地址取得所需要的文件内容,然后对它进行进一步的处理。(二)指定URL获取网页 根据给定的URL 来抓取网页。所谓网页抓取,就是把URL 地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟IE 浏览器的功能,把URL 作为HTTP 请求的内容发送到服务器端,然后读取服务器端的响
19、应资源。Java 语言是为网络而生的编程语言,它把网络资源看成是一种文件,它对网络资源的访问和对本地文件的访问一样方便。它把请求和响应封装为流。因此我们可以根据相应内容,获得响应流,之后从流中按字节读取数据。例如,.URL 类可以对相应的Web服务器发出请求并且获得响应文档。.URL 类有一个默认的构造函数,使用URL 地址作为参数,构造URL 对象: URL pageURL = new URL(path),接着可以通过获得的URL 对象来取得网络流,进而像操作本地文件一样来操作网络资源:接着,可以通过获得的URL 对象来取得网络流,进而像操作本地文件一样来操作网络资源: InputStrea
20、m stream = pageURL.openStream()。在实际的项目中,网络环境比较复杂,因此,只用 包中的API 来模拟IE 客户端的工作,代码量非常大。需要处理HTTP 返回的状态码,设置HTTP 代理,处理HTTPS协议等工作。为了便于应用程序的开发,实际开发时常常使用Apache 的HTTP 客户端开源项目HttpClient。它完全能够处理HTTP 连接中的各种问题,使用起来非常方便。只需在项目中引入HttpClient.jar 包,就可以模拟IE 来获取网页内容。本设计中还是采用前者。(三)爬虫策略1、宽度优先搜索在实际项目中,则使用爬虫程序遍历互联网,把网络中相关的网页全
21、部抓取过来,这也体现了爬虫程序“爬”的概念。爬虫程序是如何遍历互联网,把网页全部抓取下来的。互联网可以看成一个超级大的“图”,而每个页面可以看作是一个“节点”。页面中的链接可以看成是图的“有向边”。因此,能够通过图的遍历的方式对互联网这个超级大“图”进行访问。图的遍历通常可分为宽度优先遍历和 深度优先遍历两种方式。但是深度优先遍历可能会在深度上过“深”地遍历或者陷入“黑洞”,大多数爬虫都不采用这种方式。图的宽度优先遍历:图的宽度优先遍历(BFS)算法是一个分层搜索的过程,和树的层序遍历算法相同。在图中选中一个节点,作为起始节点,然后按照层次遍历的方式,一层一层地进行访问。图的宽度优先遍历需要一
22、个队列作为保存当前节点的子节点的数据结构。具体的算法如下所示:(1) 顶点V 入队列。(2) 当队列非空时继续执行,否则算法为空。(3) 出队列,获得队头节点V,访问顶点V 并标记V 已经被访问。(4) 查找顶点V 的第一个邻接顶点col。(5) 若V 的邻接顶点col 未被访问过,则col 进队列。(6) 继续查找V 的其他邻接顶点col,转到步骤(5),若V 的所有邻接顶点都已经被访问过,则转到步骤(2)。把互联网看成一个“超图”,则对这张图也可以采用宽度优先遍历的方式进行访问。宽度优先遍历互联网:宽度优先遍历是从一个种子节点开始的。而实际的爬虫项目是从一系列的种子链接开始的。所谓种子链接
23、,就好比宽度优先遍历中的种子节点一样。实际的爬虫项目中种子链接可以有多个,而宽度优先遍历中的种子节点只有一个。比如,指定 种子链接,如何定义一个链接的子节点。每个链接对应一个HTML 页面或者其他文件(word、excel、pdf、jpg 等),在这些文件中,只有HTML 页面有相应的“子节点”,这些“子节点”就是HTML 页面上对应的超链接。如页面中,“招聘”、“网址”、“更多”以及页面下方的“搜索产品”、“技术文档”、“成功案例”、“新闻”、“联系我们”、“关于我们”、“ENGLISH”等都是种子的子节点。这些子节点本身又是一个链接。对于非HTML 文档,比如Excel 文件等,不能从中提
24、取超链接,因此,可以看作是图的“终端”节点。整个的宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的“子节点”(也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放入一张表(通常称为Visited 表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于Visited 表中。如果存在,证明链接已经处理过,跳过,不做处理,否则进行下一步处理。 Todo表Todo表解析URL初始URL图3-1宽度优先爬虫过程初始的URL 地址是爬虫系统中提供的种子URL(一般在系统的配置文件中指定)。当解析这些种子URL 所表示的网页时,会产生新的URL(比如从页面中的 0)if(m
25、axUrls != -1)if(crawledList.size()= maxUrls)break;/从队列取出urlString url = null;if(toCrawlList.iterator().hasNext()tryurl = (String)toCrawlList.iterator().next();catch(ClassCastException e) /从待爬队列中删除该urltoCrawlList.remove(url);URL verifiedUrl = verifyUrl(url);String verifiedUrlActionTime = getTimeStamp();