毕业设计(论文)Web资源自动获取技术研究与应用_第1页
毕业设计(论文)Web资源自动获取技术研究与应用_第2页
毕业设计(论文)Web资源自动获取技术研究与应用_第3页
毕业设计(论文)Web资源自动获取技术研究与应用_第4页
毕业设计(论文)Web资源自动获取技术研究与应用_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本本 科科 生生 毕毕 业业 论论 文文题题目目: web 资源自动获取技术研究与应用1目目 录录1 1 绪论绪论 .1 11.1 研究的背景与意义研究的背景与意义 .1 11.2 本文研究的内容本文研究的内容 .2 22 2 网络爬虫的基本介绍网络爬虫的基本介绍 .2 22.1 网络爬虫的概述网络爬虫的概述 .2 22.2 网络爬虫的搜索策略网络爬虫的搜索策略 .2 22.3 分布式网络爬虫使用的关键技术分布式网络爬虫使用的关键技术 .3 32.3.1 多线程与线程同步多线程与线程同步 .3 32.3.2 socket 套接字协议套接字协议 .4 43 3 系统功能需求分析系统功能需求分析

2、.5 53.1 http/https 页面下载器页面下载器.5 53.2 页面链接的提取和页面链接的提取和 url 的过滤的过滤 .5 53.3 url 管理器管理器 .5 53.4 url 转发器转发器.6 63.5 多线程网络爬虫多线程网络爬虫 .6 63.6 服务器端与客户端的通信与协调服务器端与客户端的通信与协调 .6 64 4 系统的设计与实现过程系统的设计与实现过程 .7 74.1 开发环境与工具开发环境与工具 .7 74.2 爬虫中服务器端的设计与实现爬虫中服务器端的设计与实现 .7 74.2.1 功能流程图和代码段及其界面图功能流程图和代码段及其界面图.7 74.2.2 url

3、 分发器的实现分发器的实现 .10104.2.3 id 生成器的实现生成器的实现.11114.3 爬虫客户端的设计与实现爬虫客户端的设计与实现 .111124.3.1 功能流程图和代码段及其界面图功能流程图和代码段及其界面图 .11114.3.2 url 转发器的实现转发器的实现 .13134.3.3 url 接收器及其消重的实现接收器及其消重的实现 .14144.3.4 恢复采集断点功能的实现恢复采集断点功能的实现 .15154.4 数据库的设计与连接数据库的设计与连接 .16164.5 系统的运行结果和测试分析系统的运行结果和测试分析 .17174.6 下载网页的查看下载网页的查看 .20

4、205 5 总结总结 .2121参考文献参考文献 .2222致谢致谢 .22221webweb 资源自动获取技术研究与应用资源自动获取技术研究与应用作者:xxx 指导教师:xxx摘摘 要:要:web 资源自动获取技术是一种自动提取,分析并过滤网页的程序,也叫网络爬虫。本文通过 java 实现了一个分布式爬虫程序。论文阐述了分布式网络爬虫实现中采用的关键技术:http/https 页面下载器,页面链接的提取和 url 的过滤,url 管理器 url 转发器,多线程网络爬虫,服务器端与客户端的通信与协调。通过实现这一爬虫程序,可以搜集某一站点的 urls,并将搜集到的 urls 存入数据库。最后创

5、建一个网页读取数据库的下载的url,列表显示出来并有超链接,点击就可以打开下载的指定网页,并在该页面创建一个检索的功能,方便查找。关键词:关键词:网络爬虫;java;分布式;多线程;urlresearch and application on web resources automatic acquisition technologyauthor: xxx tutor:xxxabstract:automatic web resource acquisition technology is a program used to automaticly extract , analyse and f

6、ilter web page ,namely the web crawler. in this paper ,java is used to implement a distributed crawler program. the paper describes key technologies applied in implementing the distributed web crawler: http/https page downloader, extract of page links and filter of urls, url manager, url repeater, m

