已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中国地质大学(武汉)远程与继续教育学院毕业设计(论文)远程与继续教育学院本科毕业论文(设计)题目:基于jsp的搜索引擎 学习中心: 内蒙古学习中心 学 号: 090F24133024 姓 名: 辛晓旭 专 业: 计算机科学与技术 指导教师: 任秀杰 2015 年 7 月 25 日 中国地质大学(武汉)远程与继续教育学院本科毕业论文(设计)指导教师指导意见表学生姓名: 辛晓旭 学号: 090F24133024 专业: 计算机科学与技术 毕业设计(论文)题目: 基于jsp的搜索引擎 指导教师意见:(请对论文的学术水平做出简要评述。包括选题意义;文献资料的掌握;所用资料、实验结果和计算数据的可靠性;写作规范和逻辑性;文献引用的规范性等。还须明确指出论文中存在的问题和不足之处。)填写要求:1.请指导教师按以上要求填写意见,2.学生在上传论文时不得将以上括号内的内容删除。3.当学生论文评阅成绩不及格重写时,指导教师要重新填写意见及新的指导日期。(指导教师填写指导意见时请将填写要求删除)指导教师结论: (合格、不合格)指导教师姓名所在单位指导时间中国地质大学(武汉)远程与继续教育学院 本科毕业设计(论文)评阅教师评阅意见表 学生姓名: 辛晓旭 学号: 090F24133024 专业: 计算机科学与技术 毕业设计(论文)题目: 基于jsp的搜索引擎 评阅意见:(请对论文的学术水平做出简要评述。包括选题意义;文献资料的掌握;所用资料、实验结果和计算数据的可靠性;写作规范和逻辑性;文献引用的规范性等。还须明确指出论文中存在的问题和不足之处。)填写要求:1.请评阅教师按以上要求填写意见,2.上传论文时不得将以上括号内的内容删除。3.当学生论文评阅成绩不及格重写时,评阅教师要重新填写意见及新的评阅日期。 (评阅教师填写指导意见时请将填写要求删除)修改意见:(针对上面提出的问题和不足之处提出具体修改意见。评阅成绩合格,并可不用修改直接参加答辩的不必填此意见。)毕业设计(论文)评阅成绩 (百分制): 评阅结论: (同意答辩、不同意答辩、修改后答辩)评阅人姓名所在单位评阅时间论文原创性声明本人郑重声明:本人所呈交的本科毕业论文基于jsp的搜索引擎,是本人在导师的指导下独立进行研究工作所取得的成果。论文中引用他人的文献、资料均已明确注出,论文中的结论和结果为本人独立完成,不包含他人成果及使用过的材料。对论文的完成提供过帮助的有关人员已在文中说明并致以谢意。本人所呈交的本科毕业论文没有违反学术道德和学术规范,没有侵权行为,并愿意承担由此而产生的法律责任和法律后果。 论文作者(签字): 辛晓旭 日期:2015年7月25日3摘 要随着互联网的不断发展和日益普及,网上的信息量在爆炸性增长,在 2004 年4月,全球Web页面的数目已经超过40 亿,中国的网页数估计也超过了3 亿。 目前人们从网上获得信息的主要工具是浏览器,搜索引擎在网络中占有举足轻重的地位,本文将在此深入的对搜索引擎做一个研究与阐述。并且详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人、索引引擎、Web服务器三个方面进行详细的说明。为了更加深刻的理解这种技术,本文实现了一个简单的搜索引擎Damon。关键词: 1、jsp 2、 搜索引擎 3、设计 4、实现 目 录一、前言1二、搜索引擎的相关理论分析2(一)搜索引擎的历史渊源2(二)搜索引擎基本结构31、网络机器人32、索引与搜索43、Web服务器44、搜索引擎的主要指标及分析4三、网络机器人5(一)什么是网络机器人5(二)网络机器人的结构分析5(三)Spider程序结构6(四)如何提高程序性能7四、基于Tomcat的Web服务器jsp搜索引擎程序设计详解8(一)开发工具、平台及资源8(二)Lucene开源组件简介8(二)Lucene的基本介绍81、对于Lucene的感性认识82、Lucene的索引效率9(三)引入基于Tomcat的Web服务器开发设计10(四)用户接口设计101、客户端设计102、服务端设计11(五)机器人的设计分析121、程序结构图如下:122、程序关键代码实现如下:13(六)关于程序说明16五、在Tomcat上部署项目18六、结论19致谢20参考文献21 6一、前言在网络十分发达的今天,面临非常丰富网络资源,不论我们是学习、研究、还是工作需要在网络上能查找到相关的资料信息,人们现在对网络的依赖程度越来越高,但是如何有效的搜索信息却是一件困难的事情。但是幸运的是类似于百度、Google这样的搜索网站的出现能帮助我们解决这样的问题,使我们可以在网络中查找自己所需要的信息资源。从理论上讲所有的用户都可以从搜索出发到达自己想去的网上任何一个地方。并且我们在网络中可以找到几乎我们需要的一切的可能的东西,本文从搜索引擎发展历史开始,然后详细介绍了程序中使用的组件Lucene,重点阐述了全文搜索引擎的基本原理、所采用的相关技术,进而引出专题搜索引擎,并且为提高专题性所采取的一些方法。分析了网页文档半结构化的数据特点以及使用自己编写的spider程序从Internet上取回综合的信息经过Lucene处理加入索引文件中,最终用户在客户端输入关键字后实现将与关键字相关信息返回给用户。 二、搜索引擎的相关理论分析(一)搜索引擎的历史渊源早在 Web出现之前,互联网上就已经存在许多让人们共享的信息资源了。那些资源当时主要存在于各种允许匿名访问的FTP 站点(anonymous ftp),内容以学术技术报告、研究性软件居多,它们以计算机文件的形式存在,文字材料的编码通常是PostScript 或者纯文本(那时还没有HTML)。在互联网发展初期,网站相对较少,信息查找比较容易。然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,这时为满足大众信息检索需求的专业搜索网站便应运而生了。为了便于人们在分散的FTP 资源中找到所需的东西,1990年由蒙特利尔大学学生AlanEmtage发明的Archie。虽然当时WorldWideWeb还未出现,但网络中文件传输还是相当频繁的,而且由于大量的文件散布在各个分散的FTP主机中,查询起来非常不便,因此AlanEmtage想到了开发一个可以以文件名查找文件的系统,于是便有了Archie。 Archie工作原理与现在的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,然后对有关信息进行索引,供使用者以一定的表达式查询。受其启发, 1993 年Matthew Gray 开发了World Wide Web Wanderer,它是 世界上第一个利用HTML 网页之间的链接关系来监测Web 发展规模的“机器人” (robot)程序。现代搜索引擎的思路源于Wanderer,不少人此基础上对它的蜘蛛程序做了改进。当时,“机器人”一词在编程者中十分流行。电脑“机器人”(ComputerRobot)是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此,搜索引擎的“机器人”程序就被称为“蜘蛛”程序。1994 年7 月,Michael Mauldin 将John Leavitt 的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的 Lycos,成为第一个现代意义的 搜索引擎。在那之后,随着Web 上信息的爆炸性增长,搜索引擎的应用价值也越 来越高,不断有更新、更强的搜索引擎系统推出。同年,斯坦福(Stanford)大学的两名博士生,共同创办了超级目录索引Yahoo,并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。目前,互联网上有名有姓的搜索引擎已达数百家,比如最近风头正劲的Google,其数据库中存放的网页已达30亿之巨! 随着互联网规模的急剧膨胀,一家搜索引擎光靠自己单打独斗已无法适应目前的市场状况,因此现在搜索引擎之间开始出现了分工协作,并有了专业的搜索引擎技术和搜索数据库服务提供商。如国外的Inktomi,它本身并不是直接面向用户的搜索引擎,但向包括Overture(原GoTo)、LookSmart、MSN、HotBot等在内的其他搜索引擎提供全文网页搜索服务,因此从这个意义上说,它们是搜索引擎的搜索引擎。(二)搜索引擎基本结构 搜索引擎是根据用户的查询请求信息,按照一定算法从索引数据中查找符合用户需求的信息后将结果返回给用户。一般的搜索引擎由网络机器人程序、索引与搜索程序、索引数据库等部分组成。JSP客户端网络机器人程序索引数据库引擎维护建立Lucene索引www网站标签信息面向用户使用接口搜索信息Web应用服务器 图2-1结构图1、网络机器人网络机器人也称为“网络蜘蛛”(Spider),是一个功能很强的WEB扫描程序。它可以在扫描WEB页面的同时检索其内的超链接并加入扫描队列等待以后扫描。因为WEB中广泛使用HTML超链接,所以一个Spider程序理论上可以访问整个WEB页面。为了保证网络机器人遍历信息的广度和深度需要设定一些重要的链接并制定相关的扫描策略。其设计思想就是将整个网络看做一棵树,通过递归不断的将符合条件的页面的连接拿到进行处理。2、索引与搜索网络机器人将遍历得到的页面存放在临时数据库中,如果通过SQL直接查询信息速度将会难以忍受。为了提高检索效率,需要建立索引(我们学过的SqlServer2005中曾介绍字段添加索引能提高查询速度这个倍数是惊人的),用户输入搜索条件后搜索程序将通过索引数据库进行检索然后把符合查询要求的数据返回给用户。3、Web服务器 在Web程序开发中,使用的Wdb服务器有很多种类,其中比较常见的有,tomcat服务器、WebLogic服务器、还有JBoss服务器,其中tomcat是最比较普遍常用的一个,它以稳定的性能,和开源的优势得到了广大用户的承认,其实JBoss也是一个开源的但是它的结构比较复杂使用起来不是很灵活,而WebLogic则是一款收费的商业型的服务器,在我实现的开发中择用了简单使用的tomcat容器作为我web程序的服务器。客户一般通过浏览器进行查询,这就需要系统提供Web服务器并且与后台的搜索逻辑进行交互。客户在浏览器中输入查询条件,Web服务器接收到客户的查询条件后在索引数据库中进行查询处理然后返回给客户端。4、搜索引擎的主要指标及分析搜索引擎的主要指标有响应时间、准确率、相关度等。这些指标决定了搜索引擎的技术指标。搜索引擎的技术指标决定了搜索引擎的评价指标。好的搜索引擎应该是具有较快的反应速度和准确率的,当然这些都需要搜索引擎技术指标来保障。准确率:一次搜索结果中符合用户要求的数目与该次搜索结果总数之比相关度:用户查询与搜索结果之间相似度的一种度量精确度:对搜索结果的排序分级能力和对垃圾网页的抗干扰能力 三、网络机器人(一)什么是网络机器人网络机器人又称为Spider程序,是一种专业的网页爬虫程序。它能查找大量的Web页面。从一个简单的Web入口页面上开始执行,然后通过其超链接一次递归访问其他页面,因此理论上网络机器人可以扫描互联网上的所有页面。但是实际中并非如此,因为这样将会耗去大量的时间和金钱,一次所有的企业基于商业盈利的角度都不会不停的使用网络机器人进行搜索WEB页面。一般来说这些企业都是定时的进行索引数据库的更新,据说Google是每隔28天进行一次索引数据库的更新并维护这些大型数据库。(二)网络机器人的结构分析Internet是建立在很多相关协议基础上的,而更复杂的协议又建立在系统层协议之上。Web就是建立在HTTP ( Hypertext Transfer Protocol ) 协议基础上,而HTTP又是建立在TCP/IP ( Transmission Control Protocol / Internet Protocol ) 协议之上,它同时也是一种Socket协议。所以网络机器人本质上是一种基于Socket的网络程序。因为Web中的网页信息都是使用HTML标记语言,因此网络机器人在检索网页时首先就是对HTML标记进行解析。在处理解析之前,先来了解一下HTML中主要数据类型。我们在进行解析的时候不用关心所有的标签,只需要对其中几种重要的进行解析即可。以下是一些HTML基本的标签元素。脚本:一些嵌入HTML标签中的代码语言 (例如:JavaScript、jsp页面中的Java代码等等)注释:程序员留下的说明文字,对用户是不可见的(即:)简单标签:由单个表示的HTML标签(例如:、 等等) (1)超连接标签超连接定义了WWW通过Internet链接文档的功能。他们的主要目的是使用户能够任意迁移到新的页面,这正是网络机器人最关心的标签。(2)图像映射标签图像映射是另一种非常重要的标签。它可以让用户通过点击图片来迁移到新的页面中。(3)表单标签表单是Web页面中可以输入数据的单元。许多站点让用户填写数据然后通过点击按钮来提交内容,这就是表单的典型应用。(4)表格标签表格是HTML的构成部分,通常用来格式化存放、显示数据。我们在具体解析这些HTML标签有两种方法:通过JavaTM中的Swing类来解析或者通过组件包中的HTMLParser来解析,本人在实际编程中采用后者使用组件对html进行操作。HTMLParser是一个很优秀的开源组件,它有很强大的支持HTML解析的功能,下面我来介绍一个下HTMLParser中的核心组件类。 org.htmlparser.Parser 定义了htmlparser的一些基础类。其中最为重要的是Parser类。Parser是htmlparser的最核心的类。 org.htmlparser.beans对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。 org.htmlparser.nodes定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。 org.htmlparser.tags定义了htmlparser的各种tag。 org.htmlparser.filters定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤。 org.htmlparser.visitors定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历。(三)Spider程序结构网络机器人必须从一个网页迁移到另一个网页,所以必须找到该页面上的超连接。程序首先解析网页的HTML代码,查找该页面内的超连接然后通过递归和非递归两种结构来实现Spider程序。 1、递归结构递归是在一个方法中调用自己本身的程序设计技术。虽然比较容易实现但耗费内存且不能使用多线程技术,故不适合大型项目。 2、非递归结构这种方法使用队列的数据结构,当Spider程序发现超连接后并不调用自己本身而是把超连接加入到等待队列中。当Spider程序扫描完当前页面后会根据制定的策略访问队列中的下一个超连接地址。虽然这里只描述了一个队列,但在实际编程中用到了四个队列,他们每个队列都保存着同一处理状态的URL。 等待队列:在这个队列中,URL等待被Spider程序处理。新发现的URL也被加入到这个队列中处理队列:当Spider程序开始处理时,他们被送到这个队列中 错误队列:如果在解析网页时出错,URL将被送到这里。该队列中的URL不能被移入其他队列中 完成队列:如果解析网页没有出错,URL将被送到这里。该队列中的URL不能被移入其它队列中,在同一时间URL只能在一个队列中,把它称为URL的状态。发现URL等待队列运行队列完成队列错误队列完成URL 图3-1 spider运行过程以上的图表示了队列的变化过程,在这个过程中,当一个URL被加入到等待队列中时Spider程序就会开始运行。只要等待队列中有一个网页或Spider程序正在处理一个网页,程序就会继续他的工作。当等待队列为空并且当前没有任何网页时,Spider程序就会停止它的工作。(四)如何提高程序性能Internet中拥有海量的Web页面,如果开发出高效的Spider程序是非常重要的。通过查询资料我主要研究了使用Java的多线程技术提高性能的技术:线程是通过程序的一条执行路线。多线程是一个程序同时运行多个任务的能力。它是在一个程序的内部进行分工合作。优化程序的通常方法是确定瓶颈并改进他。瓶颈是一个程序中最慢的部分,他限制了其他任务的运行。例如:一个Spider程序需要下载十个页面,要完成这一任务,程序必须向服务器发出请求然后接受这些网页。当程序等待响应的时候其他任务不能执行,这就影响了程序的效率。如果用多线程技术可以让这些网页的等待时间合在一起,不用互相影响,这就可以极大的改进程序性能。四、基于Tomcat的Web服务器jsp搜索引擎程序设计详解(一)开发工具、平台及资源 MyEclipse 6.0开发工具 Sun JDK 1.6.1 Tomcat 6.1服务器 开源Lucene组件(二)Lucene开源组件简介我在程序设计实现中,使用了lucene开源组件,并未使用数据库做为存放大量信息的索引数据库,最主要的原因就是考虑使用Lucene效率会大大的高于使用普通数据库的性能。因此首先简单介绍一下Lucene相关的技术。什么是Lucene全文检索以及引入Lucene的原因:Lucene是Jakarta Apache的开源项目。它是一个用Java写的全文索引引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。如果搜索引擎网络机器人检索到的网页信息放到数据库中的话,当用户在客户端检索数据的时候,如果数据库中存放着大量数据的话,没有好的数据库检索策略,数据查询速度大大减慢,而且其搜索引擎的性能也会因此而大打折扣,会导致用户长期的等待,结果超出用户的人手时间。考虑以上的原因,我在设计的时候选择了使用Lucene,将网络机器人,检索到的网页的基本信息交与Lucene处理,经过Lucene处理后将搜索到的网页信息建立相应的索引,并且存放到Lucene创建的索引文件中去,从而在用户检索相应的数据的时候,免去了从数据库中查询的步骤,直接从索引文件中获取所需的信息,这样程序对文件的IO操作要远远大于数据库的检索的效率。从而提高了程序的性能和用户的体验。(二)Lucene的基本介绍1、对于Lucene的感性认识Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表=记录=字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构和接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统,因此Lucene和数据库在很大程度上有一定的相似度,在Lucene中的索引数据源(即:doc(field1,field2.) doc(field1,field2.))很像数据库中的数据库表,而Lucene中的Document类即:(一个需要进行索引的“单元”,一个Document由多个字段组成)很类似与数据库中表中的一条记录或者是行也可以,在Lucene中的Field类则是充当了索引文件中的Decument类的属性的集合字段,它的作用当然就是相当于数据库的列的属性,在我们使用Java也好或者是C#也罢查询数据库的时候,数据库返回的结果集就相当于Lucene结果输出,也就是Hits类对象了,即:(doc(field1,field2) doc(field1.)在Hits中查询结果集,由匹配是由Document组成相当于数据库中查询出来的结果集。2、Lucene的索引效率前面提到了,我使用Lucene主要的目的就是为了提高索引数据库中的数据查询速度,下面我们就来看看Lucene的基本的索引原理吧,通常书籍后面常常附关键词索引表(比如:北京:12, 34页,上海:3,77页),感性的讲它就像我们常用的字典中的目录很相似,它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,通过书后面的索引查找的速度要比一页一页地翻内容高多少倍而索引之所以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。由于数据库索引不是为全文索引设计的,因此,使用like %keyword%时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。我曾经在Oracle中做过一个实验,在数据库中使用索引和不使用索引的速度先比,前者是后者速度的将近上百倍,当然这个结果不是唯一的,对于数据量越大的数据库中我们使用索引的效率以及能给我们带来的方便时越为明显的,如果是需要对多个关键词进行模糊匹配:like%keyword1% and like %keyword2% .其效率也就可想而知了。所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词=文章映射关系,这样检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。在本文中我们主要是研究的搜索引擎的效率问题,在其实在Lucene中还有很多个人认为很经典的技术,比如是分词技术,还有相关的信息匹配技术等等由于时间文章的篇幅限制,我在此不多赘述。(三)引入基于Tomcat的Web服务器开发设计Web服务器是在网络中为实现信息发布、资料查询、数据处理等诸多应用搭建基本平台的服务器。Web服务器如何工作:在Web页面处理中大致可分为三个步骤,第一步,Web浏览器向一个特定的服务器发出Web页面请求;第二步,Web服务器接收到Web页面请求后,寻找所请求的Web页面,并将所请求的Web页面传送给Web浏览器;第三步,Web服务器接收到所请求的Web页面,并将它显示出来。这就是一个典型的HTTP请求过程。Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat由Apache-Jakarta子项目支持并由来自开放性源代码Java社区的志愿者进行维护。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业应用软件服务器要好。(四)用户接口设计1、客户端设计一个良好的查询界面非常重要,例如Google就以她简洁的查询界面而闻名。我在设计的时候也充分考虑了实用性和简洁性。 图4-1查询界面 图4-2查询结果2、服务端设计主要利用jsp技术实现,用户通过GET方法从客户端向服务端提交查询条件,服务端通过Tomcat的jsp接受并分析提交参数,再调用lucene的开发包进行搜索操作。最后把搜索的结果以HTTP消息包的形式发送至客户端,从而完成一次搜索操作。实现的关键代码如下:int thispage = (request.getParameter(thispage) = null) ? Integer.parseInt(request.getParameter(thispage);/当前页码long starttime = System.currentTimeMillis(); /拿到用户请求的查询内容String queryString = request.getParameter(query);if (queryString = null) | queryString.equals() queryString = dd;response.sendRedirect(./index.jsp); /以下代码是使用Lucene索引文件进行搜索符合条件的内容IndexFiles indexFiles = new IndexFiles();String path = request.getRealPath(/) + index; /建立符合条件的搜索结果集合存放准备将其返回给用户Hits hits = indexFiles.searchIndexContent(path, queryString);System.out.println(一共查到 + hits.length() + 记录);long endtime = System.currentTimeMillis(); /将搜用户索条件进行分词处理ChineseAnalyzer abc = new ChineseAnalyzer();TokenStream tokenStream = null;QueryParser parser = new QueryParser(title,new StandardAnalyzer();Query query = parser.parse(queryString); /将拿到的内容进行高亮关键字处理 Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(, ), newQueryScorer(query);highlighter.setTextFragmenter(new SimpleFragmenter(99);/(五)机器人的设计分析1、程序结构图如下: 图4-3 spider程序结构2、程序关键代码实现如下:(1)网络机器人搜索网页核心代码public void search(Queue queue) while (!queue.isEmpty() / 只要是队列不为空则网络机器人工作url = queue.peek().toString();/ 查找列队if (!isSearched(searchedsite, url) / 查看当前连接是否被扫描过if (isRobotAllowed(new URL(url) / 检查该链接是否被允许搜索processHtml(url); / 分析当前地址的页面System.out.println(此页面禁止爬虫获取资源!);queue.remove(); / 搜索操作完成之后进行出对操作。* 检查该链接是否已经被扫描 *已经处理完成的URL列表 *当前处理的URL字符串public boolean isSearched(List list, String url) String url_end_ = ;if (url.endsWith(/) / 测试此字符串是否以/后缀结束/ 返回指定子字符串(/)在此字符串中最右边出现处的索引/ (拿到连接地址最右边的/索引) 例如 / 能拿到最右边的即最后一个/的索引位置,/ 最终的目的是要拿到/之前的连接地址url_end_ = url.substring(0, url.lastIndexOf(/); else url_end_ = url + /;if (list.size() 0) / indexOf(Object o)/ 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1/ 我们在此不使用循环进行选重原因就是因为使用index of方法效率要高些,/ 因为Java已经将它的算法封装在里面并且进行了优化 if (list.indexOf(url) != -1 | list.indexOf(url_end_) != -1) return true; / 如果在list中没有找到当前要处理的url则表示可以处理return false; / 否则此链接地址已经处理过在此不做任何处理 * 检查URL是否被允许搜索private boolean isRobotAllowed(URL urlToCheck) String host = urlToCheck.getHost().toLowerCase();/ 获取给出RUL的主机并且使用给定 Locale 的规则将此 String 中的所有字符都转换为小写/ System.out.println(主机=+host);/ 获取主机不允许搜索的URL缓存ArrayList disallowList = disallowListCache.get(host);/ 如果还没有缓存,下载并缓存。if (disallowList = null) disallowList = new ArrayList();URL robotsFileUrl = new URL(http:/ + host + /robots.txt);BufferedReader reader = new BufferedReader(new InputStreamReader(robotsFileUrl.openStream(); / 读robot文件,创建不允许访问的路径列表。while (line = reader.readLine() != null) if (line.indexOf(Disallow:) = 0) / 是否包含Disallow:String disallowPath = line.substring(Disallow:.length(); / 获取不允许访问路径检查是否有注释。int commentIndex = disallowPath.indexOf(#);if (commentIndex != -1) disallowPath = disallowPath.substring(0,commentIndex);/ 去掉注释disallowPath = disallowPath.trim();disallowList.add(disallowPath); / 在此确队列中的元素不是为空的for (Iterator it = disallowList.iterator(); it.hasNext();) System.out.println(Disallow is : + it.next();/ 缓存此主机不允许访问的路径。/ 将此主机名相对应的禁止访问的路径放到定义的map中disallowListCache.put(host, disallowList);说明:1) 以上是网络机器人的核心算法代码,运用的就是半自动递归思想,搜索引擎系统维护人员将定时的执行网络机器人代码,来更新索引数据库中的内容确保用户能拿到自己所需要的最符合用户的,最新的消息。2) 值得说明的一点是,在我做这个程序的时候遇见的一个难题吧,在确定URL的时候怎么能知道我们访问的网站是否允许我们的搜索引擎爬取本网站的内容呢, 这样roboots.txt就起到了关键的作用,在此我们介绍一下roboots文件.搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信息。我们可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网站中不想被robot访问的部分,这样,该网站的部分或全部内容就可以不被搜索引擎收录了,或者指定搜索引擎只收录指定的内容。robots.txt文件应该放在网站根目录下。举例来说,当robots访问一个网站(比如)时,首先会检查该网站中是否存在/robots.txt这个文件,如果机器人找到这个文件,它会根据这个文件的内容,来确定它访问权限的范围。网站 URL 相应的 robots.txt的 URL /robots.txt,在robots.txt中 Disallow : 该项的值用于描述不希望被访问到的一个URL,这个URL可以是一条完整的路径,也可以是部分的,任何以Disallow开头的URL均不会被robot访问到。例如Disallow: /help对/help.html和/help/index.html都不允许搜索引擎访问,而Disallow: /help/则允许robot访问/help.html,而不能访问/help/index.html。任何一条Disallow记录为空,说明该网站的所有部分都允许被访问, 在/robots.txt文件中,至少要有一条Disallow记录。如果/robots.txt是一个空文件,则对于所有的搜索引擎robot, 该网站都是开放的。(2)网络机器人解析网页HTML核心代码处理HTML标签public void dealTag(Tag tag) throws Exception NodeList list = tag.getChildren();if (list != null) NodeIterator it = list.elements();while (it.hasMoreNodes() Node node = it.nextNode();parserNode(node);处理HTML标签结点 public void parserNode(Node node) throws Exception / instanceof 用于判断所拿到的节点类型是不是标准定义好的节点类型henif (node instanceof StringNode) / 判断是否是文本结点StringNode sNode = (StringNode) node;StringFilter sf = new StringFilter(keyword, false);search_key_words = sf.accept(sNode);if (search_key_words) count+;/ System.out.println(text is :+sNode.getText().trim(); else if (node instanceof Tag) / 判断是否是标签库结点Tag atag = (Tag) node;if (atag instanceof TitleTag) / 判断是否是标TITLE结点srb.setTitle(atag.getText();if (atag instanceof LinkTag) / 判断是否是标LINK结点LinkTag linkatag = (LinkTag) atag; checkLink(linkatag.getLink(), linklist); / System.out.println(-this is link dealTag(atag); else if (node instanceof RemarkNode) / 判断是否是注释 3、网络机器人与Lucene结合核心代码if (!iswrite) /切入蜘蛛程序System.out.println(开始为页面建立索引 + url + .);IndexFiles.updateURL(path, url);说明:本代码是将网络机器人拿到符合条件的标签加到Lucene索引文件中,即搜索引擎的索引数据库。(六)关于程序说明1、本人在网络机器人运用了Java语言开发,主要涉及到了net和io两个包。2、还有Java线程技术,由于时间比较紧迫,本程序只用的了Java中的单线程技术,具体的程序优化后期应该能涉及到Java中的线程池技术。3、此外还用了第三方开发包htmlparser组件用于解析HTML网页标签。 4、本程序使用的算法是介于递归和非递归的半自动递归算法,使用递归算法的时候,如果有意外可能会导致内存溢出,对于本文的程序如果使用非递归算法的话有点复杂,会使得程序的性能无法达到最佳的状态,因为我对非递归的算法进行了改造,自己将它命名为半自动的非递归算法,能是本程序性能达到比较好的状态。五、在Tomcat上部署项目Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司股权架构设计与融资方案解析
- 北京医院护士工作手册与面试技巧
- 人工智能时代企业财务管理的转型研究
- 渔光互补项目社会稳定风险评估报告
- 推动县域医疗均衡发展的策略及实施路径
- 汽车主机厂项目降本管理体系建设与实践
- 建筑类人才培养中的课程群建设与探索
- TPM推行专员项目风险管理方案
- 广播电视融合媒体平台创新创业项目商业计划书
- 数字化助力乡村学校高质量发展的实践与探索
- 小型水电站安全生产标准化评审细则2024
- 2002年购房合同协议
- 新产品导入(NPI)培训
- 全麻术后护理与注意事项
- 数字化在招聘流程优化中的作用研究
- 玉米烘干仓储可行性研究报告
- 普外科综合面试题及答案
- 压力管道安装防腐技术工艺标准
- 人教版小学一年级语文上册期末试卷(5份)
- 饭堂厨房设备施工方案
- 《宫腔镜水中毒》课件
评论
0/150
提交评论