多线程的网络爬虫的设计与实现大学课程Word格式.docx
《多线程的网络爬虫的设计与实现大学课程Word格式.docx》由会员分享,可在线阅读,更多相关《多线程的网络爬虫的设计与实现大学课程Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
![多线程的网络爬虫的设计与实现大学课程Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/30/6dc71320-94a7-4f94-8f97-df411fe41c7d/6dc71320-94a7-4f94-8f97-df411fe41c7d1.gif)
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战,作为搜索引擎不可或缺的一部分网络爬虫,一直是个热门的研究课题,它的效能,直接决定了搜索引擎的未来。
本课题所研究的网络爬虫采用广度优先搜索算法,并基于Java语言进行网络编程。
实现网络爬虫关键技术是对URL进行分析和去重。
为使网络爬虫具备更高效的抓取能力,因而使用了多线程技术。
同时为了避免无限制的等待,应该对网络爬虫连接网络及读取时间最大值进行设定。
本课题的目标是研究并实现一个实现简单的可在后台自动运行的爬虫程序。
系统可以进行面向主题的抓取。
从行为上来看,它更近似于主题网络爬虫。
关键词:
网络爬虫;
广度优先;
Java;
多线程;
Designandimplementationofawebcrawlerbasedonmultithreading
Specialty:
SoftwareEngineeringStudentNumber:
Student:
Supervisor:
ABSTRACT:
WebCrawler,alsocalledWebSpider,isanimportantpartofsearchengine.WiththerapiddevelopmentofInternet,theWorldWideWebbecomesthecarrierofalargeamountofinformation.AndHowtoeffectivelyextractandusethisinformationtobecomeagreatchallenge.ThequalityofasearchengineismostlydependedonthequalityofaWebCrawlerthatasanindispensablepartofwebcrawlersearchengine.SoWebCrawlerisahotresearchtopicthoseyears.
Theprojectwhichwasstudiedinthispaperusingthebreadth-firstsearchalgorithm,andbasedontheJavalanguagefornetworkprogramming.ImplementationofthekeytechnologyofwebcrawleristoanalyzeandtoURL.Inordertomakethewebcrawlerhasmoreefficientgraspingability,sotheuseofmulti-threadingtechnology.Atthesametimeinordertoavoidwaitingwithoutlimit,shouldbeonthewebcrawlerconnectingnetworkandreadthetimeofmaximumvalue.Thegoalofthisprojectistoresearchandrealizeanimplementationcanberunautomaticallyinthebackgroundsimplecrawlerprogram.Systemcanbeasubjectorientedgrab.Fromthepointofview,itismoresimilartothetopicwebcrawler.
Keywords:
WebCrawler;
Breadth-FirstSearch;
Java;
Multi-Threading
绪论
随着计算机和网络技术的日臻成熟并被广泛的应用到社会生活的各个领域,网络上的信息呈爆炸式增长,并由此诞生了大量的数据,人类进入了一个“大数据时代”。
这使得人们在网上找到自己所需的信息越来越困难,如果在信息的海洋里捞针。
据统计搜索引擎已经成为仅次于电子邮件服务,是人们使用最多的网路服务。
搜索引擎搜集互联网上数以亿计的网页,并为每个关键词建立索引。
用户通过输入自己感兴趣的关键字就能获得与之相关的网页。
从搜索引擎出发就能很快的到达互联网的任何一个地方。
在建立搜索引擎的过程中,获取网页是非常重要的一个环节。
爬虫程序就是用来获取网页的程序。
网络爬虫,是一种按照一定的规则,自动的抓取因特网信息的程序或者脚本。
另外一些不常使用的名字还有网路蚂蚁,自动索引,模拟程序或者蠕虫。
网络蜘蛛是通过网页的链接地址来寻找网页,从网站的一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
WEB资源自动获取技术程序就是用来搜集网页的程序。
以何种策略遍历互联网上的网页,也成了该程序主要的研究方向。
现在比较流行的搜索引擎,比如Google,XX,它们自动获取资源程序的技术内幕一般都不公开。
目前几种比较常用的自动获取资源实现策略:
广度优先的爬虫程序,Repetitive爬虫程序,定义爬行爬虫程序,深层次爬行爬虫程序。
此外,还有根据概率论进行可用Web页的数量估算,?
用于评估互联网Web规模的抽样爬虫程序;
采用爬行深度、页面导入链接量分析等方法,限制从程序下载不相关的Web页的选择性爬行程序等等。
自动获取资源技术为搜索引擎从互联网上自动获取整个网页,也可以网页中的某一个图片或者是网页链接的文件等资源,是搜索引擎的重要组成部分。
自动获取资源技术程序的实现策略,运行效率直接影响搜索引擎的搜索结果。
不同的搜索引擎,会根据对搜索结果的不同需求,选择最合适的爬行策略来搜集互联网上的信息。
高效,优秀的自动获取资源程序可以使人们在互联网上寻找到更及时,更准确的信息。
本课题旨在根据上述原理设计与实现一个网络爬虫系统。
1概述
1.1研究目的和意义
网络蜘蛛是通过网页的链接地址来寻找网页,从网站的某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
而本课题的主要就是怎样更高效的获取网页,并通过所给条件筛选得到人们所需要的网页。
随着互连网的飞速发展,网络信息量呈现出爆炸性增长的趋势,当今这个时代被称为“大数据”时代。
越来越多的信息涌到人们的面前,然而互联网在人们提供丰富信息的同时,却在如何对信息进行高效便捷使用方面给人民带来巨大的挑战:
一方面互联网上的信息种类繁多、丰富多彩,而另一方面却很难找到真正有用的信息,当人们想从浩淼无边的数据海洋中快速准确的找到自己所需要的信息时,常常需要“搜索引擎”的帮助,而网络爬虫是搜索引擎的重要组成。
它为搜索引擎从Internet上下载网页。
作为搜索引擎的资源采集部分,网络爬虫的性能将直接影响到整个搜索引擎索引网页的数量、质量和更新周期。
高效,优秀的爬虫程序可以使人们在互联网上寻找到更及时,更准确的信息。
1.2网络爬虫的历史
在互联网发展的早期,网站数量相对较少,信息数据量不大,查找也比较容易。
然而伴随互联网井喷性的发展,普通网络用户想找到自己所需的资料简直如同在数据的海洋里捞针,为满足大众信息检索需求的专业搜索网站便应运而生了。
所有搜索引擎的鼻祖,是1990年由Montreal的McGillUniversity三名学生(AlanEmtage、PeterDeutsch、BillWheelan)发明的Archie(ArchieFAQ)。
AlanEmtage等想到了开发一个可以用文件名查找文件的系统,于是便有了Archie。
Archie是第一个自动索引互联网上匿名FTP网站文件的程序,但它还不是真正的搜索引擎。
Archie是一个可搜索的FTP文件名列表,用户必须输入精确的文件名搜索,然后Archie会告诉用户哪一个FTP地址可以下载该文件。
由于Archie深受欢迎,受其启发,NevadaSystemComputingServices大学于1993年开发了一个Gopher(GopherFAQ)搜索工具Veronica(VeronicaFAQ)。
Jughead是后来另一个Gopher搜索工具。
虽然当时万维网还未出现,但网络中文件传输还是相当频繁的,而且由于大量的文件散布在各个分散的FTP主机中,查询起来非常不便,因此AlanArchie工作原理与现在的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,然后对有关信息进行索引,供使用者以一定的表达式查询。
当时,“机器人”一词在编程者中十分流行。
电脑“机器人”(ComputerRobot)是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。
由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此,搜索引擎的“机器人”程序就被称为“蜘蛛”程序。
世界上第一个用于监测互联网发展规模的“机器人”程序是MatthewGray开发的WorldwideWebWanderer。
刚开始它只用来统计互联网上的服务器数量,后来则发展为能够检索网站域名。
与Wanderer相对应,MartinKosher于1993年10月创建了ALIWEB,它是Archie的HTTP版本。
ALIWEB不使用“机器人”程序,而是靠网站主动提交信息来建立自己的链接索引,类似于现在我们熟知的Yahoo。
随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在MatthewGray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工作原理作了些改进。
直到一些编程者提出了这样的设想,既然所有网页都可能有连向其他网站的链接,那么从跟踪一个网站的链接开始,就有可能检索整个互联网。
到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,但是早期的搜索引擎只是以搜索工具在数据库中找到匹配信息的先后次序排列搜索结果,因此毫无信息关联度可言。
而RBSE是第一个在搜索结果排列中引入关键字串匹配程度概念的引擎。
最早现代意义上的搜索引擎出现于1994年7月。
当时MichaelMauldin将JohnLeavitt的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的Lycos(2000年被西班牙网络集团TerraLycosNetwork收购)。
同年4月,斯坦福(Stanford)大学最为著名的两名博士生,美籍华人杨致远(GerryYang)和DavidFilo共同创办了Yahoo公司,并成功地使搜索引擎的概念深入人心。
从此搜索引擎进入了高速发展时期。
目前,互联网上有名有姓的搜索引擎已达数百家,其检索的信息量也与从前不可同日而语。
像国外的Google,国内的XX,这样的搜索引擎巨擘由于掌握的大多数的入口流量,成为互联网世界的霸主,并带来了巨大的商业价值。
1.3研究现状和发展趋势
因为搜索引擎的商业化应用带来了巨大的商业价值,所以作为搜索引擎的核心部分的网络爬虫技术,也理所应当的成为了国内外研究的热点。
对于网络爬虫的研究从上世纪九十年代就开始了目前爬虫技术已经相当成熟。
并催生了像Baidu和Google这样的网络巨擘,而其他公司也纷纷推出了自己的搜索引擎。
网络爬虫是搜索引擎的重要组成部分。
现今,网络爬虫主要分为通用爬虫和聚焦爬虫两类。
通用搜索引擎的目标是尽可能大的网络覆盖率,通用搜索引擎大多提供基于关键字的检索。
聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。
与通用爬虫(generalpurposewebcrawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
同时,支持根据语义信息提出的查询。
网络爬虫的发展趋势随着AJAX/Web2.0等技术的流行,如何抓取AJAX等动态页面成了搜索引擎急需解决的问题,如果搜索引擎依旧采用“爬”的机制,是无法抓取到AJAX页面的有效数据的。
除此之外,网络爬虫还主要面对着一下的这些问题(摘自XX百科[5]):
1、强制用Cookies。
部分站长为了让用户记住登陆信息,强迫用户使用Cookies。
如果未开启,则无法进行访问,访问页面显示的也不会正常,这种方式会让蜘蛛无法进行访问。
2、登陆要求。
有些企业站和个人站的设置一定要注册登陆后才能看到相关的文章内容,这种对蜘蛛不是很友好,蜘蛛不会注册、也不会登陆。
3、动态URL。
动态URL简单的说就是带有问号、等号及参数的网址就是动态URL,动态URL不利于搜索引擎蜘蛛的爬行和抓取。
4、Flash。
有的网站页面使用Flash视觉效果是很正常的,比如用Flash做的Logo、广告、图表等,这些对搜索引擎抓取和收录是没有问题的,很多网站的首页是一个大的Flash文件,这种就叫蜘蛛陷阱,在蜘蛛抓取时HTML代码中只是一个链接,并没有文字。
虽然大的Flash效果看上去很好,外观看着也很漂亮,但可惜搜索引擎看不到,无法读取任何内容。
5、无休止的跳转。
对搜索引擎来说只对301跳转相对来说比较友好,对其他形式的跳转都是比较敏感,例如:
JavaScript跳转、MetaRefresh跳转、Flash跳转、302跳转。
2网络爬虫相关技术
本章将会对于网络爬虫紧密相关的一些技术进行说明。
2.1URL
统一资源定位符(URL,UniformResourceLocator)也被称为网页地址,是因特网上标准的资源的地址。
它最初是由蒂姆·
伯纳斯-李发明用来作为万维网的地址的。
(摘自XX百科[5])
URL是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。
简单地说,URL就是Web地址,俗称“网址”。
URL结构一般分为两个部分,一个是物理结构,一个是逻辑结构。
在物理结构包括扁平结构和树型结构。
扁平结构就是网站中所有的页面都是在根目录这一级别,形成一个扁平的物理结构。
这比较适合于小型的网站,因为如果太多文件都放在根目录下的话,制作和维护起来比较麻烦。
而树型结构的意义是在一级目录下分为多个频道或者称之为目录,然后目录下面再放上属于这个频道的页面,首页、频道首页、频道下的内容就好比树干、树枝、树叶的关系。
逻辑结构就是由网页内部链接所形成的逻辑的或链接的网络图。
比较好的情况是逻辑结构与前面的树型物理结构相吻合。
统一资源定位符URL是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示。
URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。
只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。
URL相当于一个文件名在网络范围的扩展。
因此URL是与因特网相连的机器上的任何可访问对象的一个指针。
URL的一般形式是:
<
URL的访问方式>
:
//<
主机>
端口>
/<
路径>
网络爬虫就是通过提取和分析出网页中的URL地址,对相应网络进行爬取。
2.2HTTP协议
本课题研究的网络爬虫是用于对于Internet上的信息进行获取,而HTTP协议是Internet上最重要的协议之一。
2.2.1HTTP协议简介
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
超文本传输协议(HTTP-Hypertexttransferprotocol)是分布式,协作式,超媒体系统应用之间的通信协议。
是万维网(worldwideweb)交换信息的基础。
HTTP协议的主要特点可概括如下:
1、支持客户/服务器模式。
http协议简介http协议简介
2、简单快速:
客户向服务器请求服务时,只需传送请求方法和路径。
请求方法常用的有GET、HEAD、POST。
每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:
HTTP允许传输任意类型的数据对象。
正在传输的类型由Content-Type加以标记。
4、无连接:
无连接的含义是限制每次连接只处理一个请求。
服务器处理完客户的请求,并收到客户的应答后,即断开连接。
采用这种方式可以节省传输时间。
5、无状态:
HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
2.2.2HTTP消息的结构
Request消息的结构,Request消息分为3部分,第一部分叫请求行,第二部分叫httpheader,第三部分是body.header和body之间有个空行,结构如图2-1:
图2-1Request消息结构
第一行中的Method表示请求方法,比如"
POST"
,"
GET"
,Path-to-resource表示请求的资源,Http/version-number表示HTTP协议的版本号。
当使用的是"
方法的时候,body是为空的
Response消息的结构,和Request消息的结构基本一样。
同样也分为三部分,第一部分叫requestline,第二部分叫requestheader,第三部分是body.header和body之间也有个空行,结构如图2-2:
图2-2Response消息结构
HTTP/version-number表示HTTP协议的版本号,status-code和message请看下节[HTTP状态代码]的详细解释.
2.2.3请求方法
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
本系统主要研究Get请求的特点。
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法。
也可以利用向Web服务器发送'
*'
的请求来测试服务器的功能性。
HEAD向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。
这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET向特定的资源发出请求。
注意:
GET方法不应当被用于产生“副作用”的操作中,例如在webapp.中。
其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
数据被包含在请求体中。
POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT向指定资源位置上传其最新内容。
DELETE请求服务器删除Request-URI所标识的资源。
TRACE回显服务器收到的请求,主要用于测试或诊断。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
方法名称是区分大小写的。
当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(MethodNotAllowed);
当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(NotImplemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。
当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。
此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
其中GET和POST方法是常用的两种请求方法。
它们有着以下的区别:
1.GET提交的数据会放在URL之后,以?
分割URL和传输数据,参数之间以&
相连,如EditPosts.aspx?
name=XXX&
id=XXX.POST方法是把提交的数据放在HTTP包的Body中.
2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
2.2.4HTTP状态代码
HTTP状态码(HTTPStatusCode)是用以表示网页服务器HTTP响应状态的3位数字代码。
所有状态码的第一个数字代表了响应的五种状态之一。
而当网络爬虫必须根据返回的状态代码就行相应的处理。
主要包括5大类消息状态:
1xx:
信息;
2xx:
表示请求成功;
3xx:
重定向;
4xx:
客户端错误;
5xx:
服务器错误
其中200:
请求成功(其后是对GET和POST请求的应答文档)。
本系统主要处理该状态码的消息;
2.3Java多线程
在一个程序中,一些独立运行的程序片断叫做“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
2.3.1定义
线程(Thread):
每个正在系统上运行的程序都是一个进程。
每个进程包含一到多个线程。
进程也可能是整个程序或者是部分程序的动态执行。
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。
也可以把它理解为代码运行的上下文。
所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。
通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程和进程的区别在于,子进程和父进程有不同的代码和