7、ulti-thread web crawler, communication and negotiation between server and client. the crawler program could collect a websites urls, and save those urls to the database. finally establish a web page to read url which stored in database,show them in list and create a hypelink ,through clicking open t

8、he pages downloaded ,and create a searching function ,which can conveniently search. .key phrase: web crawler; java; distribute ; multi-threads;url1 1 绪论绪论1.11.1 研究的背景与意义研究的背景与意义随着互联网的飞速发展,网络上的信息呈爆炸式增长。这使得人们在网上找到所需的信息越来越困难,这种情况下搜索引擎应运而生。搜索引擎搜集互联网上数以亿计的网页,并为每个词建立索引。在建立搜索引擎的过程中,搜集网页是非常重要的一个环节。web资源自动获

9、取技术程序就是用来搜集网页的程序,也叫爬虫程序。目前已有的一些爬虫是在单机上运行的,信息搜索速度2比较有限,由于web资源的海量性,已无法在一个有限的时间范围内完成一次爬行互联网的任务。分布式的爬虫系统采用多级并行工作,能提高系统的工作效率,缩短爬行时间,具有良好的可扩展性。1.21.2 本文研究的内容本文研究的内容本文着眼于中等规模,力求一个健壮性,可扩展性,效率各方面都很完善的一个高质量的网络爬虫。从 “多机”爬虫这方面详细探讨了分布式网络爬虫的设计与实现,在“多机”爬虫设计中重点讨论了服务器端与客户端爬虫的设计及实现,首先借助功能流程图从总体上对系统进行剖析,然后再对具体细节一一突破:u

10、rl 分发器,id 生成器,url 转发器,url 接收器及界面动态显示器等。最后创建一个网页读取数据库的下载的 url,列表显示出来并有超链接,点击就可以打开下载的指定网页,并在该页面创建一个检索的功能,方便查找。2 2 网络爬虫的基本介绍网络爬虫的基本介绍 2.12.1 网络爬虫的概述网络爬虫的概述网络爬虫 ,其定义有广义和狭义之分。狭义上指遵循标准的 http 协议利用超链接和 web 文档检索的方法遍历万维网信息空间的软件程序 ,而广义的定义则是所有能遵循 http 协议检索 web 文档的软件都称之为网络爬虫。1网络爬虫是一个功能很强的自动提取网页的程序 ,它为搜索引擎从万维网上下载

11、网页 ,是搜索引擎的重要组成。它通过请求站点上的 html 文档访问某一站点。它遍历 web 空间,不断从一个站点移动到另一个站点 ,自动建立索引 ,并加入到网页数据库中。网络爬虫进入某个超级文本时 ,它利用 html 语言的标记结构来搜索信息及获取指向其他超级文本的 url 地址 ,可以完全不依赖用户干预实现网络上的自动爬行和搜索。22.2.2 2 网络爬虫的搜索策略网络爬虫的搜索策略在抓取网页的时候 ,目前网络爬虫一般有两种策略:无主题搜索与基于某特定主体的专业智能搜索。其中前者主要包括 :广度优先和深度优先。而本系统采用广度优先。广度优先是指网络爬虫会先抓取起始网页中链接的所有网页 ,然

12、后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。这是最常用的方式,因为这个方法可以让网络爬虫并行处理 ,提高其抓取速度。2因为本论文实现的爬虫程序的初衷是尽可能遍历某一站点所有的页面。广度优先算法的实行理论是覆盖更多的节点,所以此爬虫程序选择了广度优先算法。实现的策略是:先获取初始 url 对应 html 代码里所有的 urls。然后依3次获取这些 urls 对应的 html 里的 urls,当这一层所有的 urls 都下载解析完后,在获取下一层的信息。通过这种循环的获取方式实现广度优先爬行。如下图 1 假如 a 代表初始 url,bcd 为以 a 获取的 3 个 urls,ef

