最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

网络爬虫技术探究

来源:动视网 责编:小OO 时间:2025-10-03 04:12:48
文档

网络爬虫技术探究

JIUJIANGUNIVERSITY毕业论文题目网络爬虫技术探究英文题目WebSpidersTechnologyExplore院系信息科学与技术学院专业计算机科学与技术姓名闻泽班级学号A******指导教师邱兴兴二○一二年五月摘要网络爬虫是一种自动搜集互联息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息,以及网络营销常要的邮箱地址信息等。本文通过JAVA实现了一个基于广度优先算法的爬虫程序。本论文阐述了网络
推荐度:
导读JIUJIANGUNIVERSITY毕业论文题目网络爬虫技术探究英文题目WebSpidersTechnologyExplore院系信息科学与技术学院专业计算机科学与技术姓名闻泽班级学号A******指导教师邱兴兴二○一二年五月摘要网络爬虫是一种自动搜集互联息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息,以及网络营销常要的邮箱地址信息等。本文通过JAVA实现了一个基于广度优先算法的爬虫程序。本论文阐述了网络


JIU JIANG UNIVERSITY

毕 业 论 文

题    目     网络爬虫技术探究         

英文题目 Web Spiders Technology Explore  

院    系     信息科学与技术学院       

专    业      计算机科学与技术        

姓    名           闻泽               

班级学号          A******             

指导教师           邱兴兴             

二○一二年五月

摘  要

网络爬虫是一种自动搜集互联息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息,以及网络营销常要的邮箱地址信息等。

    本文通过JAVA实现了一个基于广度优先算法的爬虫程序。本论文阐述了网络爬虫实现中一些主要问题:为何使用广度优先的爬行策略,以及如何实现广度优先爬行;系统实现过程中的数据存储;网页信息解析等。

 通过实现这一爬虫程序,可以搜集某一站点的所有URLs,并通过得到的URLs采集到页面的内容,在从内容中提取到需要的内容,如邮箱地址以及页面标题等。再将得到的URLs等采集到的数据存到数据库,以便检索。本文从搜索引擎的应用出发,探讨了网络爬虫在搜索引擎中的作用和地位,提出了网络爬虫的功能和设计要求。在对网络爬虫系统结构和工作原理所作分析的基础上,研究了页面爬取、解析等策略和算法,并使用Java实现了一个网络爬虫的程序,对其运行结果做了分析。

关键词:网络爬虫,广度优先 ,搜索引擎

Abstract

The Web Spider is an automated program collects information on the Internet. The Web Spider can not only search engine to collect network information and can be used as directional information collection, directed acquisition of some site specific information, such as recruitment information, rental information, as well as network marketing often have to e-mail address information.

JAVA Implementation of an algorithm based on breadth first Spider program. This paper described the data stored in the Web Spider to achieve some of the major questions: Why use a breadth-first crawling strategy, as well as how to implement the breadth-first crawling; system implementation process; web page information to resolve.

Through the realization of this Spider can collect all of a site's URLs, URLs collected by and get to the page content, to extract from the content, the content, such as email address and page title. And then get the Urls collected was data saved to the database to retrieve. In this paper, the application of the search engine to explore the role and status of a Web Spider search engine, web Spider functionality and design requirements. Web Spider system structure and working principle of the analysis based on study strategies and algorithms of the page crawling, parsing, etc. and use the Java implementation of a Web Spider program, its operating results analysis.

Keywords: Spider, Breadth First Search, Search Engine

1  绪论

1.1 现状分析

从雅虎最初的网页分类技术,谷歌PageRank开始,到目前的百度等搜索引擎的迅猛发展,搜索引擎在互联网中应用领域展示了越来越广泛的作用。

搜索引擎的科学研究价值不仅仅体现在其高技术挑战性,而且表现在其对于整个互联网络乃至民生提供的便捷性和信息高速传达方式,对整个社会的高度的经济促进作用[1]。

从2000年开始在国内的缓慢发展,到目前国内百度,谷歌,搜搜,搜狗,有道等搜索引擎林立,搜索引擎的研究还只是刚刚的开始,如何在Web信息中寻找最符合用户需求的信息展示出来,这不仅在尺度上是空前巨大,而且规范条件也是非常的不确定。及其的系统往往是很难判别出用户真正需要的是什么信息的,而目前乃至以后,用户总是希望以最简短的搜索约束范围(即用户输入的关键字)搜索到自己想要的信息,所以系统得到的输入是一个笼统的模糊的概念,而这种笼统的不确定性的约束范围,和海量数据的处理,已经将搜索引擎研究技术乃至整个科学研究技术带入了一个真正的高度。

在搜索技术中,对信息的处理,既要考虑到数据的客观性,又要考虑到行为的主观性。数据的客观性表现在Web中数据形式的客观存在性,面对任何人,同一网页中的信息是不变的,而主观性则是指,每条信息对于不同用户不同需求所能提供的信息量区别是很大的,这个可以很深刻的理解:一个介绍机器用法的网页对于新用户来说肯定是很有用的,而对于开发者来说,却不一定有用或者作用的层次不同了。搜索引擎技术中客观性和主观性存在很多这样的矛盾之处,而不同的处理方式则会导致最后传达信息量的巨大或细微差别,这是以前的科学技术研究的盲点,而针对目前的社会需求,这又是刻不容缓的需要解决的一个方面,越来越多的人已经对这个领域产生了强大的兴趣。

搜索引擎技术带动了很多相关学科的发展,离散数学,矩阵技术的应用让大家对数学产生了广泛的兴趣,搜索引擎优化技术(SEO)成为了许多人研究和工作的方向,同时也是电子商务的强力武器。而搜索引擎对于人工智能的贡献更是真正具有伟大意义的!自然语言理解,模式识别,机器学习,数据挖掘技术在搜索引擎的发展中得到了强大的提高。而文本分类,多媒体识别,海量数据挖掘,机器在线增量学习,在线分类类聚,信息抽取和摘取,命名等又和实际应用紧密的结合成商用搜索引擎,而其强大的资金后盾,也促进了Web搜索和人工智能行业的大力发展。

1.2 系统开发背景

