欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

基于JAVA的搜索引擎设计与实现本科毕业论文(设计)毕业设计(论文)word格式

  • 资源ID:79663118       资源大小:524.51KB        全文页数:24页
  • 资源格式: DOC        下载积分:10积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要10积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

基于JAVA的搜索引擎设计与实现本科毕业论文(设计)毕业设计(论文)word格式

山东财经大学学士学位论文山东财经大学本科毕业论文(设计)题目:基于JAVA的搜索引擎设计与实现学 院 计算机科学与技术 专 业 计算机科学与技术专业 班 级 计算机科学与技术2班 学 号 20080854239 姓 名 秦 露 指导教师 林培光 山东财经大学教务处制二一二年五月山东财经大学学士学位论文原创性声明本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在论文中作了明确的说明并表示了谢意。本声明的法律结果由本人承担。学位论文作者签名: 年 月 日山东财经大学关于论文使用授权的说明本人完全了解山东经济学院有关保留、使用学士学位论文的规定,即:学校有权保留、送交论文的复印件,允许论文被查阅,学校可以公布论文的全部或部分内容,可以采用影印或其他复制手段保存论文。指导教师签名: 论文作者签名: 年 月 日 年 月 日基于JAVA的搜索引擎设计与实现摘 要网络中资源丰富,但是互联网上海量的信息,任何一个人都不能全部浏览,为了获取我们需要的信息,由此就产生了搜索引擎。而如今搜索引擎无法满足增长着的网页数量,搜索引擎技术已经成为计算机界积极研究和开发的对象,网络爬虫是搜索引擎的基础,是最底层的技术。所以研究网络爬虫的实现技术并研究其应用十分重要。论文详细说明了如何用java语言实现一个简易搜索引擎,同时描述了搜索引擎的原理,系统功能,简要介绍了系统开发的背景,开发环境,系统的需求分析,以及功能的设计与实现。关键词:搜索引擎;网络爬虫;搜索策略Design and Implementation of Search Engine Based on JAVAABSTRACTThe resources on the internet are abundant, but any one of us can't 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 pages 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 application 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 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(四)输入输出要求9(五)运行需求9六、概要设计9(一)可行性论述9(二)系统设计方案9(三)各功能划分10(四)主要存储结构10七、详细设计10(二)获取网页实现13(三)解析HTML实现13(四)ROBOTS文件18(五)信息输出19八、结束语20参考文献20致谢20一、引言自从WWW于1991年诞生以来,已经发展成为拥有超过亿位用户和约400万站点、几十亿页面的巨大信息空间,而且其信息容量仍在以指数形式飞速增长。WWW是以超文本的形式呈现给用户的,包含了从技术资料、商业信息到新闻报道、娱乐信息等多种类别和形式的信息。超文本标识语言以其简单精练的语法、极易掌握的通用性与易学性,使WEB网页可以亲近于每一个普通人,互联网也才得以普及发展以至今日的辉煌。然而,电子商务、电子图书、远程教育等全新领域如异军突起,迅猛发展并逐渐成为互联网世界必不可少且愈发重要的组成部分,随之而来的是WEB文件的复杂化、多样化、智能化,于是高容量、高信息量、高效率便成为网络信息传输技术发展的追求。与此同时还有另一种需求变得愈发广泛而迫切,那便是如何得到用户感兴趣的信息。由于Internet是一个具有开放性、动态性和异构性的全球分布式网络,资源分布很分散,且没有统一的管理和结构,这就导致了信息获取的困难。如何快速、准确地从浩瀚的信息资源中寻找到所需信息己经成为困扰网络用户的一大难题,这也就是所谓的Rich Data Poor Information 问题。于是搜索引擎便随之产生,像mp3搜索、视频搜索、图片搜索正是搜索的初步雏形。根据用户的搜索意图,直接返回相关信息。对搜索引擎技术的研究,国外比中国要早近十年,从最早的Archie,到后来的Excite、ahvista、overture、google等搜索引擎问世。虽然在国外搜索引擎技术早就开始研究,但在国内还是陆续涌现出优秀的搜索引擎,像百度、中搜等。随着搜索引擎技术的成熟,它将成为获取信息、掌握知识的利器。但是现有的搜索引擎对于用户所提出的查询要求仅限于关键词的简单逻辑组合,搜索结果重视的是返回的数量而不是质量,在结果文档的组织和分类上也有所欠缺因此,如何提高搜索引擎的智能化程度,如何按照知识应用的需要来组织信息,使互联网不仅提供信息服务,而且能为用户提供知识服务,将成为计算机工业界和学术界有待研究的方向。而网络爬虫是这一切的基础,是最底层的技术。所以解决这一问题就需要我们研究网络爬虫的实现技术并研究其应用。二、搜索引擎(一)搜索引擎的工作原理搜索引擎的原理,可以看作三步:从互联网上抓取网页,建立索引数据库,在索引数据库中搜索。搜索引擎利用能够从互联网上自动收集网页的爬虫程序,自动访问互联网,并沿着网页中的所有URL爬到其它网页,重复这过程,并把爬过的所有网页收集回来。然后建立索引数据库,由分析索引程序对收集回来的网页进行分析,提取相关网页信息(包括网页所在URL、编码类型、页面内容包含的关键词、关键词位置、生成时间、大小、与其它网页的链接关系等),然后用这些相关信息建立网页索引数据库。接下来在索引数据库中搜索排序,当用户输入关键词搜索后,由搜索系统程序从网页索引数据库中找到符合该关键词的所有相关网页。最后,由页面生成系统将搜索结果的链接地址和页面内容摘要等内容组织起来返回给用户。(二)搜索引擎的分类获得网站网页资料,能够建立数据库并提供查询的系统,都可以把它叫做搜索引擎。真正意义上的搜索引擎,通常指的是收集了因特网上几千万到几十亿个网页并对网页中的每一个词(即关键词)进行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,所有在页面内容中包含了该关键词的网页都将作为搜索结果被搜出来。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度排列。按照工作原理的不同,可以把它们分为两个基本类别:全文搜索和分类目录。全文搜索引擎通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户。从搜索来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序,即爬虫程序,并自建网页数据库,搜索结果直接从自身的数据库中调用;另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果。分类目录则是通过人工的方式收集整理网站资料形成数据库的,比如雅虎中国以及国内的搜狐、新浪、网易分类目录。另外,在网上的一些导航站点,也可以归属为原始的分类目录。(三)搜索引擎技术发展长期以来,人们只是通过传统的媒体(如电视、报纸、杂志和广播等)获得信息。但随着计算机网络的发展,人们想要获取信息,已不再满足于传统媒体那种单方面传输和获取的方式,而希望有一种主观的选择性。现在,网络上提供各种类别的数据库系统,如文献期刊、产业信息、气象信息、论文检索等等。由于计算机网络的发展,信息的获取变得非常及时、迅速和便捷。到了1993年,WWW的技术有了突破性的进展,它解决了远程信息服务中的文字显示、数据连接以及图像传递的问题,使得WWW成为Internet上最为流行的信息传播方式。现在,Web服务器成为Internet上最大的计算机群,Web文档之多、链接的网络之广,令人难以想象。可以说,Web为Internet的普及迈出了开创性的一步,是近年来Internet上取得的最激动人心的成就。面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以从搜索出发到达自己想去的网上任何一个地方。搜索引擎技术伴随着WWW的发展是引人注目的。搜索引擎大约经历了三代的更新发展:第一代搜索引擎出现于1994年前后。以Altavista、Yahoo、Infoseek为代表,注重反馈结果的数量,主要特征是“求全”。它主要依靠人工分拣的分类目录搜索,通常由网页制作人自行建立网站名称、网站内容的文字摘要,并将其加入到搜索引擎的资料库中。搜索引擎根据用户键入的信息,根据预先设定的规则进行简单的匹配、排序和显示。这种方法只能进行简单的字符串匹配,无法进行全文搜索。研究表明,搜索引擎性能并没有想象中的那么优秀,在全球11个主要的搜索引擎中,搜索引擎仅能搜索到国际互联网上全部页面的16%,甚至更低,造成这种情况的原因,主要是这些搜索引擎没有及时更新资料。第二代搜索引擎,利用超链接分析为基础的机器抓取技术,由搜索引擎使用一个程序在网络上撷取资料,并自动将得到的结果存入索引库中。搜索引擎根据用户键入的信息进行匹配、排序和显示。这些引擎的主要特点是提高了查准率,可以用“求精”来描述它的优点,即不需要网站制作人单独键入供搜索的信息,并且从理论上讲,可将任意网站的所有网页加入到它的资料库中。第二代搜索引擎的大多数查询都会返回成千上万条信息,查询结果中无关信息太多,而且查询结果显示比较混乱,使用者仍然难以找到真正想要的资料。第三代搜索引擎是对第二代搜索引擎的改进,相对于前两代,其更注重智能化和用户使用的个性化,主要增加了互动性和个性化等高级的技术,采用了中文自动分类、自动聚类等人工智能技术,而且使用了中文内容分析技术以及区域智能识别技术,增强了搜索引擎的查询能力。同时,搜索技术将更加智能化,可搜索资源将更加广泛,搜索方式也将更加便捷有效,为用户使用搜索引擎获取信息获得更好的体验。三、网络爬虫知识储备(一)深入学习URLURI通常由三部分组成(1)访问资源的命名机制;(2)存放资源的主机名;(3)资源自身的名称,由路径表示。如URL是URI的一个子集。它是Uniform Resource Locator 的缩写,译为“统一资源定位符”。也可以说URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL 可以用一种统一的格式来描述各种信 息资源,包括文件、服务器的地址和目录等。URL 的格式由三部分组成:第一部分是协议(或称为服务方式);第二部分是存有该资源的主机IP 地址(有时也包括端口号);第三部分是主机资源的具体地址,如目录和文件名等。第一部分和第二部分用“:/”符号隔开,第二部分和第三部分用“/”符号隔开,第一部分和第二部分是不可缺少的,第三部分有时可以省略。 HTTP协议的URL:使用超级文本传输协议HTTP,提供超级文本信息服务的资源。 其计算机域名为。超级文本文件(文件类型为.html)是在目录 /channel 下的welcome.htm。 其计算机域名为。超级文本文件(文件类型为.html)是在目录/talk 下的talk1.htm。文件的URL:用URL 表示文件时,服务器方式用file 表示,后面要有主机IP 地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。file:/ 代表存放在主机 上的pub/files/目录下的一个文件,文件名是foobar.txt。file:/ 代表主机 上的目录/pub。file:/ 代表主机 的根目录。爬虫最主要的处理对象就是URL,它根据URL 地址取得所需要的文件内容,然后对它进行进一步的处理。(二)指定URL获取网页 根据给定的URL 来抓取网页。所谓网页抓取,就是把URL 地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟IE 浏览器的功能,把URL 作为HTTP 请求的内容发送到服务器端,然后读取服务器端的响应资源。Java 语言是为网络而生的编程语言,它把网络资源看成是一种文件,它对网络资源的访问和对本地文件的访问一样方便。它把请求和响应封装为流。因此我们可以根据相应内容,获得响应流,之后从流中按字节读取数据。例如,.URL 类可以对相应的Web服务器发出请求并且获得响应文档。.URL 类有一个默认的构造函数,使用URL 地址作为参数,构造URL 对象: URL pageURL = new URL(path),接着可以通过获得的URL 对象来取得网络流,进而像操作本地文件一样来操作网络资源:接着,可以通过获得的URL 对象来取得网络流,进而像操作本地文件一样来操作网络资源: InputStream stream = pageURL.openStream()。在实际的项目中,网络环境比较复杂,因此,只用 包中的API 来模拟IE 客户端的工作,代码量非常大。需要处理HTTP 返回的状态码,设置HTTP 代理,处理HTTPS协议等工作。为了便于应用程序的开发,实际开发时常常使用Apache 的HTTP 客户端开源项目HttpClient。它完全能够处理HTTP 连接中的各种问题,使用起来非常方便。只需在项目中引入HttpClient.jar 包,就可以模拟IE 来获取网页内容。本设计中还是采用前者。(三)爬虫策略1、宽度优先搜索在实际项目中,则使用爬虫程序遍历互联网,把网络中相关的网页全部抓取过来,这也体现了爬虫程序“爬”的概念。爬虫程序是如何遍历互联网,把网页全部抓取下来的。互联网可以看成一个超级大的“图”,而每个页面可以看作是一个“节点”。页面中的链接可以看成是图的“有向边”。因此,能够通过图的遍历的方式对互联网这个超级大“图”进行访问。图的遍历通常可分为宽度优先遍历和 深度优先遍历两种方式。但是深度优先遍历可能会在深度上过“深”地遍历或者陷入“黑洞”,大多数爬虫都不采用这种方式。图的宽度优先遍历:图的宽度优先遍历(BFS)算法是一个分层搜索的过程,和树的层序遍历算法相同。在图中选中一个节点,作为起始节点,然后按照层次遍历的方式,一层一层地进行访问。图的宽度优先遍历需要一个队列作为保存当前节点的子节点的数据结构。具体的算法如下所示:(1) 顶点V 入队列。(2) 当队列非空时继续执行,否则算法为空。(3) 出队列,获得队头节点V,访问顶点V 并标记V 已经被访问。(4) 查找顶点V 的第一个邻接顶点col。(5) 若V 的邻接顶点col 未被访问过,则col 进队列。(6) 继续查找V 的其他邻接顶点col,转到步骤(5),若V 的所有邻接顶点都已经被访问过,则转到步骤(2)。把互联网看成一个“超图”,则对这张图也可以采用宽度优先遍历的方式进行访问。宽度优先遍历互联网:宽度优先遍历是从一个种子节点开始的。而实际的爬虫项目是从一系列的种子链接开始的。所谓种子链接,就好比宽度优先遍历中的种子节点一样。实际的爬虫项目中种子链接可以有多个,而宽度优先遍历中的种子节点只有一个。比如,指定 种子链接,如何定义一个链接的子节点。每个链接对应一个HTML 页面或者其他文件(word、excel、pdf、jpg 等),在这些文件中,只有HTML 页面有相应的“子节点”,这些“子节点”就是HTML 页面上对应的超链接。如页面中,“招聘”、“网址”、“更多”以及页面下方的“搜索产品”、“技术文档”、“成功案例”、“新闻”、“联系我们”、“关于我们”、“ENGLISH”等都是种子的子节点。这些子节点本身又是一个链接。对于非HTML 文档,比如Excel 文件等,不能从中提取超链接,因此,可以看作是图的“终端”节点。整个的宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的“子节点”(也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放入一张表(通常称为Visited 表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于Visited 表中。如果存在,证明链接已经处理过,跳过,不做处理,否则进行下一步处理。 Todo表Todo表解析URL初始URL图3-1宽度优先爬虫过程初始的URL 地址是爬虫系统中提供的种子URL(一般在系统的配置文件中指定)。当解析这些种子URL 所表示的网页时,会产生新的URL(比如从页面中的<a href= “”中提取出 这个链接)。然后进行以下工作:(1) 把解析出的链接和Visited 表中的链接进行比较,若Visited 表中不存在此链接,表示其未被访问过。(2) 把链接放入TODO 表中。(3) 处理完毕后,再次从TODO 表中取得一条链接,直接放入Visited 表中。(4) 针对这个链接所表示的网页,继续上述过程。如此循环往复。宽度优先遍历是爬虫中使用最广泛的一种爬虫策略,之所以使用宽度优先搜索策略,主要原因有两点:(1)重要的网页往往离种子比较近,例如我们打开新闻网站的时候往往是最热的新闻,随着不断的深入冲浪,所看到的网页的重要性越来越低;(2)万维网的实际深度最多能达到17 层,但到达某个网页总存在一条很短的路径。而宽度优先遍历会以最快的速度到达这个网页。2、深度优先搜索深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的顶点,如果它还有以此为起点而未探测到的边,就沿此边继续下去。当结点v 的所有边都己被探寻过,搜索将回溯到发现结点v 有那条边的始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被发现为止。深度优先在很多情况下会导致爬虫的陷入( trapped )问题,所以它既不是完备的,也不是最优的。(四)爬取链接网络爬虫主要用途就是爬取链接。正则表达式,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的多个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。一个正则表达式通常被称为一个模式( pattern ),为用来描述或匹配一系列符合某个句法规则的字符串。例如,(1)替换|:数值分隔符代表替换。例如“gray|grey”可以匹配grey或gray;(2)数量限定:某个字符后的数量限定服用来先顶前面这个字符允许出现的个数。最常见的数量限定符包括“+”、“?”和“*”(不加数量限定则代表出现一次且仅出现一次);+:加号代表前面的字符必须至少出现一次。例如,“goo+gle”可匹配google,gooogle,goooogle等;?:问号代表前面的字符最多只可以出现一次。例如,“colou?r”可以匹配colour或color;*:星号代表前面的字符可以不出现,也可以出现一次或者多次。():可以用来定义操作符的范围和优先度。四、相关技术(一)WEB访问过程Web的应用层协议HTTP是Web的核心。HTTP在Web的客户程序和服务器程序中得以实现。运行在不同端系统上的客户程序和服务器程序通过交换HTTP消息彼此交流。HTTP定义这些消息的结构以及客户和服务器如何交换这些消息。HTTP定义Web客户(即浏览器)如何从web服务器请求Web页面,以及服务器如何把Web页面传送给客户。下图展示了这种请求响应行为。当用户请求一个Web页面(譬如说点击某个超链接)时,浏览器把请求该页面中各个对象的HTTP请求消息发送给服务器。服务器收到请求后,以运送含有这些对象HTTP响应消息作为响应。到1997年底,基本上所有的浏览器和Web服务器软件都实现了在RFC 1945中定义的HTTP/1.0版本。1998年初,一些Web服务器软件和浏览器软件开始实现在RFC 2616中定义的HTTP/1.1版本。H1TP/1.1与HTTP/1.0后向兼容,运行1.1版本的web服务器可以与运行1.0版本的浏览器“对话”,运行1.1版本的浏览器也可以与运行1.0版本的Web服务器“对话”。运行Explorer的PC机运行NCSA Web服务器软件的服务器运行Navigator的Mac机HTTP请求HTTP响应HTTP请求HTTP响应图4-1web访问过程HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的“门”。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务,这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。我们可从中看到分层网络体系结构的一个明显优势HTTP不必担心数据会丢失,也无需关心TCP如何从数据的丢失和错序中恢复出来的细节。这些是TCP和协议栈中更低协议层的任务。TCP还使用一个拥塞控制机制。该机制迫使每个新的TCP连接一开始以相对缓慢的速率传输数据,然而只要网络不拥塞,每个连接可以迅速上升到相对较高的速率。这个慢速传输的初始阶段称为缓启动(slow start)。需要注意的是,在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象。相反,服务器重新发送这个对象,因为它已经彻底忘记早先做过什么。既然HTTP服务器不维护客户的状态信息,于是说HTTP是一个无状态的协议(stateless protocol)。HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。HTTP遵循请求(Request)/应答(Response)模型。Web浏览器向Web服务器发送请求,Web服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。HTTP使用内容类型,是指Web服务器向Web浏览器返回的文件都有与之相关的类型。所有这些类型在MIME Internet邮件协议上模型化,即Web服务器告诉Web浏览器该文件所具有的种类,是HTML文档、GIF格式图像、声音文件还是独立的应用程序。大多数Web浏览器都拥有一系列的可配置的辅助应用程序,它们告诉浏览器应该如何处理Web服务器发送过来的各种内容类型。Web服务器客户端发送请求返回服务端响应静态Html页面Servlet引擎执行对应程序转发请求返回结果图4-2动态web页面工作原理(二)JAVA技术Java是由Sun Microsystems公司所开发的一个高级程序语言,它的原名叫做OAK,是专门为小型的周边设备所设计的语言(现在这个部分已经变成Java Micro Edition),OAK在推出之后,并没有获得大家的重视,所以在1995年Sun公司就把它改名为Java,并把设计的目标订在互联网络的环境里。在做了这样大的突破后,Java顺利的成为了用户人数成长最快的语言。Java的核心可以分为两个部分,一个是Java平台,而另一个是Java语言。Sun和其他的公司都有为不同的硬件推出Java平台,也就是Java Virtual Machine(Java虚拟机),这些虚拟机忽略了各个平台的差异,让程序开发人员可以用同样的Java程序在完全不同的环境下执行,甚至会按照平台的不同显示不同的输出。例如你可以在Linux上执行为Linux量身定做的虚拟机,然后执行在Windows环境下所开发的Java程序,让用户可以通过浏览器来执行这些程序,最后这些程序又可以安装在可移动设备中。(三)网络编程 包中的类和接口提供了可用于低层和高层网络编程的 API。低层 API 可以让你直接访问网络协议,但是为此你不得不使用低层的 TCP 套接字和 UDP 数据包。高层的API(如 URL、URLConnection 和 httpURLConnection 等类)可以使你更快的开发网络应用,却不需要写很多代码。 包中含有高层 API。它们实现了一些最常用的基于 TCP 的协议,如 HTTP 和 FTP 等。其中两个主要的类是 URL 和 URLConnection。另一个有用的类是 HttpURLConnection,它是 URLConnection 的子类,支持 HTTP 的特性。URL (Uniform Resource Locator,统一资源定位器)是一个描述 Internet 中文档 (或者其它常见的资源) 位置的地址。URL 的样子就像这样:protocol:/machineName:port/resource,它支持 FTP、HTTPS 和 FILE 协议。要从 URL 读取内容,可以用 URL 类非常容易的实现。用这种方法读取的内容不包含服务器回应的头信息,所以不需要去解析它们。URL 类会解析输入的 URL 并处理低层的麻烦的工作。(四)HTML知识因为Web中的信息都是建立在HTML协议之上的,所以网络机器人在检索网页时的第一个问题就是如何解析HTML。当今的 Internet 上面有数亿记的网页,越来越多应用程序将这些网页作为分析和处理的数据对象。这些网页多为半结构化的文本,有着大量的标签和嵌套的结构。当我们自己开发一 些处理网页的应用程序时,会想到要开发一个单独的网页解析器,这一部分的工作必定需要付出相当的精力和时间。事实上,做为 JAVA 应用程序开发者, HtmlParser 为其提供了强大而灵活易用的开源类库,大大节省了写一个网页解析器的开销。它提供了线性和嵌套两种方式来解析网页,主要用于 html 网页的转换(Transformation) 以及网页内容的抽取 (Extraction)。 本文中利用字符串匹配提取网页里的链接,实现简易爬虫里的关键部分。HTML中的几种数据:文本,除了脚本和标签之外的所有数据;注释,程序员留下的说明文字,对用户是不可见的;简单标签,由单个表示的HTML标签;开始标签和结束标签,用来控制所包含的HTML代码。在进行解析的时候不用关心所有的标签,只需要对其中几种重要的进行解析即可。超连接标签:超连接定义了WWW通过Internet链接文档的功能。他们的主要目的是使用户能够任意迁移到新的页面,这正是网络机器人最关心的标签。图像映射标签:图像映射是另一种非常重要的标签。它可以让用户通过点击图片来迁移到新的页面中。表单标签:表单是Web页面中可以输入数据的单元。许多站点让用户填写数据然后通过点击按钮来提交内容,这就是表单的典型应用。表格标签:表格是HTML的构成部分,通常用来格式化存放、显示数据。五、需求分析(一)同步环境图5-1系统的同步环境检索服务器通过Internet检索Web页面。(二)功能需求本设计要实现的功能:(1)能够对Internet上的网页内容、标题、链接等信息按链式收集(2)能够实现一定链接深度的网页收集,也就是在Internet上实现一定的URL级的数据收录。(三)性能需求本设计性能需求:(1)精度,对收集到的信息需要一定的完整性,并写入收集的存储区里,对搜索出的内容需要包含有关键字信息(2)网络不够快,对于这个性能瓶颈,我们可以通过使用更快的宽带,比如100Mb共享,而不使用一般的拨号上网。另外还可以通过增加程序的线程来提高性能。(四)输入输出要求本设计输入输出要求:(1)输入,搜索的关键字(2)处理,查询(3)输出,Web页面上显示搜索信息。(五)运行需求本设计运行需求:(1)硬件环境需求,Internet网络连接(2)软件环境,该系统使用Java语言开发,要求JDK、eclipse,操作系统,window xp 、linux。六、概要设计(一)可行性论述对于网络上的资源,这些都是免费发布的,该设计获取我们能看到的东西,也就是所见所得,发布抓取下来的信息,这样可以帮助用户找到他们想要的信息。对于技术上来说,通过发送请求获取到目标服务器上的所有数据,技术上基本可以实现。对于该项目,资本很少,基本就是自己开发一个系统,所以对于经济是可行的。(二)系统设计方案(1) 指定初始URL并加入到URL等待队列。(2) 创建爬虫线程,启动爬虫线程。(3) 爬虫从URL等待队列中取得任务URL。然后根据URL下载网页,然后解析网页,获取超链接URLs。如果获取到的URL为相对地址,需要转换为绝对地址,然后淘汰站外URLs,错误URLs或者不能解析的URL地址。再判断这些URL是否已经被下载到,如果没有则加入到URL等待队列。(4) 继续执行步骤(3),直到结束条件停止。(5) 信息输出。(三)各功能划分crawl():爬虫线程启动。crawlAction():具体构架爬虫过程。downloadPage():用来下载 url 所指向的网页。retrieveLinks():用来抽取出网页中的链接,同时对抽取的链接进行过滤。去除不合格url,对合格url规格化。isRobotAllowed():读robot.txt,检测robot是否允许访问给出的URL。writePage():创建信息输出文件。(四)主要存储结构HashSet toCrawlList:用来保存待爬取的 url HashSet crawledList:用来保存已经访问的 url七、详细设计(一)爬虫实现 开始获取URL提取链接加入队列队列空否否结束 图7-1爬虫工作流程实现线程在java中有两种方法:一种是直接继承Thread类;一种是实现Runnable接口。第二种方法这个类中必须要实现重写run()这个方法。private void crawl(final String logFile,final String startUrl,final int maxUrls)Thread thread = new Thread(new Runnable()public void run() crawling = true; crawlAction(startUrl,maxUrls); crawling = false; crawlingLabel2.setText("完成"););thread.start();try Thread.sleep(2000); catch(Exception e) /具体爬行代码private void crawlAction(String startUrl,int maxUrls)/建立url队列/加入初始urlString urlActionTime = getTimeStamp();addResult(urlActionTime,"添加到队列",startUrl);int i = 0;while(crawling && toCrawlList.size() > 0)if(maxUrls != -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();addResult(verifiedUrlActionTime,"校验",url);if(!isRobotAllowed(verifiedUrl)continue;updateStats(url,crawledList.size(),toCrawlList.size(),maxUrls,notHostLink.s ize(),gt30kbList.size();/Add page to the crawled listcrawledList.add(url);/Download the page at the given UrlString pageContents = downloadPage(verifiedUrl);String processUrlActionTime = getTimeStamp();addResult(processUrlActionTime,"处理",url);writePage(pageContents,verifiedUrl,Integer.toString(i);i+;/若成功下载调用获取连接函数if(pageContents != null && pageContents.length()>0)if(!allowFollow(pageContents,verifiedUrl)continue;ArrayList links=retrieveLinks(verifiedUrl,pageContents,crawledList,notHostLink,gt20kbList);/添加链接toCrawlList.addAll(links);该方法里定义了一个循环,这个线程会重复地执行爬虫动作。在这个循环里,首先会向URL等待队列里请求一个URL。因为URL队列会出现为空的情况。while(crawling && toCrawlList.size() > 0)/从队列中取出链接 String url = null;if(toCrawlList.iterator().hasNext()tryurl = (String)toCrawlList.iterator().next();catch(ClassCastException e) /下载页面返回html内容 /爬取页面链接返回links /添加到links如果没有得到URL就继续向URL等待队列申请。当得到任务URL以后,会通过这个URL得到对应的HTML代码。具体方法是调用downloadPage(URL pageUrl)这个方法。(二)获取网页实现private String downloadPage(URL pageUrl) try BufferedReader reader = new BufferedReader(new InputStreamReader(pageUrl.openStream();String line;StringBuffer pageBuffer = new StringBuffer();while(line=reader.readLine()!= null)pageBuffer.append(line);return pageBuffer.toString();catch(Exception e)return null;这个方法是通过调用JAVA里面的URL这个类,可以用给定的URL构造这个类的一个实例,然后通过openStream()这个方法得到HTML代码的数据流,然后再一行一行地把数据流转换成String字符串,再用StringBuffer将这些字符串拼接成一个完整的HTML代码。(三)解析html实现从HTML代码中提取URLs,一种方法是通过检索字符串中的href字符串来实现的。对于一个HTML代码,寻找其中的href=字符串,然后记录它的下标i判断下标i+1位置上的字符是双引号,单引号或者两者皆不是,然后选择对应的字符作为截取URL的终止标记。截取过后的href标记就剔除它与它前面的部分,以便而后的操作可以继续检索href标记,直到正个HTML代码中所有的href标记都被解析过后,操作终止。<a href="" class="focu">首页</a><a href= movie_2012/mlist/1_1.html target=_self>内陆片</a><a href=movie_2012/mlist/2_1.html target=_self>港台片</a><a href=movie_2012/mlist/3_1.html >日韩片</a>例如上面那段HTML代码。先检索href=标记,然后判断出第i+1位为一个双引号,所以可以截取i+1位到第2个双引号的位置。之间的这段字符串即为URL。当完成这一步操作后,原字符串被截取从“ class=”开始。继续检索href=标签,判断它的第i+1位为一个单引号,所以又截取i+1位到第2个单引号的位置。这步以后原字符串又被截取为“target=”开始,可以继续检索href=标签。这个地方href=没有接续任何符号,所以当没有发现单引号或双引号的时候,可以判断为这种情况。就去检索空格和<标签,以下标较小的字符作为截取URL的结束标记。下面是href=后面接续双引号情况的JAVA代码,其他情况的代码方式相同。public void getHref_UrlsList(String html_text, String fromURL,UrlQueueManager urlQueueManager, int index) / 站内URL队列List<String> linklist = new ArrayList<String>();String url = ""/ HTML中是否还含有href标签boolean haveHref = html_text.contains("href");while (haveHref) html_text = html_text.substring(html_text.indexOf("href=") + 5); / 当 href= 后以 " 开头的情况if ('"' = html_text.charAt(0) html_text = html_text.substring(1);url = html_text.substring(0, html_text.indexOf(""");url = addURLhost(fromURL, url);if (isSiteInsideUrl(url, urlQueueManager) if (!urlQueueManager.isContainUrl(url) linklist.add(url); haveHref = html_text.contains("href"); urlQueueManager.waitQueueAdd(linklist); 在每个URL被截取出来之后,需要判断这些URL是相对地址,还是绝对地址。如果截取出来的URL为./mlist/1_1.html这种形式,即为相对地址。需要将其转化为绝对地址。根据相对地址的概念,./为返回上一层,所以可以得到这个相对地址的绝对地址,如果它包含完整的协议信息,域名地址。可以判断它为绝对地址。相对地址与绝对地址的处理:if(link.indexOf(":/")=-1)/处理绝对地址if(link.startsWith("./")link="http:/"+pageUrl.getHost()+"/"+pageUrl.getFile()+"/"+link.substring(2, link.length();else if(link.startsWith("./")link = "http:/"+pageUrl.getHost()+"/"+link.substring(3,link.length();elseString file = pageUrl.getFile();if(file.indexOf('/')=-1)link = "http:/"+pageUrl.getHost() +"/"+link;elseString path = file.substring(0, file.lastIndexOf('/')+1);link = "http:/"+pageUrl.getHost()+path+link;当得到这些完整的URL地址以后,需要对其进行过滤。很多URL它们指向的文件不是HTML文件,而是一些CSS文件,或者RAR包文件,或者只是接续“#”符号,代表只是调用一段javascript代码。像这种情况就直接抛弃这些URLs。下面一段代码通过检索URL字符串中是否包含".css"、".rar"、".zip"这些后缀来进行判断。

注意事项

本文(基于JAVA的搜索引擎设计与实现本科毕业论文(设计)毕业设计(论文)word格式)为本站会员(无***)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!