13、g 为以 b 获取的 urls,以此类推。那么这些 urls 获取的顺序就是 abcdefghijklmnop 这样一个顺序。当获取到 b 的 urls 之后,并不会马上去解析这些 urls,而是先解析同 b 在同一层中的 cd 对应的 urls。当这一层 urls 全部解析完后,再开始下一层 urls。图图 1 1 广度优先爬行策略图广度优先爬行策略图广度优先算法的等待队列设计如图 2 所示:图图 2 2 广度优先算法的等待队列设计图广度优先算法的等待队列设计图2.2.3 3 分布式网络爬虫使用的关键技术分布式网络爬虫使用的关键技术.1 多线程与线程同步多线程与线程同步所谓多

14、进程,就是让系统(好像)同时运行多个程序。比如,我在microsoft word 编写本论文的时候,我还打开了一酷狗来播放音乐,偶尔我还会再编辑 word 的同时让我的机器执行一个打印任务,而且我还喜欢通过 ie 从网上下载一个 flash 动画。对于我来说,这些操作都是同步进行的,我不需要等一首歌曲放完了再来编辑我的论文。看起来,它们都同时在我的机器上给我4工作。事实的真相是,对于一个 cpu 而言,它在某一个时间点上,只能执行一个程序。cpu 不断的在这些程序之间“跳跃”执行。那么,为什么我们看不出任何的中断现象呢?这是因为,相对于我们的感觉,它的速度实在太快了。我们人的感知时间可能以秒来

15、计算。而对于 cpu 而言,它的时间是以毫秒来计算的,从我们肉眼看来,它们就是一个连续的动作。因此,虽然我们看到的都是一些同步的操作,但实际上,对于计算机而言,它在某个时间点上只能执行一个程序,除非你的计算机是多 cpu 的。而多线程(multi-thread)扩展了多进程(multi-process)操作的概念,将任务的划分下降到了程序级别,使得各个程序似乎可以在同一个时间内执行多个任务。每个任务称为一个线程,能够同时运行多个线程的程序称为多线程程序。当同时运行的相互独立的线程要共享数据并且要考虑其他线程的状态时,就需要使用一套机制使得这些线程同步,避免在争用资源时发生冲突,甚至发生死锁。j

16、ava 提供了多种机制以实现线程同步。多数 java 同步是以对象锁定为中心的。java 中从 object 对象继承来的每个对象都有一个单独的锁。由于java 中的每个对象都是从 object 继承来的。所以 java 中的每个对象都有自己的锁。这样使它在共享的线程之间可以相互协调。在 java 中实现线程同步的另一个方法是通过使用 synchronized 关键字。java 使用 synchronized 关键字来定义程序中要求线程同步的部分。synchronized 关键字实现的基本操作是把每个需要线程同步的部分定义为一个临界区,在临界区中同一时刻只有一个线程被执行。.2