随着信息时代的到来和发展,Web上的信息正在飞速地增长,这带给人们前所未有护的丰富的信息资源。然而,在给人们提供丰富信息的同时,却在web信息的高效便捷使用方面给人们带来巨大的挑战:一方面Web上的信息种类繁多、丰富多彩,而另一方面却很难找到真正有用的信息。在信息社会中,没有控制和组织的信息不再是一种资源,它倒反而成为信息工作者的敌人。搜索引擎的问世,为快速、准确、有效地获取网络信息资源提供了极大的帮助。搜索引擎是为满足人们搜索网络信息的需要而开发的网络工具,是互联息查询的导航针,是沟通用户与网络信息的桥梁。搜索引擎的出现很大程度上解决了人们在Web上查找信息的困难,但是随着信息多元化的增长,千篇一律给所有用户同一个入口显然不能满足特定用户更深入的查询需求。即现有搜索引擎在提供用户便利获取丰富的信息资源的同时,也存在着种种的不足之处。

(1)查准率低:对任意主题,都可能很容易地包含成百上千的文档,这会使得搜索引擎返回的文档数过于庞大,其中很多相关性并不大,或所包含的内容质量不高。

(2)查全率低:搜索引擎的索引能力正在越来越落后于网络的快速增长速度。

(3)内容相对陈旧:各个搜索引擎搜索到的文件有时是不再有效的,因为网页已被移至别处或不存在。有调查发现,几个不同搜索引擎检索到的第一个文件在网上存在的平均时间是186天。

(4)信息分布不平衡:有83%的站点包含商业的内容,只有6%的站点包含科学或教育的内容。

因而,人们提出了对搜索引擎新的要求:

(l)运行在常规的软/硬件设备之上;

(2)只采集某一特定学科或特定主题的Web信息资源;

(3)能够方便地对专题和学科进行配置。

为了满足这些新的要求,主题爬虫应运而生。主题爬虫就是针对性的为某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。可以简单的说成是搜索引擎领域的行业化分工。由于主题爬虫分类细致精确、数据全面深入、更新及时,并且运用了人工分类以及特征提取等智能化策略,因此它将更加有效和准确。主题爬虫是主题搜索引擎的重要组成部分,它负责对用户感兴趣的某一主题的网页进行抓取。具备普通爬虫的功能,即通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。主题爬虫还具备主题过滤的功能,即使爬虫尽可能多地爬行主题相关的网页,尽可能少地爬行无关网页,对非主题的网页进行剔除。因此,主题爬虫得到越来越多研究者的关注。主题爬虫的优势在于,由于Web上的内容丰富多样,每个主题在其中占的比例都很小,需要采集的内容也相对较少,可以极大地减少时间和存储空间的要求。在时间上的优势保证了网页的及时更新。而且,主题信息采集搜集的内容单一,用户查找时得到的冗余和无用信息也较少[2]。

1.3 系统意义

网络爬虫的工作是不停的抓取互联网上资源的信息,随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,为了解决上述问题,定向抓取相关网页资源的网络爬虫应运而生。网络爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。网络爬虫的准确高效直接关系到搜索引擎的功能是否强大[3]。

1.4 论文主要的工作

(1)针对网络爬虫的工作原理,进行需求分析、结构分析、系统分析。

(2)开始初期的实现,主要实现的功能是:网页抓取、URLs提取、页面内容解析、数据存储等。

(3)系统测试网络爬虫的功能,修改不完善的地方,尽量做到符合基本的功能要求。

1.5 论文结构

本论文主要介绍的网络爬虫的开放过程,全文共分为五章:

第一章绪论,简要的介绍了系统的开放背景级研究现状,以及文本的工作概要;

第二章系统需求分析,主要介绍了系统所要解决的问题,以及系统的体系结构和类结构;

第三章系统总体设计,主要是介绍了系统实现的主要算法策略,以及具体的功能划分;

第四章系统实现,主要介绍了实现的各个功能的具体代码的分析;

第五章系统测试,主要是对整个系统进行各个模块的测试,是否符合要求;

第六章总结与展望,主要讲述了整个系统完成后的心得以及系统的一些缺陷。

论文的致谢和参考文献部分。

2  需求分析

2.1 系统非功能性需求

所谓非功能性需求是指为满足用户业务需求必须具有且除功能需求外的特性。虽然此需求与系统业务逻辑无直接关系,但也影响着系统的质量,不能忽视。本系统的非功能性需求主要包括以下几个方面:

(1)易用性

本系统在功能完善的情况下,用户界面尽量做到简洁友好、便于操作,并应有效地防止误操作的发生。

(2)性能可靠

本系统属于一个需要联网进行抓取数据的系统,因此需要做到用户在使用时,避免影响到用户上网浏览网页出现网速慢的问题。

(3)通用性

本系统可以适应各种系统环境,满足了不同类型用户的需求。

2.2 系统功能需求

通过需求分析,确定本系统有以下一些基本功能: 

(1)前台界面管理:前台界面主要用于对用户输入进行判断处理,再将合法输入提交到处理单元。

(2)Servlet处理程序:主要用于接收传来的初始URL ,然后再调用Spider主程序。

(3)Spider主程序:主要的功能是建立初始队列、解析URLs、抓取内容、数据存储等系统核心的功能。

(4)数据库管理:主要用于存放抓取的数据保存以便用户的检索。

2.3 系统数据流程分析

通过对网络爬虫的数据流动分析,得出数据流程如图2-1所示。

NO

YES

YES

NO

YES

NO

图2-1  爬虫工作原理流程图

网络爬虫是搜索引擎的核心部分,其名称出自Spider 的意译,具有相同词义的词语还有Spider,robots,bots,wanderer等等。网络爬虫定义有广义和狭义之分,狭义上的定义为利用标准的Http协议根据超级链接和Web文档检索的方法遍历万维息空间的软件程序,而广义则是所有能利用Http协议检索Web文档的软件都称之为网络爬虫。网络爬虫是一个功能很强的自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。它通过请求站点上的HTML文档访问某一站点。它遍历Web空间,不断从一个站点移动到另一个站点,自动建立索引,并加入到网页数据库中。网络爬虫进入某个超级文本时,它利用HTML语言的标记结构来搜索信息及获取指向其他超级文本的URL地址,可以完全不依赖用户干预实现网络上的自动“爬行”和搜索。下面将详细分析爬虫的工作流程,通过流程图来描述爬虫的工作原理,本网络爬虫工作原理如下。

(1)将给定的初始URL加入到URL等待队列。

(2)创建爬虫程序,启动爬虫程序。

