网络爬虫的设计与实现-毕业论文.doc
《网络爬虫的设计与实现-毕业论文.doc》由会员分享,可在线阅读,更多相关《网络爬虫的设计与实现-毕业论文.doc(58页珍藏版)》请在咨信网上搜索。
1、摘要摘要网络爬虫是一种自动搜集互联网信息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息等.本文通过JAVA实现了一个基于广度优先算法的多线程爬虫程序.本论文阐述了网络爬虫实现中一些主要问题:为何使用广度优先的爬行策略,以及如何实现广度优先爬行;为何要使用多线程,以及如何实现多线程;系统实现过程中的数据存储;网页信息解析等。通过实现这一爬虫程序,可以搜集某一站点的URLs,并将搜集到的URLs存入数据库。 【关键字】网络爬虫;JAVA;广度优先;多线程.ABSTRACT SPIDER is a program w
2、hich can auto collect informations from internet. SPIDER can collect data for search engines, also can be a Directional information collector, collects specifically informations from some web sites, such as HR informations, house rent informations。In this paper, use JAVA implements a breadthfirst al
3、gorithm multithread SPDIER。 This paper expatiates some major problems of SPIDER: why to use breadth-first crawling strategy, and how to implement breadthfirst crawling; why to use multithreading, and how to implement multithread; data structure; HTML code parse。 etc. This SPIDER can collect URLs fro
4、m one web site, and store URLs into database。 【KEY WORD】SPIDER; JAVA; Breadth First Search; multi-threads。目录第一章 引言1第二章 相关技术介绍22。1 JAVA线程22.1.1 线程概述22.1.2 JAVA线程模型22。1。3 创建线程32。1。4 JAVA中的线程的生命周期42.1.5 JAVA线程的结束方式42.1。6 多线程同步52.2 URL消重52。2.1 URL消重的意义52。2。2 网络爬虫URL去重储存库设计52.2。3 LRU算法实现URL消重72。3 URL类访问网
5、络82。4爬行策略浅析82。4。1宽度或深度优先搜索策略82.4.2 聚焦搜索策略92。4.3基于内容评价的搜索策略92。4.4 基于链接结构评价的搜索策略102。4.5 基于巩固学习的聚焦搜索112.4。6 基于语境图的聚焦搜索11第三章 系统需求分析及模块设计133.1 系统需求分析133。2 SPIDER体系结构133。3 各主要功能模块(类)设计143。4 SPIDER工作过程14第四章 系统分析与设计164.1 SPIDER构造分析164。2 爬行策略分析174.3 URL抽取,解析和保存184。3。1 URL抽取184。3.2 URL解析194。3.3 URL保存19第五章 系统实
6、现215.1 实现工具215。2 爬虫工作215。3 URL解析225。4 URL队列管理245。4。1 URL消重处理245.4.2 URL等待队列维护265.4。3 数据库设计27第六章 系统测试29第七章 结论32参考文献33致谢34外文资料原文35译文51第一章 引言第一章 引言随着互联网的飞速发展,网络上的信息呈爆炸式增长。这使得人们在网上找到所需的信息越来越困难,这种情况下搜索引擎应运而生。搜索引擎搜集互联网上数以亿计的网页,并为每个词建立索引。在建立搜索引擎的过程中,搜集网页是非常重要的一个环节。爬虫程序就是用来搜集网页的程序。以何种策略偏历互联网上的网页,也成了爬虫程序主要的研
7、究方向。现在比较流行的搜索引擎,比如google,百度,它们爬虫程序的技术内幕一般都不公开。目前几种比较常用的爬虫实现策略:广度优先的爬虫程序,Repetitive爬虫程序,定义爬行爬虫程序,深层次爬行爬虫程序。此外, 还有根据概率论进行可用Web页的数量估算, 用于评估互联网Web规模的抽样爬虫程序; 采用爬行深度、页面导入链接量分析等方法, 限制从程序下载不相关的Web页的选择性爬行程序等等.爬虫程序是一个自动获取网页的程序。它为搜索引擎从互联网上下载网页,是搜索引擎的重要组成部分.爬虫程序的实现策略,运行效率直接影响搜索引擎的搜索结果。不同的搜索引擎,会根据对搜索结果的不同需求,选择最合
8、适的爬行策略来搜集互联网上的信息。高效,优秀的爬虫程序可以使人们在互联网上寻找到更及时,更准确的信息.实现网络爬虫的重点和难点有:多线程的实现;对临界资源的分配;遍历web图的遍历策略选择和实现;存储数据结构的选择和实现。本文通过JAVA语言实现一个基于广度优先偏历算法的多线程爬虫程序。通过实现此爬虫程序可以定点搜集某一站点的URLs,如果需要搜集其他信息,可以在解析URLs的同时,解析获取相应信息。53第二章 相关技术介绍第二章 相关技术介绍2.1 JAVA线程2.1。1 线程概述几乎每种操作系统都支持线程的概念-进程就是在某种程度上相互隔离的,独立运行的程序.一般来说,这些操作系统都支持多
9、进程操作.所谓多进程,就是让系统(好像)同时运行多个程序.比如,我在Microsoft Word编写本论文的时候,我还打开了一个mp3播放器来播放音乐,偶尔的,我还会再编辑Word的同时让我的机器执行一个打印任务,而且我还喜欢通过IE从网上下载一个Flash动画。对于我来说,这些操作都是同步进行的,我不需要等一首歌曲放完了再来编辑我的论文。看起来,它们都同时在我的机器上给我工作。事实的真相是,对于一个CPU而言,它在某一个时间点上,只能执行一个程序。CPU不断的在这些程序之间“跳跃”执行。那么,为什么我们看不出任何的中断现象呢?这是因为,相对于我们的感觉,它的速度实在太快了。我们人的感知时间可
10、能以秒来计算。而对于CPU而言,它的时间是以毫秒来计算的,从我们肉眼看来,它们就是一个连续的动作.因此,虽然我们看到的都是一些同步的操作,但实际上,对于计算机而言,它在某个时间点上只能执行一个程序,除非你的计算机是多CPU的。多线程(MultiThread)扩展了多进程(multiProcess)操作的概念,将任务的划分下降到了程序级别,使得各个程序似乎可以在同一个时间内执行多个任务。每个任务称为一个线程,能够同时运行多个线程的程序称为多线程程序。多线程和多进程有什么区别呢?对于进程来说,每个进程都有自己的一组完整的变量,而线程则共享相同的数据.2。1。2 JAVA线程模型我们知道,计算机程序
11、得以执行的三个要素是:CPU,程序代码,可存取的数据.在JAVA语言中,多线程的机制是通过虚拟CPU来实现的。可以形象的理解为,在一个JAVA程序内部虚拟了多台计算机,每台计算机对应一个线程,有自己的CPU,可以获取所需的代码和数据,因此能独立执行任务,相互间还可以共用代码和数据。JAVA的线程是通过java。lang。Thread类来实现的,它内部实现了虚拟CPU的功能,能够接收和处理传递给它的代码和数据,并提供了独立的运行控制功能。我们知道,每个JAVA应用程序都至少有一个线程,这就是所谓的主线程.它由JVM创建并调用JAVA应用程序的main()方法。JVM还通常会创建一些其他的线程,不
12、过,这些线程对我们而言通常都是不可见的。比如,用于自动垃圾收集的线程,对象终止或者其他的JVM处理任务相关的线程。2。1。3 创建线程2。1.3。1 创建线程方式一在JAVA中创建线程的一种方式是通过Thread来实现的.Thread有很多个构造器来创建一个线程(Thread)实例:Thread();创建一个线程。Thread(Runnable target);创建一个线程,并指定一个目标。Thread(Runnable target,String name);创建一个名为name的目标为target的线程.Thread(String name);创建一个名为name的线程.Thread(Th
13、readGroup group,Runnable target);创建一个隶属于group线程组,目标为target的线程。通常,我们可以将一个类继承Thread,然后,覆盖Thread中的run()方法,这样让这个类本身也就成了线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体.使用start()方法,线程进入Runnable状态,它将线程调度器注册这个线程.调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnble而不是Running。2。1.3.2 创建线程方式二通过实现Runnable接口并实现接口
14、中定义的唯一方法run(),可以创建一个线程。在使用Runnable接口时,不能直接创建所需类的对象并运行它,而是必须从Thread类的一个实例内部运行它.从上面两种创建线程的方法可以看出,如果继承Thread类,则这个类本身可以调用start方法,也就是说将这个继承了Thread的类当作目标对象;而如果实现Runnable接口,则这个类必须被当作其他线程的目标对象。2。1。4 JAVA中的线程的生命周期JAVA的线程从产生到消失,可分为5种状态:新建(New),可运行(Runnable),运行(Running),阻塞(Blocked)以及死亡(Dead).其中,Running状态并非属于JA
15、VA规范中定义的线程状态,也就是说,在JAVA规范中,并没有将运行(Running)状态真正的设置为一个状态,它属于可运行状态的一种。当使用new来新建一个线程时,它处于New状态,这个时候,线程并未进行任何操作。然后,调用线程的start()方法,来向线程调度程序(通常是JVM或操作系统)注册一个线程,这个时候,这个线程一切就绪,就等待CPU时间了。线程调度程序根据调度策略来调度不同的线程,调用线程的run方法给已经注册的各个线程以执行的机会,被调度执行的线程进入运行(Running)状态。当线程的run方法运行完毕,线程将被抛弃,进入死亡状态。你不能调用restart方法来重新开始一个处于
16、死亡状态的线程,但是,你可以调用处于死亡状态的线程对象的各个方法。如果线程在运行(Running)状态中因为I/O阻塞,等待键盘键入,调用了线程的sleep方法,调用了对象的wait()方法等,则线程将进入阻塞状态,直到这些阻塞原因被解除,如:IO完成,键盘输入了数据,调用sleep方法后的睡眠时间到以及其他线程调用了对象的notify或notifyAll方法来唤醒这个因为等待而阻塞的线程等,线程将返回到Runnable状态重新等待调度程序调度,注意,被阻塞的线程不会直接返回到Running状态,而是重新回到Runnable状态等待线程调度程序的调用。线程调度程序会根据调度情况,将正在运行中的
17、线程设置为Runnable状态,例如,有一个比当前运行状态线程更高运行等级的线程进入Runnable状态,就可能将当前运行的线程从Running状态“踢出,让它回到Runnable状态。2。1.5 JAVA线程的结束方式线程会以以下三种方式之一结束:线程到达其run()方法的末尾;线程抛出一个未捕获到的Exception或Error;另一个线程调用一个Deprecated的stop()方法。注意,因为这个方法会引起线程的安全问题,已经被不推荐使用了,所以,不要再程序调用这个方法。2.1。6 多线程同步当同时运行的相互独立的线程需要共享数据并且需要考虑其他线程的状态时,就需要使用一套机制使得这些
18、线程同步,避免在争用资源时发生冲突,甚至发生死锁。JAVA提供了多种机制以实现线程同步。多数JAVA同步是以对象锁定为中心的.JAVA中从Object对象继承来的每个对象都有一个单独的锁。由于JAVA中的每个对象都是从Object继承来的。所以JAVA中的每个对象都有自己的锁。这样使它在共享的线程之间可以相互协调。在JAVA中实现线程同步的另一个方法是通过使用synchronized关键字。JAVA使用synchronized关键字来定义程序中要求线程同步的部分。synchronized关键字实现的基本操作是把每个需要线程同步的部分定义为一个临界区,在临界区中同一时刻只有一个线程被执行。2。2
19、 URL消重2.2.1 URL消重的意义在SPIDER系统实际运行的过程中,每秒下载的10个页面中,分析的URL大多数是重复的,实际上新的URL才几个。在持续下载的过程中,新的URL非常少,还是以新浪网举例,1天24小时中总共出现的新URL也就是10000左右.这种情况非常类似于操作系统中虚拟储存器管理。所谓的虚拟储存器,是指具有请求调入和置换功能,能从逻辑上对内存容量加以扩充的一种储存器系统。其关键在于允许一个作业只装入部分的页或段就可以启动运行,当作业运行的时候在内存中找不到所需要的页或段的时候,就会发生请求调入,而从外存中找到的页或段将会置换内存中暂时不运行的页面到外存。URL消重工作量
20、是非常巨大的。以下在新浪新闻页面为例,新浪一个新闻页面大小为5060k,每个页面有90100个URL,如果每秒下载10个页面,就会产生9001000次的URL排重操作,每次排重操作都要在几百万至几千万的URL库中去查询。这种操作对数据库系统是一个灾难,理论上任何需要产生磁盘I/O动作的存储系统都无法满足这种查询的需求。2.2.2 网络爬虫URL去重储存库设计在爬虫启动工作的过程中,我们不希望同一个网页被多次下载,因为重复下载不仅会浪费CPU机时,还会为搜索引擎系统增加负荷。而想要控制这种重复性下载问题,就要考虑下载所依据的超链接,只要能够控制待下载的URL不重复,基本可以解决同一个网页重复下载
21、的问题。非常容易想到,在搜索引擎系统中建立一个全局的专门用来检测,是否某一个URL对应的网页文件曾经被下载过的URL存储库,这就是方案。接着要考虑的就是如何能够更加高效地让爬虫工作,确切地说,让去重工作更加高效。如果实现去重,一定是建立一个URL存储库,并且已经下载完成的URL在进行检测时候,要加载到内存中,在内存中进行检测一定会比直接从磁盘上读取速度快很多.我们先从最简单的情况说起,然后逐步优化,最终得到一个非常不错的解决方案。2.2.2.1 基于磁盘的顺序存储这里,就是指把每个已经下载过的URL进行顺序存储.你可以把全部已经下载完成的URL存放到磁盘记事本文件中。每次有一个爬虫线程得到一个
22、任务URL开始下载之前,通过到磁盘上的该文件中检索,如果没有出现过,则将这个新的URL写入记事本的最后一行,否则就放弃该URL的下载。这种方式几乎没有人考虑使用了,但是这种检查的思想是非常直观的。试想,如果已经下载了100亿网页,那么对应着100亿个链接,也就是这个检查URL是否重复的记事本文件就要存储这100亿URL,况且,很多URL字符串的长度也不小,占用存储空间不说,查找效率超级低下,这种方案肯定放弃.2.2。2.2 基于Hash算法的存储对每一个给定的URL,都是用一个已经建立好的Hash函数,映射到某个物理地址上。当需要进行检测URL是否重复的时候,只需要将这个URL进行Hash映射
23、,如果得到的地址已经存在,说明已经被下载过,放弃下载,否则,将该URL及其Hash地址作为键值对存放到Hash表中。这样,URL去重存储库就是要维护一个Hash表,如果Hash函数设计的不好,在进行映射的时候,发生碰撞的几率很大,则再进行碰撞的处理也非常复杂.而且,这里使用的是URL作为键,URL字符串也占用了很大的存储空间.2。2.2。3 基于MD5压缩映射的存储MD5算法是一种加密算法,同时它也是基于Hash的算法。这样就可以对URL字符串进行压缩,得到一个压缩字符串,同时可以直接得到一个Hash地址。另外,MD5算法能够将任何字符串压缩为128位整数,并映射为物理地址,而且MD5进行Ha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 爬虫 设计 实现 毕业论文
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。