17、 2 socketsocket 套接字协议套接字协议“套接字” (socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端” 。针对一个特定的连接,每台机器上都有一个“套接字” ,可以想象它们之间有一条虚拟的“线缆” 。套接字不关心数据的格式,它和底层的tcp/ip 协议都只需确保数据到达正确的目的地。套接字的工作很像邮政服务,它们所做的就是将信息分遣到世界各地的计算机系统。java 有非常简单的套接字编程,其中定义有两个类:socket 和serversocket,在套接字程序设计中特别重要。如果编写的程序是扮演服务器的角色,它就应该使用 serversocket;如果程序是连

18、接到服务器的,那么它扮5演客户端的角色,就应该使用 socket 类。无论是通过子类 serversocket 完成的服务器还是客户端,socket 类只用于最初的开始连接,一旦连接建立,就使用输入和输出流来促进客户端和服务器之间的通信。连接成功后,客户端和服务器之间的区别就完全没意义了。任意一端都可以往套接字读写数据。从套接字得到的结果是一个 inputstream 以及 outputstream(若使用恰当的转换器,则分别是 reader 和 writer) ,以便将连接作为一个 io 流对象对待。一旦客户(程序)申请建立一个套接字连接,serversocket 就会返回(通过accept

19、()方法)一个对应的服务器端套接字,以便进行直接通信。从此时起,我们就得到了真正的“套接字套接字”连接,可以用同样的方式对待连接的两端,因为它们本来就是相同的。此时可以利用 getinputstream()以及getoutputstream()从每个套接字产生对应的 inputstream 和 outputstream 对象,这些数据流必须封装到缓冲区内。3 3 系统功能需求分析系统功能需求分析3.13.1 http/httpshttp/https 页面下载器页面下载器该页面下载器借助 http/https 协议从给定的 url 地址下载网页内容,并将其存入指定路径的文件中。在下载某个链接的网

20、页之前,该下载器应先判断出待下载文件的类型,用以屏蔽掉图片,音频,可执行文件等容量大的文件下载,因为那些文件的下载十分耗时,直接影响到整个系统的运行与性能。除了下载页面内容外,下载器还应记录下载的页面总数,用以最后结果的统计及性能的分析。3.23.2 页面链接的提取和页面链接的提取和 urlurl 的过滤的过滤很明显,要使爬虫得以运行,就应该具有维持爬虫爬行的 url 地址。也就是说,除了下载某个 url 指定页面的内容外,还应分析页面的 html 代码,从中提取出所有符合条件的相关链接,然后存入 url 队列中等待爬虫的获取。然而,并非所有的 url 都是待爬行的对象,在存入队列之前应对其进

21、行过滤处理,只保留“内部链接” ,即与初始 url 主机名相同的链接,而舍弃外部链接及其他类型的链接。因为如果对 url 不加控制,最终将可能造成爬虫陷入不可终止的无限爬行之中,这一点是我们不愿发生的。3.33.3 urlurl 管理器管理器爬虫的主要工作之一是组织所访问过的和将要访问的站点的列表,这些列表成为作业。url 管理器又称作业管理器,用于管理已爬行过的、等待被爬行6的、正在爬行的和因下载出错而停止爬行的作业或 url,即负责 url 的提取和装载工作。url 管理器应保证每一个即将装载的 url 在作业列表中不含有该 url,即url 去重。除了存储每个 url 之外,管理器还应记

22、录及动态地改变它们当前所处的状态,以便爬虫程序能取出合理的 url 而得以正常运转。3.43.4 urlurl 转发器转发器可以说 url 转发器是实现可扩展 spider 的关键之处,其主要任务是实现对url 的分配和转发。服务器端的主要工作就是实现对 url 的特定转发,将 url 根据指定的原则分配给不同的客户端进行爬行;而各个爬虫在每爬取一个网页之前,都要由该转发器做出判断,若属于自己的爬行范围并且该 url 未曾爬行过,则由 url 管理器将该 url 追加到等待作业中,否则进行转发工作,即把该 url 发给服务器,由服务器端做出进一步分析来决定转发给哪台爬虫。3.53.5 多线程网

23、络爬虫多线程网络爬虫该系统实现的爬虫,不仅是分布式的,即多台爬虫并行开启爬行任务,而且应该是多线程的。也就相当于把抓取网页这件事情由以前的一个 worker 来完成变成现在的许许多多的 worker 来实现,这些 worker 之间相互协调,共同维持同一个 url 队列,从而可以大大提高抓取的速度及系统的性能。worker 变多了,秩序管理就应相应增强,否则将造成对共享数据的破坏,以及 worker 间混乱的局面。这里的秩序管理也就是线程间的同步,这一点也是实现多线程的关键。3.63.6 服务器端与客户端的通信与协调服务器端与客户端的通信与协调要实现可扩展的网络爬虫,首先应该解决的问题就是爬虫

24、与主控端畅通的会话以及在此基础上提供一个融洽、协调的通信环境。当启动会话后,对于客户端提出的每一个请求,服务器都应给出相应的回复以避免客户端长时间的等待。当会话完成时,双方应各自发出指令来正常结束本次通话。首先,打开服务器用以随时响应客户端发出的请求,接着当某台爬虫客户端准备好就绪工作后便发出指令向服务器注册自己的 id 号,注册成功后,服务器上记录并显示出该台爬虫的信息并向该客户端返回所分配的 id 号及当前就绪态的爬虫总数。其次,当各爬虫均处于就绪态时,由服务器发出开始爬行的命令,从而将7初始 url 经分发器处理后启动其中某台爬虫首先工作,经过一系列的转发和分发使整个系统处于有序的运行之

25、中。在运行过程中,各客户端可以动态地显示下载页面数、爬行过的 url 列表、当前活动的线程数及与服务器间的会话情况,而服务器也可以随时发出爬行中断命令来中断各爬虫的运行以结束本次会话,或者动态地增加爬虫客户端的数目,新增的爬虫能让服务器觉察到并立即予以分配 id 和 url、更新爬虫列表并把该消息通知其他爬虫,使整个系统处于新的运转之中。最后,当各爬虫正常结束爬行任务或被中断爬行时,将各自向服务器通报自己的爬行结果包括下载页面总数,下载经历的时间及 url 下载速度等。之后,本次会话结束,系统正常退出。4 4 系统的设计与实现过程系统的设计与实现过程4.14.1 开发环境与工具开发环境与工具本

26、次开发环境与工具为:操作系统:microsoft windows xp professional service pack 2;开发工具:eclipse jdk1.6.0 sql server 2005;tomcat6.0开发语言:java; pc 机: hp pavilion(amd cpu 2.01ghz,256m 内存,80g硬盘 )。4.24.2 爬虫中服务器端的设计与实现爬虫中服务器端的设计与实现.1 功能流程图和代码段及其界面图功能流程图和代码段及其界面图首先,给出服务器端总体功能流程图图 3 及相应代码:图图 3 3 服务器端总体功能流程图服务器端总体功能流程图8

27、相应代码如下:/-public void receive()/等待并处理客户端的连接 try server=new serversocket(port); /初始化服务器套接字 while(true) socket=server.accept(); /等待连接 system.err.println(socket.getinetaddress()+连接n); /得到客户机地址 client client=new client(socket,id); /实例化一个客户线程 clients.addelement(client); /增加客户线程到向量中 addinfor(client); / 显示客

28、户信息 btstart.setenabled(true); client.start(); /启动线程,处理本次会话 notifychatroom(); /通知更新后的爬虫数目 id=produceid(id);/为下一个客户分配新的 id catch(exception ex) ex.printstacktrace(); /输出出错信息 /-接着,再给出服务器中处理每个客户端的会话线程的相应代码及工作流程图图7相关部分代码如下:/- line=reader.readline(); /读取数据流 if(keyword.equals(url)/若客户端发送来的是 url 请求 string ms

29、g=st.nexttoken(0); msg=msg.substring(1); crawlerserver.additemtodialog(from +this.id+:+msg); crawlerserver.sendtowhom(msg);/服务器实行转发处理 else if(keyword.equals(completed)|keyword.equals(interrupted)9 /客户端发送“完成”或“被中断” string pagenum=st.nexttoken(); string crawlingtime=st.nexttoken(); string element=this

30、.id+:+爬行页面总数 +pagenum+ 爬行所需时间 +crawlingtime; crawlerserver.result.add(element); crawlerserver.result.add( ); crawlerspletednum+; if(completednum=crawlerserver.clients.size() /若所有爬虫都完成或中断爬行任务则显示完成或中断爬行 if(keyword.equals(completed) crawlerserver.btstop.setlabel(完成爬行); else crawlerserver.btstop.setlabe

31、l(中断爬行); crawlerserver.btstop.setenabled(false); crawlerserver.closeall(); else if(keyword.equals(quit) /退出命令 crawlerserver.disconnect(this); /断开连接 crawlerserver.notifychatroom(); /刷新信息 /-工作流程图如图 4 所示:10图图 4 4 服务端会话线程功能流程图服务端会话线程功能流程图服务器端界面图如下图 5:图图 5 5 服务器端界面图服务器端界面图当各爬虫都已就绪好并点击“发送”按钮后,服务器端的“各爬虫信息栏

32、”将显示每个爬虫的信息,包括 ip 和 id 号,同时“开始爬行”按钮由灰变亮。点击该按钮后,整个系统便开始运行,此时“停止爬行”按钮由灰变亮,接着便可在“服务器与爬虫对话栏”对话框中显示 url 转发情况。操作人员也可点击“停止爬行”按钮来中断所有爬虫的运行,同时在“各爬虫状态监控栏”中可动态显示各个爬虫当前的采集信息,包括已下载网页数、活动线程数和爬虫所处的状态。当爬虫运行终止时,还进一步显示其耗时及 url 抓取率。.2 urlurl 分发器的实现分发器的实现当服务器接受到来自客户端的 url 请求时,便要实现对 url 的转发的工作。将 url 转发给正在运行的客户端中

33、的某一个。转发的第一步是实现 url 字符串与具体数字间的转换,借用 md5 算法中的getmd5ofstr(string)方法可以首先完成从 url 字符串到 32 位 16 进制数字字符串之间的变换。string str_url=md5.getmd5ofstr(_url);接着进行 url 的散列,针对 32 位的 16 进制数,我们的散列策略是拆分法,即,把 32 位长的 16 进制数字每 4 位分为一组,再这 8 组数转换成 10 进制整数,然后累加,将累加和对爬虫总数取余,其结果加 1 后便是转发目标的 id 号。11double int_url=md5.getdnum(str_ur

34、l);/得到累加和 int totalcrawler=clients.size();/获取爬虫总数 int index=(int)int_url%totalcrawler;/取余得出转发目标 id主控端转发器完整代码如下:/-public static void sendtowhom(string _url) string str_url=md5.getmd5ofstr(_url); double int_url=md5.getdnum(str_url); /得到累加和 int totalcrawler=clients.size();/获取爬虫总数 int index=(int)int_url

35、%totalcrawler; /取余得出转发目标 id client c; stringbuffer url=new stringbuffer(url:); url.append(_url); c=(client)clients.elementat(index);/取出待转发的爬虫对象 c.send(url);/向该爬虫发送 url additemtodialog(to +c.id+: +_url); btstart.setenabled(false);/-.3 idid 生成器的实现生成器的实现id 生成器是用于给每台爬虫分配一个唯一的 id 号,实现唯一标识和统一管理。它由

36、两部分构成,第一部分都相同:“id_”,第二部分为一个两位的数字。例如 id_01,id_02,id_10 等。因此当要新生一个 id 号时只需将第二部分的数字增一即可。以下是生成器代码:/-public static string produceid(string id)int index=id.indexof(_);int num;string numpart=id.substring(index+1);if(numpart.startswith(0)num=integer.parseint(numpart.substring(1);elsenum=integer.parseint(num

37、part);num+;/id 号的整数部分增一return (num9)?(id_+num):(id_0+num);/-124.34.3 爬虫客户端的设计与实现爬虫客户端的设计与实现.1 功能流程图和代码段及其界面图功能流程图和代码段及其界面图爬虫客户端流程图如图 6 所示:图图 6 6 爬虫客户端功能流程图爬虫客户端功能流程图客户端套接字及会话线程的创建相关代码:/-socket=new socket(inetaddress.getlocalhost(),5656); /实例化一个套接字 ps=new printstream(socket.getoutputstream();

38、 /获取输出流 stringbuffer info=new stringbuffer(info:); string userinfo=inetaddress.getlocalhost().tostring(); ps.println(info.append(userinfo); /向服务器端注册 id 号 ps.flush(); /确保数据流正确写入 listen=new listen(this,socket); /实例化监听线程 listen.start(); /启动线程/-客户端的界面图如下图 7 所示:13图图 7 7 客户端的界面客户端的界面首先,用户在“页面存储路径”文本框中输入存储

39、已下载页面的路径以及“服务器 ip”文本框中输入服务器 ip 地址,确保服务器已运行时点击“发送”按钮。如果连接成功,则“当前状态”文本框将由“断开连接”变为“已连接”状态,同时在“分配的 id 号”文本框中显示服务器为其返回的 id 号。接着爬虫开启采集与转发页面的任务,并将采集结果在右边的“已抓取的 url 页面栏”列表框中动态显示,将与服务器间转发情况在左边的“服务器与客户端对话栏”的对话框中动态显示。在爬虫运行过程中,可在界面最底端的几个文本框中监视其爬行状况:其中右边的第一个文本框中动态显示已下载的页面数,第二个文本框动态显示系统活动的线程数目,通过点击最右边的“刷新时间”按钮,可在

40、“爬行总耗时”文本框中静态显示爬虫已运行的时间。.2 urlurl 转发器的实现转发器的实现spider 在抓取每一个网页前,都要从 url 管理器那申请一个处于等待状态的 url,接着由该转发器决定此 url 是否属于自己的爬行范围,若属于则spiderworker 启动线程开始爬行,否则将继续申请直到分配到符合条件的 url为止。下面的代码取自 spiderworker 类中的 run()方法,主要代码:/-14target = this.owner.getworkload();/获取等待状态的 urlwhile(target!=null) if(!isrighturl(t

41、arget)/转发 client.tfdialog.append(to server: +target+n); client.send(url:+target); else break; target = this.owner.getworkload();/-其中 isrighturl()方法原型为:public boolean isrighturl(string url)它的功能类似于 clientserver 类中的 sendtowhom()方法,其代码这里不再重复。程序流程图如图 8 所示:图图 8 8 urlurl 转发器功能流程图转发器功能流程图.3 urlurl 接

42、收器及其消重的实现接收器及其消重的实现当服务器向客户端转发 url 时,爬虫客户端应准备接收此 url。并不是每次都把收到的 url 简单地交给 url 管理器处理,而应首先作出判断,因为每个爬虫在运行前需要被构造即初始化,以及传递初始 url 作为爬行的起点。所以如果接收的是第一个 url 则应构造并初始化爬虫,否则加入 url 队列等待爬行。其流程图如图 9 所示:15图图 9 9 urlurl 接收器功能流程图接收器功能流程图至于 url 去重,只需创建一个 url 列表存放已访问过的 url。每次在接收新的 url 之前查看此表,如果含有该 url,则将其抛弃,否则转交 url 管理器

43、。下面是主要代码:/-if(this.client.starturl)/若第一次接收到 url this.client.getsite=new getsite(this.client,url,client.tfpath.gettext();/构造爬虫 this.client.starturl=false; this.client.startingtime=system.currenttimemillis();/记录起始爬行时间else /否则,转交 url 管理器 if(!urllist.contains(url) this.client.getsite._spider.addworkload

44、(url);/-.4 恢复采集断点功能的实现恢复采集断点功能的实现所谓采集断点的恢复,是指对于给定的每一个站点,在某一次采集中断后系统将记住采集的断点并在下一次运行时从该断点处接着爬行而并不是从第一个链接开始采集。断点的恢复功能不仅可以避免不必要的重复采集工作而极大提高系统的采集效率,而且也属于本系统设计中主要考虑的问题之一。16 bot 包中的单机上的页面采集系统(spider 类)不具备断点恢复的功能,因为它在每次运行的开始与结束时都将做数据库清理工作。为实现该功能,本人对其做如下更改:首先删去在 spider 类的构造方法及 halt()方法中对数据库清理的语句workl

45、oad.clear();由于只有那些在数据库中处于 waiting 状态的 url 才有被 spiderworker 采集的机会,故在启动爬虫线程之前应将上一次被中断的且处于 running 状态的url 的状态恢复为 waiting 状态而等待再次被采集,一方面可以恢复断点继续运行,另一方面还可以防止因数据库中没有处于 waiting 状态的 url 而使整个系统无法推进。这里改变 url 状态的是新增的方法 changestatus();public void changestatus() workload.setstatus(); 另外,由于爬行的站点不止一个,故数据库中会保存不同站点的

46、 url 信息。如果不做处理最终将导致采集混乱的局面,因为数据库中不同站点的 url 都有处于等待状态的可能,如果在选取被采集 url 时只看其所处状态就会出现采集其他网页的错误。处理方法是增加判断条件,将 waiting 态下的 url 与种子url 做比较然后再做取舍,关键代码如下示:/-rs = prepassign.executequery();/获取处于等待状态的 url while( rs.next() ) string url = rs.getstring(url); if(url.startswith(starturl) /将其与起始 url 比较 setstatus(url,

47、running); return url; /-4.44.4 数据库的设计与连接数据库的设计与连接本系统采用 sql server 2005 数据库来存储 url 作业,下面首先给出数据表的设计:根据 url 作业的特点,我们创建 url 及 status 两个字段来为其建立一个名为 tblworkload 的数据用以存储 spider 运行过程中抓取的 url 链接。下表 1 是对字段的描述17表表 1 1 tblworkloadtblworkload 其中字段“url”是存储所有抓取的链接, “status”记录对应 url 的当前状态。然后再介绍数据库的连接步骤:首先,创建 spider

48、sqlworkload 对象,提供 jdbc 驱动程序及使用的数据源,下面是数据库连接的主要代码:/-public connection getconnection()trystring url = jdbc:sqlserver:/localhost:1433;databasename=netbug;string user = sa;string pwd = 123;class.forname(com.microsoft.sqlserver.jdbc.sqlserverdriver);con = drivermanager.getconnection(url, user, pwd);con.s

49、etautocommit(autocommit); /-4.54.5 系统的运行结果和测试分析系统的运行结果和测试分析系统运行后客户端显示的结果如图 10,图 11 所示:18图图 1010 客户端显示的结果客户端显示的结果图图 1111 客户端显示的结果客户端显示的结果系统运行后服务器端显示的结果如下图 12 所示:19图图 1212 服务器端显示的结果服务器端显示的结果系统的测试说明:本系统正常的测试环境是在网速稳定的同一个局域网内,用一台电脑做主控端,即服务器,三台电脑当爬虫客户端。但受到硬件资源及网络的条件限制,本系统只能进行简单粗略的测试。其中设置了两组测试环境,分别为一台爬虫机器(

50、单机)和两台爬虫机器用以做对比参照,另外在同一组测试环境下给定两种不同的起始 url 用以做同组间的对比。硬件的配置:爬行主机 1:组装机(奔腾 cpu 2.01ghz, 1g 内存,80g 硬盘)爬虫主机 2:组装机(奔腾 cpu 2.01ghz, 1g 内存,160g 硬盘)服务器主机:组装机(奔腾 cpu 2.01ghz, 1g 内存,80g 硬盘)说明:受硬件条件的限制,爬虫 1 和服务器主机属同台机器,爬虫 1 和爬虫 2相隔大概 20m 左右.测试结果分析:20表表 2 2 测试的结果测试的结果 1 1起始 urlhttp:/ (小型站点)爬行线程数100 个环境一环境二 测试环境

51、参数爬虫 1爬虫 1爬虫 2下载页面总数1450 个872 个1056 个平均页面大小8.23kb11.25kb10.23kb全部页面总量11.65mb9.58mb10.55mb采集时间10 分 35 秒7 分 12 秒9 分 32 秒url 抓取率2.31 个/秒2.02 个/秒1.85 个/秒页面下载速度18.79kb/s22.71kb/s18.89kb/s表表 3 3 测试的结果测试的结果 2 2起始 urlhttp:/ (大型站点)爬行线程数100 个环境一环境二测试环境参数爬虫 1爬虫 1爬虫 2下载页面总数1298 个914 个1020 个平均页面大小35.9kb38.09kb37.04kb全部页面总量45.6mb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论