(3)爬虫线程从URL等待队列中取得任务URL,根据URL下载网页内容,然后解析网页内容,获取超链接URLs以及页面内容信息。如果获取到的URL为相对地址,则需要转换为绝对地址,然后在判断是否为站外地址,是则淘汰站外URLs,如果是不能访问的地址如错误URLs或者不能解析的URL地址,则也要删除掉。再判断这些URL是否已经被下载到,如果没有则加入到URL等待队列[4]。

(4)继续重复的执行步骤(3),直到结束条件满足后则停止继续爬行。

通过图2-1所示的爬虫工作原理流程图,我们可以清楚的知道爬虫的工作流程以及工作的原理。

网络爬虫的主要目的就是爬取用户需要的内容,即尽可能的爬取有关内容的页面,尽可能减少抓取无关页面,对非主题的网页进行剔除,确保网页的质量。因而,在设计主题爬虫时,本文主要采用两种手段来实现高质量主题网页的下载。一是对已经下载到本地的网页进行主题相关性判断,将相关的网页保存,无关的丢弃。二是分析已有信息,预测出与主题相关的URL进行下一轮抓取。在设计的过程中,要考虑到以下几点:

(1)稳定性:设计的总体结构要合理,保证系统能够稳定运行。

(2)高效性:系统采用多线程技术对网页实现高效的抓取。

(3)灵活性:对系统的各个配置参数进行修改,使系统能够更好地运行。

(4)主题性:系统能够很好地应用于不同主题的网页抓取。

基于以上原则,本文对主题爬虫的结构,数据结构、存储文件和所采用的主题采集策略进行了详细设计。

2.4 环境需求

操作系统是winXP;JAVA程序的编写工具是MyEclipse 8.5 M1;数据库是SQLServer 2000。

2.4.1 开发平台

  此系统开发选用的平台是Java Server Page(简称JSP)+SQL Server数据库,它适应于Windows操作系统并能很好的与其应用程序结合,而且SQL Server数据库也易操作,从而大大降低了编程难度。具体如下:

(1)Web服务器采用Tomcat5.5服务器,数据库管理系统为SQL Server。

(2)采用了jdk1.6的环境。

(3)开发工具使用Dreamweaver搭建系统页面框架。

(4)使用Myeclipse工具开发。

2.4.2 系统开发工具

本系统是基于JSP+SQL Server数据库技术实现的,现对JSP技术和SQL Server数据库作简要的介绍。

2.4.3 开发语言

JSP页面由HTML代码和嵌入其中的Java代码所组成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网等特点。JSP的技术的优势:

(1)一次编写,到处运行。在这一点上Java比PHP更出色,除了系统之外,代码不需要做任何更改。

