




免费预览已结束,剩余30页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕 业 论 文注:由于本网站上传不了源代码,而且这个论文是本人花了半年做的,被评为学校优秀设计,所以下载了我的论文的朋友需要源代码的发邮件到我的邮箱索取基于L的全文搜索 摘 要网络爬虫,又叫网络蜘蛛,是一种采集互联网信息和提供搜索服务的系统。本设计实现的网络爬虫基于Lucene.NET平台开发,可以对特定的网页进行抓取和分析,提取如网页标题、网页内容、网页描述等有用信息,并对抓取的数据进行索引,存储到服务器硬盘,同时过滤掉一些如html标签、javascript代码等无用信息。在前台提供给用户友好的搜索界面,通过搜索引擎对索引文件进行查询,尽可能高效的、准确的为用户提供信息。关键词:网络爬虫 Lucene.NET 搜索引擎目 录1.前言62 相关技术介绍72.1 Lucene72.1.1 L概述72.1.2 L的特点72.1.3 L索引的建立82.1.4 L的搜索82.2 Visual Studio 200882.2.1 Visual Studio 2008简介82.2.2 Visual Studio 2008的新特性92.2.3 Linq 简介92.3 多线程92.3.1 同步线程92.3.2 多线程与并发管理102.4 反射103 方案论证103.1 系统方案103.2 开发与设计工具选择113.2.1 开发工具113.2.2 硬件要求114 系统总体设计124.1 需求分析124.1.1 功能需求124.1.2 性能需求124.1.3 数据管理能力要求134.1.4 故障处理要求134.1.5 用例分析与用例图134.2 系统规划144.2.1 系统物理架构144.2.2 系统逻辑架构154.2.3 系统数据库设计164.2.4 系统模块设计184.3 系统设计194.3.1 爬虫程序设计194.3.2 程序分层设计274.3.3 前台搜索设计295 系统实现315.1 系统与环境配置315.2 系统实现315.2.1 初始化爬虫设置315.2.2 爬虫索引管理326 系统测试和部署336.1 系统测试336.2 系统部署336.2.1 系统要求336.2.2 程序部署347 结论35参 考 文 献36Abstract37致 谢38仲恺农业工程学院毕业论文(设计)成绩评定表39II1.前言在互联网发展的最初阶段,网站的数量相对较少,信息查询比较容易。随着互联网的迅猛发展,用户很难找到所需的资料。这时,对搜索引擎的需求就出现了,一些为满足大众信息搜索需求的专业搜索网站也应运而生。搜索,这两个字无疑是当今互联网业界最为流行的字眼之一。在这样的背景下,搜索引擎的技术迅速发展。Google的巨大成功让整个世界都把眼光投入到搜索引擎这个领域间。同时,伴随着Web 2.0 的普及,网络信息的膨胀速度呈指数急速增长,各种各样的网站都需要为其加入检索功能,以满足用户的需要。另外,在企业级应用的市场上,全文信息检索的需求也一直在增加,各种文档处理、内容管理软件都需要加入全文检索的功能。搜索引擎是专门提供信息查询的网站。它们大都是通过对互联网上的网站进行检索,从中提取相关的信息,从而建立起庞大的数据库。用户可以很方便的通过输入一定的文字,查找任何所需要的资料,其中当然也包括各种商业信息。搜索引擎是网站建设中针对用户使用网站的便利性所提供的必要功能,同时也是研究网站用户行为的一个有效工具。高效的站内检索可以让用户快速准确地找到目标信息,从而更有效地促进产品/服务的销售,而且通过对网站访问者搜索行为的深度分析,对于进一步制定更为有效的网络营销策略具有重要价值1。因此,对于内容丰富的大型信息类网站和产品线丰富的在线销售型网站来说,提供一般性的全文检索是远远不够的,很有必要开发能够实现个性化需求的高级搜索功能,这也是体现网站的网络营销功能的重要方面。不过,搜索引擎技术并非是一种大众技术。居于对搜索引擎神秘性的好奇,以及搜索引擎的当前发展背景,毕业设计导师的指导,本人根据对L的了解,决定开发一个轻量级搜索引擎,以满足简单全文搜索需求。本论文主要实现一个简单网页爬虫程序以及搜索程序。网页爬虫程序从某个网站节点开始,采用广度遍历的方式,运用多线程机制,爬取网页信息,在爬取网页的同时,网页爬虫程序同时对已爬取数据进行分析,提取有用文字信息,并对这些信息建立索引。用户可为爬虫定义一些简单规则,让爬虫只爬取特定的网页。爬虫也可为特定网站添加关键字,当用户搜索该关键字时,该网站将会优先显示。搜索程序提供简单但又实用的界面,用户不用做过多的思考便能使用该搜索程序,体现网页设计KISS原则(即懒人原则)。322 相关技术介绍2.1 LuceneLucene是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能. Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,你就为你的应用实现全文检索的功能.不过千万别以为Lucene是一个像google那样的搜索引擎,Lucene甚至不是一个应用程序,它仅仅是一个工具,一个Library.你也可以把它理解为一个将索引,搜索功能封装的很好的一套简单易用的API.利用这套API你可以做很多有关搜索的事情,而且很方便。Lucene的创新之处:大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率2。2.1.1 L概述L是一个高性能的全文检索引擎,而且免费、开源,几乎适合于任何需要全文检索的应用,尤其是跨平台的应用,它由Java下的Lucene移植而来,在Java平台已经得到了广泛的应用。2.1.2 L的特点 L具有以下特点:索引:将数据源中的数据都通过全文索引一一建立反向索引。匹配效果:通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。 匹配度:有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。结果输出:通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。 可定制性:通过不同的语言分析接口实现,可以方便的定制出符合应用需要的索引规则(包括对中文的支持)。结论:高负载的模糊查询应用,需要负责的模糊查询的规则,索引的资料量比较大。2.1.3 L索引的建立 为了实现快速的搜索,Lucene会首先将需要处理的数据以一种称为倒排索引(Inverted Index,现有的Web搜索引擎如Google、百度的核心也是使用倒排索引技术)的数据结构进行存储。怎样理解倒排索引呢?简单的说,倒排索引并不是回答“这个文档中包含哪些单词?”这个问题,而是经过优化以后用来快速回答“哪些文档包含词XX?”这个问题。就像需要给书籍整理一份供快速查找的目录一样,Lucene也得为需要被搜索的数据整理优化出一份索引文件(Index file),而这个过程称之为“索引”(Indexing)3。2.1.4 L的搜索Lucene面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而起只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回,这里可以比较一下数据库检索:如果是一个10,000条的数据库检索结果集,数据库是一定要把所有记录内容都取得以后再开始返回给应用结果集的。所以即使检索匹配总数很多,Lucene的结果集占用的内存空间也不会很多。对于一般的模糊检索应用是用不到这么多的结果的,头100条已经可以满足90%以上的检索需求。如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个上次的搜索缓存数大1倍的缓存,并再重新向后抓取。所以如果构造一个Searcher去查1120条结果,Searcher其实是进行了2次搜索过程:头100条取完后,缓存结果用完,Searcher重新检索再构造一个200条的结果缓存,依此类推,400条缓存,800条缓存。由于每次Searcher对象消失后,这些缓存也访问那不到了,你有可能想将结果记录缓存下来,缓存数尽量保证在100以下以充分利用首次的结果缓存,不让Lucene浪费多次检索,而且可以分级进行结果缓存。2.2 Visual Studio 20082.2.1 Visual Studio 2008简介使用.NET框架进行应用程序开发的最好的工具莫过于Visual Studio 2008,Visual Studio系列产品被认为是世界上最好的开发环境之一。使用Visual Studio 2008能够快速构建ASP.NET应用程序并为ASP.NET应用程序提供所需要的类库、控件和智能提示等支持。Visual Studio 2008是一组综合工具,可帮助开发人员更快地实现构想。Visual Studio 2008可为面向 Web(包括 ASP.NET AJAX)、Windows Server 2008、2007 Microsoft Office system、SQL Server 2008 和 Windows Mobile 设备的项目开发提供支持。2.2.2 Visual Studio 2008的新特性Visual Studio 2008的新特性,其包括.NET Framework 对重定向的支持;ASP.NET AJAX和JavaScript智能客户端支持;全新的Web开发新体验:Web设计器提供了分割视图编辑、嵌套母板页、以及强大的CSS编辑器集成;编程语言方面的改进和LINQ;浏览.NET Framework库源码;智能部署ClickOnce;.NET Framework 3.5 增强功能;集成对Office (VSTO)和Sharepoint 2007开发的支持;在Windows Server 2008, Windows Vista 和Microsoft Office 2007下最好的开发工具集;单元测试功能,所有的Visual Studio专业版本都支持单元测试功能等等4。2.2.3 Linq 简介LINQ,语言级集成查询(Language INtegrated Query)经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。其中两个最主要访问的数据源与数据库( database )和 XML 相关。 LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ)5 。2.3 多线程在单线程应用程序中,所有的操作,不论它们的类型、持续时间、或优先级如何,都是在单一线程中执行的。这样的应用程序较易于设计和构建。所有的操作都是串行的:即,操作绝不会并发,而是一次运行一条命令。但是在很多情况下,在应用程序中采用多线程,可以提高应用程序的性能、吞吐量和可伸缩性,还可以改善用户和客户端的响应速度。2.3.1 同步线程尽管将多线程引入应用程序有很多益处,但它也打开了同步和并发管理问题的潘多拉之盒。使用多线程时,你需要关心线程在争夺同一资源时造成的死锁,必须采用步骤同步并发的多个线程对对象的访问,还需要准备处理方法的重入问题。2.3.2 多线程与并发管理 .NET Framework的CLR提供了三种方法来完成对共享资源 ,诸如全局变量域,特定的代码段,静态的和实例化的方法和域。(1) 代码域同步:使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段。不支持静态域的同步。在实例化的方法中,this指针用于同步;而在静态的方法中,类用于同步,这在后面会讲到。(2) 手工同步:使用不同的同步类(诸如WaitHandle, Mutex, ReaderWriterLock, ManualResetEvent, AutoResetEvent 和Interlocked等)创建自己的同步机制。这种同步方式要求你自己手动的为不同的域和方法同步,这种同步方式也可以用于进程间的同步和对共享资源的等待而造成的死锁解除。(3) 上下文同步:使用SynchronizationAttribute为ContextBoundObject对象创建简单的,自动的同步。这种同步方式仅用于实例化的方法和域的同步。所有在同一个上下文域的对象共享同一个锁。2.4 反射反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道6。 反射的作用:1可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。2应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。 3反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。3 方案论证3.1 系统方案可按设计进程任务描述,如下共9步:第一步:资料收集、了解搜索引擎基本技术、寻找切入点;第二步:搭建开发环境并简单测试开发环境的有无错误;第三步:组织系统框架,对系统进行分层设计;第四步:实现网络爬虫基本功能,完善爬虫对页面的分析能力以及对URL的提取能力,实现添加关键字功能;第五步:使用多线程机制,使爬取数据与索引数据同时工作,处理线程同步问题;第六步:根据索引目录,对索引文件进行优化;第七步:设计搜索前台页面,提供尽可能简单、高效的搜索界面;第八步:测试程序;第九步:完成毕业论文,这个最好边做毕业设计边完成。3.2 开发与设计工具选择3.2.1 开发工具(1)Microsoft Visual Studio 2008 Visual Studio 2008对Ajax的支持得到相当的增强,而且对安全、管理等配置都有加强,使用Visual Studio 2008能够快速构建ASP.NET应用程序并为ASP.NET应用程序提供所需要的类库、控件和智能提示等支持。(2)Microsoft SQL Server 2005 SQL Server 2005 是一个全面的数据库平台,使用集成的商业智能 (BI) 工具提供了企业级的数据管理。SQL Server 2005 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。(3)Macromedia Dreamweaver 8Macromedia Dreamweaver 8 是建立 Web 站点和应用程序的专业工具。它将可视布局工具、应用程序开发功能和代码编辑支持组合在一起,其功能强大,使得各个层次的开发人员和设计人员都能够快速创建界面吸引人的基于标准的网站和应用程序。(4)Photoshop CS4 使用该工具主要用于搜索前台logo设计。3.2.2 硬件要求由于爬虫程序爬取数据时,生成大量索引文件。对硬盘容量有较高要求,因此我为个人电脑添加多一320G硬盘,在容量方面足以满足索引文件的要求。而内存方面则有1.5G,因此亦足够开发要求。开发机器配置:CPU:AMD Athlon 3000+内存:DDR 400 1.5G硬盘:400G操作系统:Microsoft Windows XP Professional Service Pack 3运行平台:.Net Framework 3.54 系统总体设计4.1 需求分析需求分析是介于系统分析和软件设计阶段之间的桥梁。一方面,需求分析以系统规格说明和项目规划作为分析活动的基本出发点,并从软件角度对它们进行检查与调整;另一方面,需求规格说明又是软件设计、实现、测试直至维护的主要基础。良好的分析活动有助于避免或尽早剔除早期错误,从而提高软件生产率,降低开发成本,改进软件质量7。4.1.1 功能需求 根据本人对本系统最初的设想,综合考虑各方面因素,如:个人编程能力、资料内容、时间限制、硬件条件等,经过再三分析,对系统功能有如下需求:(1)爬虫系统初始化设置,用户必须为爬虫设置开始爬去数据的开始地址,爬取数据进程数,索引数据进程数,url规则。(2)爬虫系统可为特定URL添加关键字,当搜索到该关键字时,该URL将优先显示出来。(3)爬虫系统可设置访问深度,即,爬虫的垂直访问深度。(4)爬虫系统可支持停止或继续抓取数据。(5)爬虫系统可对已有索引文件进行优化索引,提高查询速度。(6)爬虫系统采取分层架构,各层分工明确,实现界面与逻辑分离,逻辑与数据访问分离。(7) 为用户提供简单、搞笑的搜索界面,尽可能准确的为用户提供数据。(8) 爬虫程序在爬取数据以及索引数据时候必须达到一定的速度。4.1.2 性能需求 根据需求分析中对该系统的基本要求,爬虫系统性能有以下需求:(1)采用多线程抓取网页数据,以提高效率。(2)采用多线程索引网页文字数据,以提高效率。(3)采用线程同步机制,抓取数据与索引数据同时进行。(4)控制爬虫内存占用,手动释放内存。4.1.3 数据管理能力要求系统在数据管理能力方面有以下需求:(1)用户可手动优化索引。(2)用户可进行关键字管理,可添加,删除,修改关键字。(3)使用DebugView捕获进行抓取数据的信息。4.1.4 故障处理要求 一个完善的系统必须有合理的异常处理机制,保障系统出错时系统管理员能够很快的定位到出错的位置,从而实现纠错。.net异常处理机制能够保障系统在遇到异常时仍能继续运行。因此,本系统中采用了一下故障处理:(1)使用.net异常处理机制,抛出异常。(2)使用DebugView 捕获异常信息。4.1.5 用例分析与用例图 根据系统需求分析,其用例图如图1所示:图 1 系统用例图4.2 系统规划4.2.1 系统物理架构该系统中主要分为两个部分组成:网页抓取子系统和用户搜索子系统。网页抓取子系统为Windows 窗体应用程序,用户搜索子系统为A Web 服务应用程序。本系统使用微软公司的IIS 6.0 作为WEB服务器,Microsoft SQL server 2005作为数据库服务器,组成系统的服务器端,向客户端(IE)提供服务。基本结构图如图2所示:图2 系统物理结构图爬虫程序通过互联网抓取数据并存储到索引文件服务器中,web用户通过web服务器访问索引文件服务器中的索引文件。4.2.2 系统逻辑架构该系统采用分层设计,代码清晰明了,可伸缩性以及可扩展性强。系统主要分为:BLL业务逻辑层,DAL数据访问层,Model数据库实体层,Common层。BLL业务逻辑层:该层主要实现数据抓取,接受用户搜索,页面分析等逻辑功能。DAL数据访问层:该层主要负责处理所有涉及数据库的操作。Model数据库实体层:该层主要为一些数据库实体层,每个数据库表对应一个实体类。Common层:该层主要包含一些常用类,如:线程管理,Html页面分析,URL处理等类。该系统逻辑架构图如图3所示:图3 系统逻辑架构图4.2.3 系统数据库设计本系统所有数据按照L特有索引文件格式存储到硬盘中。由于计算机存在少量也能够与数据处理,数据需要长期保留在外设上反复进行查询、修改、插入和删除等操作8。因此只将少量数据需要存储到数据库中,本系统采用Microsoft SQL Server 2005做数据库。以下是数据库设计: WaitForIndex等待索引内容表,该表主要存储爬虫程序停止后,在内存中未索引数据存进数据库中。表1 WaitForIndex等待索引内容表字段名数据类型长度可为空字段备注是否主键IDint否ID是URLChar1000是链接地址否TitleChar1000是网页标题否ContentsText是网页内容否Depthint是深度否DescriptionChar2000是网页描述否KeywordsChar2000是网页关键字否URLSText是该页面中所有链接否表2 WaitForCrawl等待抓取的链接表字段名数据类型长度可为空字段备注是否主键IDint否ID是URLChar1000是链接地址否Depthint是深度否表3 SysConfig系统配置表字段名数据类型长度可为空字段备注是否主键IDint否ID是StartURLChar100是开始链接地址否URLAcceptChar200是网页链接规则否Depthint是深度否CrawlThreadint是爬取数据的线程数否IndexThreadint是索引数据的线程数否表4 Keywords关键字表字段名数据类型长度可为空字段备注是否主键IDint否ID是CompanyNameChar2000是公司名否KeywordChar1000是关键字否ReferURLChar1000是公司URL否表5 FinishedURL已完成链接表字段名数据类型长度可为空字段备注是否主键IDint否ID是URLChar500是URL否CrawlTimeDateTime是抓取时间否4.2.4 系统模块设计经过需求分析阶段的工作,系统必须实现什么功能已经清楚了,现在的工作是决定如何实现了。总体设计的基本目的就是解决如何概要的描述解决这个问题的方法,因此,模块设计又称为该要是合计或初步设计9。系统总体的模块设计如图4所示:图4 系统模块图4.3 系统设计系统分为爬虫模块、索引模块以及搜索前台模块。系统利用多线程提高运行效率,系统运行时爬虫模块在抓取数据同时,索引模块也对已抓取数据进行处理。4.3.1 爬虫程序设计爬虫程序的数据流图: 爬虫程序模块主要维护着三个队列:待抓取URL队列,已完成URL队列,待索引队列。首先爬虫程序从起始地址开始,抓取该地址内容,然后交给索引程序分析页面,将已分析出的URL插入待抓取URL队列,将已分析完的URL放至已完成队列,如图5所示:图5 系统数据流图 系统流程图如图6所示:图6 系统流程图程序主界面主要设置开始地址,抓取数据线程数,索引线程数,访问深度,链接规则等。其中:开始地址、抓数据线程数、索引线程数、访问深度为必填项。爬虫程序主界面如图7所示:图7 爬虫程序主界面 用户可为系统添加某些关键字,从而使爬虫在索引数据时,对含有关键字的页面设置更高的权限,如图8所示:图8 添加关键字界面关键代码: private void Start_Click(object sender, EventArgs e) /初始化 /启动抓包线程 URLQueue finishedURL = new URLQueue(); if (string.IsNullOrEmpty(ReferUrl) & Depth = 0) crawler = new Crawler(urlQueue, contentQueue, finishedURL); if(Depth 0 & !string.IsNullOrEmpty(ReferUrl) crawler = new Crawler(urlQueue, contentQueue, finishedURL, ReferUrl, Depth); if (Depth 0 & string.IsNullOrEmpty(ReferUrl) crawler = new Crawler(urlQueue, contentQueue, finishedURL, Depth); /启动抓取数据 threadmanager = new ThreadManager(GetPageThreadCount); threadmanager.FucHandler += new ThreadFucHandler(crawler.StartCrawler); threadmanager.Start(); /启动索引线程 indexPage = new IndexPage(contentQueue, urlQueue, IndexThread,finishedURL); tdmanager = new ThreadManager(IndexThread); tdmanager.FucHandler +=new ThreadFucHandler(indexPage.StartIndex); tdmanager.Start(); / / 停止抓取数据 / private void button1_Click(object sender, EventArgs e) Thread.Sleep(1000); threadmanager.Stop(); crawler.StopCrawler(); tdmanager.Stop(); indexPage.Stop(); List listconfig = sysDAL.GetList( 1=1 ); try SysConfig config = null; if(listconfig.Count 0) config = listconfig.Take(1).ToList()0; if (config != null) config.CrawlThread = int.Parse(ThreadCount.Text); config.IndexThread = int.Parse(IndexThreadCount.Text); config.URLAccept = URLAccept.Text.Trim(); config.Depth = Depth; sysDAL.Update(config); else SysConfig sys = new SysConfig(); sys.StartURL = startUrl; sys.IndexThread = IndexThread; sys.CrawlThread = GetPageThreadCount; sys.URLAccept = ReferUrl.Trim(); sys.Depth = Depth; sysDAL.Add(sys); catch (Exception ex) System.Diagnostics.Trace.WriteLine(ex.Message); / / 优化并合并索引 / private void OptimizeIndex_Click(object sender, EventArgs e) IndexPage.MergeDire(); MessageBox.Show(Success); /添加关键字 private void AddKeyWords_Click(object sender, EventArgs e) KeyWords keywords = new KeyWords(); keywords.Show(); 抓取数据模块:该模块主要是由BLL层中的Crawl类中的StartCrawler()方法实现,其中,Crawl类结构如图9所示:图9 Crawl类该类中的核心算法StartCrawler主要是对URLQueue进行出列,Pop出一个URL,然后抓取该URL的数据,将抓取的数据Push到contentQueue中,其中,URLQueue类结构图如图10所示:图10 URLQueue类StartCrawler方法主要是对该类进行Pop 以及Push 操作,当URLQueue长度大于10000条数据时,则将其插入至数据库,其程序流程图如图11所示:图11 StartCrawler程序流程图索引数据模块:该模块主要是由BLL层中的IndexPage类中的StartIndex()方法实现,该方法除了索引网页内容外,同时还对已抓取网页进行分析,提取网页中的URL,标题,关键字,描述等信息。该类主要是对URLQueue和ContentQueue进行操作,类结构如图12所示:图12 IndexPage类其中,该类的核心算法StartIndex的程序流程图如图13所示,当contentQueue中元素大于5000条时则插入数据库。图13 StartIndex程序流程图4.3.2 程序分层设计系统进行分层设计的优点是分离数据,逻辑,以及界面,以至修改一个层不会影响另一个层,像逻辑层比较稳定,界面层可能会经常修改,这样就非常有好处10。该系统主要分为:界面层(包括:web界面,WinForm界面)、BLL业务逻辑层、DAL数据访问层、Common常用类、Model数据库实体层,如图14所示:图14 系统分层BLL业务逻辑层,主要处理业务逻辑,其中包括一些逻辑类、爬虫类、索引类、搜索类等其中项目结构图如图15所示:图15 BLL业务逻辑层DAL数据访问层,该层通过使用.net中的反射机制实现ORM对象关系模型,底层对数据库访问基类为BaseDAL类,该类使用.net中的泛型,类似于C+中的模板机制,从而使得该类可以接受任意类型的数据库实体类。该项目中对应Model层中的实体,每个实体对应一个数据库访问类,如Model层中有:FinishedURL类,则DAL层有FinishedURLDAL类与之对应,该类继承BaseDAL类。该项目结构及类关系如图16、图17所示:图16 DAL层项目结构图图17 DAL层类关系图Common层主要为一些常用类,该系统中主要用到HTMLHelper类和ThreadManager类。HTMLHelper主要用于分析HTML页面信息,获取URL列表,页面Title、内容等。ThreadManager类为多线程管理类,根据系统设置进行线程的启动,停止等操作。图18 Common项目结构图4.3.3 前台搜索设计前台首页在IE8下的效果如图19所示:图19 前台首页首页设计使用DIV+CSS布局方式。页面简单明了,用户只需输入关键字,点击“搜索”按钮即可,程序将自动把搜索关键字POST到ShowResult.aspx页面,由该页面来查询数据并显示结果,其流程图如图20所示:图20 搜索流程图图20 搜索结果页图21 结果页底部分页5 系统实现5.1 系统与环境配置操作系统:Microsoft Windows XP预装软件:IIS 6.0, Microsoft .NET Framework SDK v3.5,Microsoft SQL Server 2005web.config和App.config中的数据库访问配置: 索引文件目录: 5.2 系统实现5.2.1 初始化爬虫设置爬虫需要设置的参数主要有:访问开始地址、抓包线程数、索引线程数、访问深度、链接规则。访问开始地址为爬虫开始爬取数据的开始地址。由于该系统爬取数据与索引数据同时进行,因此用户必须同时设置抓包线程数与索引线程数,如果未设置则默认为一个线程。访问深度则设置爬虫爬取数据的深度。链接规则是设置爬虫只抓取该域名下的链接。以下为使用DebugView捕捉到的程序运行状态:图22 程序抓包状态图5.2.2 爬虫索引管理 在本系统中使用多线程进行抓包以及索引数据,每个索引线程建立一个索引目录,如线程1则索引目录为:Thread1。多个线程将有多个索引目录,搜索时候程序必然要读取所有目录,这对于搜索来说照成了不便,因此在程序主界面中有“优化索引”按钮,该功能主要执行合并索引目录并优化索引,提高搜索效率。关键代码为: public static void MergeDire() string path = System.Configuration.ConfigurationSettings.AppSettingsIndexFilePath; string childPath = System.IO.Directory.GetDirectories(path); FSDirectory FSDir = new FSDirectorychildPath.Length; for (int i = 0; i childPath.Length; i+) string file = childPathi + /segments; if (File.Exists(file) FSDiri = FSDirectory.GetDirectory(new FileInfo(childPathi), false); Analyzer analyzer = new KTDictSegAnalyzer(); IndexWriter writer = null; string MergePath = System.Configuration.ConfigurationSettings.AppSettingsMergeIndex; if (File.Exists(MergePath + /segments) writer = new IndexWriter(FSDirectory.GetDirectory(new FileInfo(MergePath), false), analyzer, false); else writer = new IndexWriter(FSDirectory.GetDirectory(new FileInfo(MergePath), false), analyzer, true); writer.AddIndexes(FSDir); /不需要每次都执行下面优化,这样会影响执行速度 /而且该优化只对搜索有用,对索引无用,因此可独立开进行优化 writer.Optimize(); writer.Close(); 6 系统测试和部署6.1 系统测试该项目中使用System.Diagnostics.Trace.WriteLine()方法捕获异常信息,使得爬虫程序能够即使遇到异常都能正常运行,用户可使用DebugView捕获异常。同时用户可将日志文件保存。系统中包含一个测试项目Test,该项目用于对各个项目中的类进行单元测试。该项目为一个控制台程序,如图22所示:图22 测试项目每次新建一个类文件,都会在该项目进行测试,测试保证未出现问题后才
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025山西太原重型机械集团有限公司校园招聘282人笔试参考题库附带答案详解
- 山东滨州历年中考作文题与审题指导(2015-2020)
- 仓储安全责任书(含应急预案)
- 建筑结构测绘安全责任协议范本
- 互联网时代电商采购战略合同模板
- 高新技术企业税收优惠代理合同
- 旅游景区场地租赁安全与环保协议
- 餐饮业加盟店品牌推广与宣传合作协议范本
- 智能家居社区委托居住环境运营管理合同
- 专题03 期末复习之重点语法易错专练100题(Units1-8一卷搞定)(解析版)
- 房屋安全鉴定服务投标方案
- 委托代建代管合同协议
- 开发面试题及答案大全
- 2025年4月版安全法律法规标准文件清单
- 防雷应急预案演练方案
- 无障碍栏杆施工方案范本
- 银行保安笔试题及答案
- 基于大单元教学理念下的教学设计-为中华之崛起而读书
- 《飞行器制导控制系统建模与仿真(基于MWORKS)》全套教学课件
- 2025年高级钢筋工(三级)技能认定理论考试指导题库(含答案)
- 学校德育工作手册(组织机构、职责、流程、制度、要求)
评论
0/150
提交评论