(2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP/PHP的局限性是显而易见的。

(3)JSP技术是用Java语言作为脚本语言的。Java语言是成熟的、强大的、易扩充的编程语言。

(4)高效性与安全性。JSP在执行前先被编译成字节码,字节码由Java虚拟机解释执行,比源码解释效率高。

(5)可维护性。由于JSP技术是一种开放的、跨平台的结构,因此Web服务器、平台及其他组件能很容易升级或切换,且不会影响JSP基本的应用程序。

(6)多样化和功能强大的开发工具支持。Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。

2.4.4 数据库

SQL Server是微软公司的一款数据库产品,它是关系型数据库,针对电子商务、数据仓库和在线商务解决方案的卓越的数据平台。它执行效率高,可在多用户之间有效的分配可用资源,比如:内存、网络带宽和磁盘I/O等。另外,SQL Server可以动态的将自身配置成能有效地使用客户端桌面的可用资源[5]。

2.5 本章小结

这章主要是明确系统开发的需求分析,明确系统要实现的功能,确立系统的功能模块,按照系统开发的流程,先确立系统要实现的功能模块,最后确立系统的用户需求的定位,本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,同时提出了网络爬虫软件开发过程,便于程序员与操作者之间的交流、协作,并作为工作成果的原始依据,同时也表明了本软件的共性,以期能够获得更大范围的应用。

3  系统设计

3.1 系统结构设计

系统总体结构是首先通过前台搜索界面输入给定的URL地址传递给Servelet程序,Servelet程序再调用后台处理程序,处理程序接收到消息,然后开始页面内容解析。如图3-1所示。

前台用户模块

消息传递

用户检索

数据库管理模块

数据存储

后台处理模块

网络爬虫系统结构图

图3-1 系统总体结构

从图3-1可以看到,本系统主要的功能模块有:前台用户模块、后台处理模块、数据库管理模块等。

网络爬虫系统的前台结构如图3-2所示。

图3-2 系统前台结构

网络爬虫系统后台结构如图3-3所示。

 

图3-3 系统后台结构

广度优先队列管理:该队列主要是用于临时存放解析出来的URL,本系统通过UrlNode类实现URL队列的管理。

数据库连接管理:数据库连接是通过DBOperator类实现。

数据存储管理:本系统数据存储是用Snatch()方法实现,该方法将提取的内容存储到数据库中。

页面读取提取管理:页面读取与提取主要是由readFileContent()和parseContent()方法实现,前者用于从给定的URL中读取页面内容,后者用于提取重要的信息。

URL解析管理:该模块主要是用于从种子URL中不断的解析URLs,并放到队列中。实现该功能模块的主要方法是parseHref()。

URL合法检测管理:该模块的作用是检测解析出来的URL是否合法:即是否是站内地址、不能访问的地址、文件地址和已访问地址。

3.2 爬行策略分析

因为本论文实现的爬虫程序的初衷是尽可能遍历某一站点所有的页面的URL以及页面内容。广度优先算法的实行理论是覆盖更多的节点,所以此爬虫程序选择了广度优先算法。广度优先算法实现起来比较简单,只需定义一个数组类就可以实现广度算法。实现的策略基本是:首先是获取最初始URL所对应HTML代码里面所有的URLs,当然都是合法的,非法的URLs都会通过检查类剔除掉。然后依次获取这些URLs对应的HTML代码里面的URLs,当这一层所有的URLs都下载解析完后,在获取下一层URLs的信息。通过这种循环的获取方式实现广度优先爬行。如图3-4所示[6]。

图 3-4 爬行策略树形图

如图3-4,假如a代表初始的URL,b、c、d为以a获取的3个URLs,e、f、g为以b获取的URLs,h、i、j为以c获取的URLs,以此类推。那么这些URLs获取的顺序就是a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p这样一个顺序。当获取到b的URLs之后,并不会马上去解析这些URLs,而是先解析同b在同一层中的c、d对应的URLs。当这一层URLs全部解析完后,再开始下一层URLs。可以看到爬虫策略树形图是一个类似二叉树形的树形结构。

广度爬行的优点是:对数据抓取更容易控制些。对服务器的负载相应也明显减轻了许多。爬虫的分布式处理使的速度明显提高。现实起来也比其他的算法来的容易的。

广度爬行的缺点是:解析URLs效率不是太高。

广度优先算法的等待队列设计如图3-5所示。

图 3-5 URL等待队列

图3-5列举了不同时间段时,URL等待队列的存储状态。第一个方框是将初始URL:a加入到等待队列。第二个方框为,解析a对应HTML获取URLs:bcd,同时删除a。第三个方框为,解析b对应HTML获取URLs:efg,同时删除URL:b。第四个方框为,解析e对应HTML获取URLs:nop,并删除e。通过这样的存储方法实现广度爬行算法[7]。

3.3 爬虫技术分析

3.3.1 IDNS解析扩展

将网页下载之前,首先要经过将URL地址解析成IP地址供socket建立连接使用。

DNS的解析过程的具体步骤如下:

(1)DNS客户机提出域名解析请求,并将该请求发送给本地的DNS服务器;

(2)本地的DNS服务器收到请求后,先查询本地的DNS缓存,如果有该记录项,则本地的DNS服务器就直接把查询的结果返回;

(3)如果本地的DNS缓存中没有该纪录,则本地DNS服务器就直接把请求发给根DNS服务器,然后根DNS服务器再返回给本地DNS服务器一个所查询域(根的子域)的主DNS服务器的地址;

(4)本地服务器再向上一步返回的DNS服务器发送请求,接收请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的DNS服务器的地址;

(5)重复第四步,直到找到正确的纪录;

(6)本地DNS服务器把返回的结果保存到缓存,以备下一次使用,同时将结果返回给客户机。

3.3.2 并行存储

单一线程下载一个网页通常需要几秒钟,为了充分利用网络带宽和系统资源,网络爬虫需要打开许多Socket以便在同一时间连接到许多不同的HTTP服务器。有两种方法来管理多个并发连接:使用多线程和使用非阻塞Socket与事件处理程序。由于网络爬虫的性能受网络和磁盘所限,多CPU的机器一般用处不是很大[8]。

(1)多线程

为了最大限度地提高客户端应用程序的响应能力,可以使用多线程。多线程可以大大提高应用程序的可用性和性能。地址解析后,每个逻辑线程将创建一个客户端socket,连接socket到服务器的HTTP服务上,发送HTTP请求头,然后读取soeket(调用recv函数),直到没有更多的字符可用,最后关闭Socket。最简单的方法是使用阻塞系统调用,它暂停客户端进程,直到请求完成,数据在用户指定的缓冲区可用。当一个线程挂起等待一个连接发送或接收完成时,其他线程可以执行。线程不是为每个请求动态生成的,而是提前分配的固定的线程数。这些线程使用共享并行的工作队列来得到要获取网页的URL。每个线程管理自己的控制状态和堆栈,但共享数据域。因此,一些实现倾向于使用进程而不是线程,这样当一个进程崩溃时,它不会破坏其他进程的状态。并发线程/进程有两个问题。首先,共享的数据结构将导致一些性能的损失,因为线程不能同时访问它们。第二,当线程或进程完成网页抓取,并开始修改文件存放库和索引时,他们可能会导致大量的交叉,随机在磁盘上读写,从而降低磁盘的查询时间。第二个性能问题可能是严重的。为了防止上述问题,众多的抓取线程或进程必须使用一个共享的内存缓冲,信号量和互斥锁。互斥以及由此形成的间接顺序化可能成为系统的严重瓶颈[9]。

(2)非阻塞Socket和事件处理

另一种办法是使用非阻塞Socket。使用非阻塞Socket,一个连接,发送或接收请求都不会阻塞当前线程,而会立刻返回。

系统每隔一段时间对他们实行一次轮询,以判断是否可以进行读写操作。特别是,非阻塞Socket提供了Se1ect()系统调用,它可以让应用程序暂停,等待更多的数据可以读取或向Socket写入,直到预设计时器超时。

Select()事实上可以同时监控几个Socket,暂停请求进程,直到有Socket可以读或写。Select()允许进程只是内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。

3.3.3 中文分词技术

中文自动分词是网页分析的前提。文档由被称作特征项的索引词组成,网页分析是将一个文档表示为特征项的过程。在提取特征项时,中文信息文本中,词与词之间没有天然的分隔符,中文词汇大多是由两个或两个以上的汉字组成的,并且语句是连续书写的。这就要求在对中文文本进行自动分析前,先将整句切割成小的词汇单元,即中文分词(或中文切词)。自动中文分词的基本方法有基于字符串匹配的分词方法和基于统计的分词方法。基于字符串的分词方法又称为机械分词方法,它是按照一定的策略将待分析的汉字符串与一个已知的词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大或最长匹配,和最小或最短匹配;按照是否中文自动分词是中文搜索引擎的关键环节,对搜索引擎系统来说,分词的准与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。另外一种是基于统计的分词方法,它的基本原理是根据字符串在语料库中出现的统计频率来决定其是否构成词。从形式上看,词是稳定的字的组合,因此在上下文如果相邻的字出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息,互信息量体现了汉字之间结合关系的紧密程度,当紧密程度高于某一个闭值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的词组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。词汇切分算法最重要的指标是准确,在兼顾准确性的情况下也要考虑时间复杂度。

3.4 数据库设计

对于SQLSERVER数据库的设计。我建立了1个表,即webinfo,分别有id,url,title,body字段,分别用于存放行数,地址,标题,以及网页内的邮箱地址。JAVA程序和数据之间的通信是通过JDBC实现的。URL信息存储表结构如表3-6所示。

表3-6 webinfo表结构

字段名数据类型长度
IdInt4
urlString50
TitleVarchar8000
BodyText1000
3.5 本章小结

此章节介绍的是如何通过一个给定的URL抓取整个网站内容的描述过程,其中页面中的内容解析是最重要的核心,通过对URL解析过程的分析,使我更加深入的认识到了网络爬虫的工作原理,为巩固JAVA的学习打下了坚实的基础。

4  系统实现

系统实现是软件项目开发过程中的主要部分,在系统实现中要有简洁、美观、可读性好、整体统一等准则。

4.1 系统功能简介

此爬虫程序主要分为三个部分:任务执行端,任务前台界面,数据服务端。一个SPIDER 任务执行端关联一个站点,下载一个基于URL链接的页面,并进行Web 页面解析,得到站内URL 和发现新站点URL。SPIDER的任务执行需要维持一个URL 队列: 任务执行端的URL 队列中存储了站内URL。

SPIDER要获取的对象是存在于网络上数以亿计的网页,这些网页以超链接形式互相联系在一起,每一网页对应一个超链接,也称统一资源定位符(URL)。我们可以把网络看做一个图M(V,E),网络中的网页构成节点集V,他们之间的链接构成边集E,SPIDER正是从某一节点开始,沿着边,遍历图M,每访问到图中一个节点Vi,就进行一定的处理。

为了达到上述目的,一个SPIDER必须被设计成多线程的,A 个线程并发地在网络上协同工作,才有可能在尽可能短的时间内遍历完网络中的网页。但网页数目是如此之大,如果任SPIDER程序无穷地搜索下去,那么程序几乎不能终止。所以我们SPIDER每次工作只访问一个站点。一个再大型的站点,其中的网页数目也是有限的,因此SPIDER程序能在有限的时间内结束。

当SPIDER程序访问到一个网页,必须进行以下几项基本处理:抽取网页中包含的文本;抽取网页中包含的URL,并将其区分为网站内URL或网站外URL。

在这些URL 队列上有大量的操作,包括URL 查找、URL插入、URL 状态更新等。如果SPIDER 以300页每秒的速度下载Web 页面,平均将会产生2000多个URL,因此简单的采用内存数据结构存储这些URL 队列有一定的问题,系统没有足够的内存空间;而采用直接持久化到数据库,则需要大量的数据库连接、查询等操作,系统效率会明显下降。如果采用URL压缩的办法,尽管在一定程度上可以平衡空间和时间的矛盾,但仍然不适用于大规模数据采集的SPIDER。任务前台界面主要工作是将用户输入的URL通过Servlet传递到任务端。数据服务端负责存储解析好的数据。如图4-1所示[10]。

图4-1 Spider体系结构

4.2 核心算法

网络爬虫算法的设计目标是为了解决大规模数据的搜集效率问题。一方面,网络爬虫应该尽可能多的搜集网页;另一方面,网络爬虫在无法进行全面搜集的时候,应该优先选择一些重要的高质量的网页来进行搜集。网页搜集的算法设计一方面体现在设计高效的数据结构上,由于大量的数据无法完全存放在内存中,需要充分利用缓存技术来增加速度。

4.2.1多线程抓取

网页多线程抓取机制由图4-2中的网页抓取控制器来实现。给定一个URL列表,网页抓取控制器对其中的每一个URL顺序启动HTTP连接,将它们对应的网页内容全部下载到本地。多线程抓取机制的过程是这样的,一个进程负责从URL列表中读取下一个待搜集的URL,并将其放到临界区;另外一组进程的每一个都从临界区取出URL,然后启动HTTP连接进行相应处理,如图4-2所示。

图4-2 多线程抓取技术

图4-2描述了多线程抓取机制的内部流程。该图右边的n个HTTP连接处理单元,每一个都单独处理一个HTTP连接,而左边的URL读取器则从URL链接优先队列中读取URL并将其写到URL临界区中。临界区最多可以存放M个URL。在实现时,URL读取器检查URL临界区中的URL数目,如果小于M,则继续往里面加URL;HTTP连接则每次都从URL临界区读取任务,除非M等于0。

4.2.2 编码格式转换技术

Web上的网页包含多种字符集和编码,搜索引擎系统必须对它们进行转换,采用统一字符集和编码方案。对于中文编码,由于中文为相形文字,字符个数多,不能用简单的ASCII字符集表示,所以出现了很多通用的编码格式,其中UTF-8作为一种通用的统一字符编码在Web上大量使用,Google的内部编码机制就是使用UTF-8作为内码转换的。而对于中文,除了用UTF-8编码,也存在国内标准的汉字编码,主要有三种:国标码(GB)、大五码(Bigs)和汉字码(Hz)。其中GB和Bigs编码是8位编码,其特征是一个汉字用两个ASCII字符来表示,而且第一个ASCII字符的最高一位为1。还有一种常用的150编码150-8859-1。在GNU的GLIBC库中有对这些编码的转换支持。

4.3 功能模块实现 

本系统主要有以下几个功能模块:

Check类:该类中包含了一些检测URL是否合法的方法。

DBOperator类:该类中包含了用于连接数据库的方法。

UrlNode类:该类用于维护URL等待队列。

Spider类:该类是主类,包含了网页数据读取以及URL的抽取,解析,保存等一些核心的方法。

GetUrl类:该类用于读取前台传来的起始URL。

4.2.1 种子注入模块

本模块主要工作是通过从给定初始的URL开始抓取,初始URL是由人工挑选的主题站点首页的URL。为了方便记录每个URL的状态以及统一管理,必须将其转化成URL信息库中的格式并存储于库中。种子注入模块就是对初始URL进行检查,将错误的过滤掉,合格的放入到URL信息库中。这些URL将被放到待抓取URL队列中,为第一轮的抓取服务。首先由index.jsp文件通过文本框传URL到Servelet程序由GetURL类来响应,然后将再将接受到得URL通过调用主类Spider来抓取网页,Spider首先会向URL等待队列里请求一个URL。当得到任务URL以后,会通过这个URL得到对应的HTML代码。具体方法是调用readFileContent(String urlString)这个方法:

    public static String readFileContent_Encode(String urlString)

    {

        StringBuffer content = new StringBuffer();

        URL url = null;

        BufferedReader reader = null;

        String line = null;

        try {

            url = new URL(urlString);

    reader = new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));

            line = reader.readLine();

            while (line != null)

            {

                content.append(line + "\\n");

                line = reader.readLine();

            }

            reader.close();

        } 

        catch (MalformedURLException e) 

        {

            e.printStackTrace();

            System.out.println(e.getMessage());

            System.out.println("URL:" + urlString + " ERROR");

        } 

        catch (IOException e) 

        {

            e.printStackTrace();

            System.out.println(e.getMessage());

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

        String contentString = content.toString();            

        return contentString;

}

这个方法是通过调用JAVA里面的URL这个类,可以用给定的URL构造这个类的一个实例,然后通过openConnection()这个方法得到HTML代码的数据流,然后再一行一行地把数据流转换成String字符串,再用StringBuffer将这些字符串拼接成一个完整的HTML代码。

    当得到HTML代码以后,程序就会调用parseContent(String content)方法来解析HTML。

4.2.2 URL读取模块

该模块从页面中提取URLs,主要是通过检索字符串中的href字符串来实现的。对于一个HTML代码,我寻找其中的href=字符串,然后记录它的下表i。然后判断下表i+1位置上的字符是双引号,单引号或者两者皆不是,然后选择对应的字符作为截取URL的终止标记。截取过后的href标记就剔除它与它前面的部分,以便而后的操作可以继续检索href标记,直到正个HTML代码中所有的href标记都被解析过后,操作终止。首页动作片恐怖片爱情片。

例如上面那段HTML代码。我们先检索href=标记,然后判断出第i+1位为一个双引号,所以我们可以截取i+1位到第2个双引号的位置。之间的这段字符串即为URL。当完成这一步操作后,原字符串被截取从“class=”开始。我们继续检索href=标签,判断它的第i+1位为一个单引号,所以我们又截取i+1位到第2个单引号的位置。这步以后原字符串又被截取为“target=”开始,我们可以继续检索href=标签。这个地方href=没有接续任何符号,所以当我们没有发现单引号或双引号的时候,可以判断为这种情况。我们就去检索空格和<标签,以下标较小的字符作为截取URL的结束标记[11]。

    下面是href=后面接续双引号情况的JAVA代码,其他情况的代码方式相同。

private static void parseHref(String content,String dir) throws Exception 

{

        int fromIndex = -1;

        int indexOfa = -1,indexOfHref = -1,beginIndex = -1,endIndex = -1;

        String filename = null;

        String hrefURL = null;

        indexOfa = content.indexOf(a); 

        int i = 1;

        while (indexOfa != -1) 

{

            indexOfHref = content.indexOf(href,indexOfa); 

            if (indexOfHref < a.length())

                return;

            beginIndex = indexOfHref + href.length();

            endIndex = content.indexOf("\\"",beginIndex + 1);

            filename = content.substring(beginIndex,endIndex).trim(); 

            hrefURL = convertFilenameToURL(filename,dir);

            filename = null;

            if (!inUrlQueue(hrefURL)  && Check.urlIsWithinTheLow(hrefURL)

                    && !hasAccessed(hrefURL))

 {

                if (urlQueueHead == null) 

{

                    urlQueueHead = new UrlNode();

                    urlQueueHead.setNext(null);

                    urlQueueHead.setUrl(hrefURL);

                    lengthOfWaiteQueue++;

                    urlQueueRear = urlQueueHead;

                  } 

else 

{

                    temp = new UrlNode();

                    temp.setUrl(hrefURL);

                    urlQueueRear.setNext(temp);

                    urlQueueRear = temp;

                    lengthOfWaiteQueue++;

                    temp = null;

                }

                i++;

            }

            hrefURL = null;

            fromIndex = endIndex + 1;

            indexOfa = content.indexOf(a,fromIndex);

            if (indexOfa < 0)

                return;

        }

    }

在每个URL被截取出来之后,需要判断这些URL是相对地址,还是绝对地址。高清在线科幻电影专区TOM365。

例如上面的HTML代码,如果截取出来的URL为./science/1_2.html这种形式,即为相对地址。我们需要将其转化为绝对地址。假如这个相对地址的父URL为http://www.tom365.com/ 。根据相对地址的概念,所以可以得到这个相对地址的绝对地址为http://www.tom365.com/science/1_2.html。比如像上面的第2种URL,它包含完整的协议信息,域名地址。可以判断它为绝对地址[12]。

当得到这些完整的URL地址以后,我们需要对其进行过滤。很多URL它们指向的文件不是HTML文件,而是一些CSS文件,或者RAR包文件,或者只是接续“#”符号,代表只是调用一段javascript代码。像这种情况我们就直接抛弃这些URLs。

下面是一段实行代码。代码通过检索URL字符串中是否包含“.css”,“.rar”,“.zip”等类似这些后缀来进行判断。

String[]        ".doc

        int k=0;

        while(k            if(urlString.endsWith(pictAndSound[k]))

                return false;

            k++;

     }

4.2.3 URL抽取模块

通过观察研究HTML代码,我们可以知道。HTML代码中,页面之间的跳转,关联是通过href标签来实现的。我们需要获取HTML代码中的URLs,就可以通过寻找href标签来达到目的。

  •  3D 
  • 手机 
  •     通过观察得知,一般href标签是以href=这样的形式出现的。但是不同的网站href=后面的内容有所不同。比如href=“url”这样情况,我们就可以通过截取双引号之间的内容来获取URL;如果是href=‘url’这种情况,我们就需要截取单引号之间的内容来获取URL;或者有些是href=url,我们需要以等号为开始标记,而这种情况通常结尾是空格或者>符号。

        通过这种方法,我们获取网页中大部分的URLs。但是有些URLs是通过提交表单,或者通过javascript来跳转的。这些情况就需要更细致的考虑,才能获取[13]。

    4.2.4 URL检测模块

    该模块主要是用于剔除非站内URL或无法访问的URL,因为截取出来的字符串,可能为相对地址或者绝对地址。所以需要判断URL为绝对地址,还是相对地址。相对地址需要先转化为绝对地址,再进行过滤。因为解析出来的URL地址可能是一些文件的地址,或者为javascript文件或者css文件。这些格式的URL是无法获取HTML代码的,也就不可能进行URL解析。所以我们需要过滤掉这些URLs。然后再进行URL消重处理,最后加入到URL等待队列[14]。

    为了把爬行在同一站点内需要截断指向站外的链接,保证SPIDER总在站内执行,即准确地根据超链URL判断超链是否指向站外。由RFC对URL的定义可知,URL的格式为[protocol://host:port/path?query],一般情况下,同一网站内所有页面对应URL的host是相同的,所以可以使用host匹配作为判断超链是否指向站外的标准。 进一步研究发现,很多大型网站中一个分类目录对应一个主机,所以前面的判断标准必须改进。研究host的组成可知,host的格式一般为[站内分类.站点标志串.站点类型各异的串]。站点类型串只有[ com|edu|gov|net|国家域名]几种类型,所以我们取站点类型各异串前面的串,即站点标志串作匹配,超链URL的host中是否包含此串,为超链是否站内的判断标准。下面的这段代码就是判断是否非站内地址,代码如下:

    String[] host_inner={".cn

    for(int i=0;i{

        if(Spider.initURL.contains(host_inner[i]))

    {

    String str = Spider.initURL.substring(0,Spider.initURL.indexOf(host_inner[i]));

    if(urlString.contains(str.substring(str.lastIndexOf('.'))+host_inner[i]))

    return true;

    else

              return false;

    }

    }

    4.2.5 URL存储模块

    我们通过链表类URLNode实现URL存储,链表的优点在于插入数量可以无限,所以通过该类较容易实现URL的管理。

    public void startSnatch(String urlStr) {

            int id = DBOperatorToMySql.id_num()+1;

            String urlString = urlStr;

    if (!Check.urlIsWithinTheLow(urlStr)) { // 最初查询的网页默认为合法的

                System.out.println("URL ERROR");

            }

            urlQueueHead = new UrlNode();

            urlQueueHead.setNext(null);

            urlQueueHead.setUrl(urlString);

            lengthOfWaiteQueue++;

            urlQueueRear = urlQueueHead;

            while (urlQueueHead.getUrl() != null) { // 如果待抓取的队列不为空,则操作

                urlString = urlQueueHead.getUrl(); // 待队列非空时首元素出队列,则抓取

                urlQueueHead = urlQueueHead.getNext(); // 抓取的网页URL要出对列

                lengthOfWaiteQueue--;

                accessedURLVector.add(urlString); // 把访问过的URL存入访问记录向量

                snatch(id,urlString);

                id++;

            }

     }

    4.2.6 邮箱地址解析

    我们知道,现在网络上有多营销策略,群发邮箱是一种途径,如何大量的获得有效且定向的邮箱地址是很多营销者最为关注的问题,因此邮箱抓取是一个很有用的功能。

    邮箱跟URL都是页面中的重要的内容,所有解析方式差不多,邮箱地址解析主要通过读取body标签的内容,通过邮箱地址正则表达式判断是否是合法的地址,然后解析出来。代码实现如下:

        public static String parse(String line) {

            Pattern p = Pattern.compile("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\\\.[a-zA-Z0-9_-]+)+");//邮箱的//正则表达式

         String temp="";

         Matcher m = p.matcher(line);

            while(m.find()) {//是否有匹配的邮箱地址

                temp=temp+" "+m.group();

            }

            return temp;

        }

    4.2.7 URL消重管理

    消重管理是为了防止重复下载URL,具体代码如下:

        private static boolean hasAccessed(String urlString) {

            boolean accessed = false;

            if (accessedURLVector.isEmpty()) return accessed;

            for (int i = 0; i < accessedURLVector.size() && !accessed; i++) {

                if (urlString.equalsIgnoreCase(accessedURLVector.get(i)))

                    accessed = true;

            }

            return accessed;

        }

    检测URL是否是已访问过的网页,首先要检测一下urlString的URL合法性将已访问的URL加入到“已访问URL队列”[15]。

    4.4 数据库实现.

    使用JDBC连接池技术连接Mysql数据库,代码如下:

    package com.mingzi.spider;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.SQLException;

    import java.sql.Statement;

    public class DBOperator {

        static String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

        static String userName = "pachong";

        static String password = "123456";

        static String url = "jdbc:sqlserver://localhost:1433; dataBase=javadatabase";

        static Connection connection = null;

        static Statement state = null;

        static String sqlStatement = null;

        /**

         * 初始化数据库,把已经有的表格删除掉,建立新的所需要的数据库表格

         */

        public static void initDB() {

            sqlStatement = "";

            try {

                Class.forName(driverName).newInstance();

                connection = DriverManager.getConnection(url, userName, password);

                state = connection.createStatement();

                state.executeUpdate(sqlStatement);

                state = null;

                connection.close();

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            } catch (InstantiationException e) {

                e.printStackTrace();

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        /**

         * 此方法把记录存入数据库中

         */

        public static void saveFieldToDB(int id, String urlField,

                String titleField, String bodyField){

                 sqlStatement = "insert into dbo.webinfo" + "  values(" + id + ",'"

                    + urlField + "','" + titleField + "','" + bodyField +"');";

            try {

                Class.forName(driverName).newInstance();

                connection = DriverManager.getConnection(url, userName, password);

                state = connection.createStatement();

                state.executeUpdate(sqlStatement);

                state = null;

                connection.close();

            } catch (ClassNotFoundException e) {

                e.printStackTrace();

            } catch (InstantiationException e) {

                e.printStackTrace();

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

    4.5 本章小结

    此系统是一个网络爬虫系统,在开发的过程中发现要做一个完整的系统需要的技术是很多的,需要经常编程和查看资料,才能开发出良好的系统,也让我知道了为什么开发一个大型的系统需要许多人一个团队的协作才能完成。在开发的过程中许多需要的技术都不懂或者用的不熟练,只有不停地查资料问百度,在这个过程中学习到了很多新知识,让我受益匪浅。

    5  系统测试

    5.1 抓取测试

    我以网易论坛地址http://bbs.163.com/为初始URL进行系统的测试,通过本爬虫程序实现URLs解析以及内容抓取。

    首先登陆首页,出现前台的界面,如图5-1所示。

    图5-1 前台爬行和搜索界面

    通过观察,我们发现,前台由两个文本框两个按钮,第一个文本框用于输入种子地址,第二个文本框用于输入搜索的关键字。

    当用户输入一个种子地址到一个文本框中,然后按“爬一下”后,系统将用户输入的地址传递到后台,然后从该网站开始爬行,直到所有的URLs全部抓取完毕,

    如此同时,用户可以在第二个文本框中输入特殊关键字,查询到所需要的内容信息,系统将会根据用户的关键字匹配数据中的内容信息,然后再将数据输出到前台,用户就可以获得想要的信息。

    爬虫程序爬行了几分钟后总共爬了几百条URLs,下面是从数据库里截图的3字段的爬行结果。

    图5-2是抓取到的URL连接,图5-3是在页面中抓取的邮箱地址,通过图5-2,我们发现不存在非法链接,说明爬虫有效的实现了既有的功能。如图5-2所示。

     

    图 5-2 解析到的URL地址                 图 5-3邮箱地址

    通过图5-2和图5-3,我们可以看到,程序基本完成了对既定的URL地址实现了站内地址的解析和邮箱地址信息的抓取,基本实现了程序要求的功能。但是程序的功能比较单一,功能不够强大,只是简单的模拟了真正意思上的搜索引擎网络爬虫的爬虫的过程。

    但是通过实现基本的爬虫程序的爬行原理,我们可就基本的掌握最核心的爬虫策略,然后我们可以在原有的基础上做出更加强大的爬虫程序来,实现更多有意义的功能。

    本程序还有很多的不足之除,希望通过进一步的学习,可以写出更好的爬虫程序。并且图形界面设计的也不太尽如人意。这在以后的开发中还要进一步的加强和重视。

    图5-4是抓取的部分URLs中页面的标题。我们可以看到有的一些标题出现乱码,这是由于不同网站编码格式不同,导致了读取数据时不能统一的处理汉字所致,所以才出现了乱码。后续还要继续完善这个程序,如图5-4所示。

    图5-4 页面标题

    5.2 搜索测试

    接下来测试搜索功能,因为数据已采集到数据库,可以通过关键字前台调用,

    近似已模仿了百度搜索。我们以关键字“新闻”搜索如图5-5所示。

    图5-5 搜索结果

    至此爬虫程序的测试工作完毕。我们可以看到,程序有很多的地方不足,我希望在以后的工作学习中继续完善该程序的功能和错误,以便提高自己的动手能力和编程的熟练程度。

    5.3 本章小结

        本章主要是对系统进行测试,编制测试大纲。测试大纲是测试的依据。它明确详尽地规定了在测试中针对系统的每一项功能或特性所必须完成的基本测试项目和测试完成的标准,根据测试大纲设计和生成测试用例。在设计测试用例的时候,可综合利用前面介绍的测试用例和设计技术,产生测试设计说明文档,其内容主要有被测项目、输人数据、测试过程、预期输出结果等,实施测试。测试的实施阶段是由一系列的测试周期组成的。在每个测试周期中,测试人员和开发人员将依据预先编制好的测试大纲和准备好的测试用例,对被测软件或设备进行完整的测试。

        

    6总结与展望

    顺利的完成本次毕业设计给了我很大的信心,让我了解专业知识的同时也对本专业的发展前景充满信心,本系统采用的是Java技术编程。 它有着许多的优越性,但也存在一定的不足,这些不足在一定程度上了我们的创造力。只有发现问题面对问题才有可能解决问题,不足和遗憾不会给我打击只会更好的鞭策我前行。

    互联网的发展促进了信息传播方式的变革,以互联网为载体的海量信息检索推动了搜索引擎技术的发展,主题爬虫是搜索引擎的一个重要研究领域。本文围绕主题爬虫的设计和实现,探究了该领域的各项技术和面临的问题,尤其对搜索策略,网页的存储,URL的消重等方面提出了自己的见解。研究了爬虫系统如何实现URL的消重和网页的存储,从而有效的压缩了维护URL队列所需的空间。

    总的来说,主题爬虫是具有很高技术含量的领域,要设计一个性能优良的系统需要考虑很多因素,本文在以下几方面的研究工作还需进一步的提高:

    (1)系统没有采用多线程的方式,一定程度上影响了系统的抓取速度。

    (2)系统数据存储没采用文件方式,当数据量太大的时候会影响到系统的性能。

    (3)系统在抓取不同编码的网站时,会出现内容的乱码。

      致谢

    当这篇论文最终完成的时候,我要向给予过我热情帮助和悉心指导的老师和师兄们致以真诚的谢意。

    首先,我要感谢我的导师,感谢他带给我来学习的机会,感谢他对我学术上的悉心指导,感谢他对我生活上的关怀和体贴。导师是不仅是我学业上的导师,更是生活中让我敬佩的学者、长者。给我留下深刻印象的,是他知识的渊博、治学态度的严谨、诲人不倦的学者风范,是他谦逊待人、处处关心别人的长者风度,是他勤奋忘我的工作态度、精益求精的治学作风。特别是老师做大事的风范和气度,尤其让我钦佩。这里我要再次感谢老师。

      参考文献

    [1]  罗刚等.自己动手写网络爬虫[M] .北京:清华大学出版社,2010.1~10

    [2]  杨厚群等.Java 程序设计[M] .北京:中国铁道出版社,2008.20~38

    [3]  朱明.数据挖掘导论.[M] .北京:中国科学技术大学出版社,2012.9~18

    [4]  邵峰晶等.数据挖掘原理与算法[M] .北京:科学出版社,2009.34~40

    [5]  高克宁等.支持Web信息分类的高性能蜘蛛程序[J] .小型微型计算机系统,2006,07:12~21

    [6]  诶克尔.Java编程思想[M] .北京:机械工业出版社,2007.100~120

    [7]  潘雪峰等.走进搜索引擎(第2版)[M] .北京:电子工业出版社,2011.11~15

    [8]  邱哲等.开发自己的搜索引擎---Lucene+Heritrix(第2版)[M] .北京:人民邮电出版社,2010.10~25

    [9]  (新)威顿(Witten I.H.)等.深入搜索引擎——海量信息的压缩、索引和查询[M] .北京:电子工业出版社,2009.28~39

    [10] (美)克罗夫特等.搜索引擎:信息检索实践[M] .北京:机械工业出版社,2010.19~22

    [11] 张俊林.这就是搜索引擎:核心技术详解[M] .北京:电子工业出版社,2012.3~8

    [12] 崔泽永等.搜索引擎的Web Robot的技术与优化[J] .微机发展,2004,14(4):80~90

    [13] 王晓东.算法设计与分析(第2版)[M] .北京:清华大学出版社,2008.1~14

    [14] (美)科曼(Cormen T.H.)等.算法导论(原书第2版)[M] .北京:机械工业出版社,2006.9~13

    [15] 刘奕群等.搜索引擎技术基础[M] .北京:清华大学出版社,2010.5~10

    文档

    网络爬虫技术探究

    JIUJIANGUNIVERSITY毕业论文题目网络爬虫技术探究英文题目WebSpidersTechnologyExplore院系信息科学与技术学院专业计算机科学与技术姓名闻泽班级学号A******指导教师邱兴兴二○一二年五月摘要网络爬虫是一种自动搜集互联息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息,以及网络营销常要的邮箱地址信息等。本文通过JAVA实现了一个基于广度优先算法的爬虫程序。本论文阐述了网络
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top