




免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕 业 论 文论文题目 网络爬虫的设计与实现摘 要随着互联网的发展以及网上信息的日益丰富,传统的信息处理已经延伸到互联网领域。在对互联网上的信息进行处理时,常常要将分布在互联网各处的Web页面下载到本地供进一步处理。这便是所讨论的Web页面搜集工具网络爬虫系统的核心功能。由于通用搜索引擎检索返回的结果过多、主题相关性不强以及随着人们对提供的各项信息服务的要求越来越高、越来越细,基于整个Web 的信息采集越来越力不从心。同时它也无法迅速地搜集到足够的最新的网络信息,也不能满足人们日益增长的个性化需求。本文所述的网络爬虫程序是采用Java和MySql 5.0实现的。随着网络的迅速发展,万维网成为大量信息的载体,搜索引擎需要获取大量的数据和超链接,如何更有效率的抓取到有用的网页和关键的信息,网络爬虫出现就是为了解决的这个问题。同时由于采用多线程并发工作方式,提高爬行的效率。文中给出了爬虫的具体工作流程、URL数据库结构以及相关算法。关键词:网络爬虫 Java 信息抓取目 录1 绪论11.1概述11.2 研究的意义11.3 所开发的语言简介21.4 本文技术介绍21.4.1 Swing编程31.4.2 多线程工作模式简介31.4.3 JDBC访问数据库52 系统总体分析与设计72.1 系统需求分析72.1.1系统总体用例图72.1.1需求细分72.2 系统技术102.2.1搜索抓取策略比较102.2.2正则表达式132.2.3 字符串压缩算法分析143 系统实现153.1开发平台153.2总体结构163.2.1 分层结构163.2.2 包结构163.3各模块功能实现163.2.1 网页下载模块163.2.2 网页分析模块183.2.3 pageRank计算模块203.2.4 网页去重模块213.2.5 网页的数据库管理模块(DAO)223.2.6 工具包234 数据库设计与实现244.1 数据库表概念结构设计244.2 数据库表逻辑结构设计245 总结26参 考 文 献27英 文 摘 要28致 谢29仲恺农业工程学院毕业论文(设计)成绩评定表301 绪论1.1概述随着互联网技术的不断发展,互联网信息呈现着爆炸式的增长,同时互联网用户对信息的需求也在不断增长,在巨大的用户需求中,搜索引擎应运而生,其中Google和百度分别是国内外两大顶级的通用搜索引擎,拥有着庞大的用户数量。但是随着用户对信息需求的不断具体化与精确化,通用搜索引擎中抓取的广度、搜索的精确度与更新的速度这三大难题阻碍着其满足互联网用户对信息具体化和精确化需求,因此主题搜索开始出现。主题搜索是针对某一个专门领域的信息进行搜索,满足互联网用户对信息具体化和精确化的需求。 无论是通用搜索引擎,还是主题搜索引擎,网络爬虫(Web Crawler)在其中都扮演着重要的角色。网络爬虫是搜索引擎获取网页的主要工具,搜索引擎通常在网络爬虫所抓取的网页中对用户的搜索进行匹配,从而得到搜索结果提供给用户。网络爬虫的搜索策略是网络爬虫的实现关键,是搜索引擎的核心技术,同时也通用搜索与主题搜索的最大区别之所在。 本文对当前搜索引擎中的集中搜索策略进行介绍与比较, 研究其中主题搜索较适合的搜索策略,并在此基础上,使用Java多线程实现网络爬虫。网络爬虫系统的最大特色是采用多网络爬虫线程并行工作的方式, 每一个网络爬虫爬取某一个具体的Web站点。这样做的优点有: 1.多线程并发工作的,提高了爬取效率; 2.对一个站点并发搜集的线程数目为1,从而避免了对搜集站点的攻击,防止了Web服务器预备队列的溢出; 3. 与用户的可交互性强,站点在经过用户审核后才交给网络爬虫爬取。从而使用户可以控制网络爬虫系统爬取的方向。1.2 研究的意义随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:(1) 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。 (2) 通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。 (3) 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频/视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。 (4) 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(generalpurpose Web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。1.3 所开发的语言简介Java在1995年的暑假开始在计算机业界就受到了高度注意,特别是在Internet和多媒体(Multimedia)相关产品类方面。Java为何有如此这么大的魅力?人们作如此的比喻: Java在全球资讯网(World Wide Web, WWW)地位就如同电子表格(Spreadsheet)与个人计 算机TTP和FTP等TCP/IP通讯协定相配合。Java应用程序(Applications) 能在网路上开启及连结使用物件,就如同透过URL连结使用一个本地文件系统(Local File System)。 Java具有以下的特点:健壮的(Robust):由Java所编写出的程序能在多种情况下执行而具有其稳定性。Java与 C/C+最大不同点是Java有一个指针模型(Pointer Model)来排除内存被覆盖(Overwriting Memory)和毁损数据(Corrupting Data)的可能性。安全的(Secure):Java是被设计用于网络及分布式的环境中,安全性自必是一个很 重要的考虑。Java拥有数个阶层的互锁(Interlocking)保护措施,能有效地防止病 毒的侵入和破坏行为的发生。 结构中立的(Architecture Neutral):一般而言,网络是由很多不同机型的机器所 组合而成的,CPU和作业系统体系结构均有所不同;因此,如何使一个应用程序可以 在每一种机器上执行,是一个难题。所幸,Java的编译器产生一种结构中立的目标 文件格式(Object File Format);这使得编译码得以在很多种处理器中执行。可移植的(Portable):原始资料型式的大小是被指定的,例如float一直是表示一 个32位元IEEE 754浮点运算数字,因绝大多数的CPU都具有此共同特征。程序库属于 系统的一部份,它定义了一些可移植的程序接口,Java本身具备有很好的可移植性。解释的(Interpreted):Java解释器能直接地在任何机器上执行Java位元码(Bytecodes), 因此在进行程序连结时,时间的节省,这对于缩短程序的开发过程,有极大的帮助。高效能的(High Performance):Java位元码迅速地能被转换成机器码(Machine Code), 从位元码转换到机器码的效能几乎与C与C+没有分别。多线程的(Multi threaded):Java语言具有多线程的功能,这对于交互回应能力及 即时执行行为是有帮助的。动态的(Dynamic):Java比C或C+语言更具有动态性,更能适应时刻在变的环境, Java不会因程序库的更新,而必须重新编译程序。2009年04月20日,oracle(甲骨文)收购sun,Java因此并归甲骨文公司。1.4 本文技术介绍本系统是采用Java中Swing应用系统程序的前端开发的工具,采用了Java的Thread实现了多线程,采用JDBC连接MySql 5.0, 下面简单介绍下主要应用到的相关技术。1.4.1 Swing编程1.Swing简介Java Swing是Java Foundation Classes(JFC)的一部分。在Swing中,Sun开发了一个经过仔细设计的、灵活而强大的 GUI 工具包。Swing是在AWT组件基础上构建的。它所提供的功能要比AWT提供的更为广泛。它也是Java技术的一种标准配置。Swing模型一个Java GUI通常由顶层容器、中间容器以及多个原子组件组成。每个原子组件或容器都可能触发相应事件的产生。容器是一类能够在其中容纳其他组件的特殊组件。Swing的GUI组件类是按照类属层次以树状结构进行组织的。在这个树的最顶层,即树的根部,使一个最基本的容器类,被称为顶层容器。Swing 提供了三个通用的顶层容器类JFrame,JDialog和JApplet。JFrame提供了基于窗体的应用程序,JDialog提供对话框形式的界面,JApplet提供Java小应用程序的界面形式。在顶层容器下是中间容器,用于容纳其他的组件。通常窗格本身在显示界面中是看不到的。面板类Panel是一种中间容器,它的唯一作用是使组件更容易定位。顶层容器通过getContentPane()方法获取内部的一个内容窗格。2.本文用到的Swing控件简介1) JLaber(静态控件):显示一些几乎固定不变的文字或图形描述,一般不能 接受输入信息;2) JTextField(编辑框控件):完成文字的输入输出双向操作,查看并编辑文字,支持单行;3) JTextArea(编辑框控件):完成文字的输入输出双向操作,查看并编辑文字,支持多行;4) JButton(命令按钮控件):响应用户的输入,触发相应的事件。5) JCheckBox(复选框):提供一个制造单一选择开关的方法;6) JComboBox(下拉框):提供一个制造单一选择开关的方法1.4.2 多线程工作模式简介Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用Java命令启动一个Java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。一般常见的Java应用程序都是单线程的。比如,用Java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。图1 多线程状态转换1.4.3 JDBC访问数据库1. JDBC介绍JDBC(Java Data Base Connectivity, Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,同时,JDBC也是个商标名。2. JDBC数据库连接池数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。3.本文数据库连接池代码首先,导入commons-dbcp-1.2.2.jar和commons-pool-1.4.jar包;本文把这些数据库操作方法封装在一个类中,这样可以方便使用。其中主要实现代码如下: import mons.dbcp.BasicDataSource;public class DataSource extends BasicDataSource public DataSource()/使用配置文件将内容写入到配置文件夹this.init();private void init()this.setDriverClassName(com.MySql.jdbc.Driver);/注册驱动this.setUrl(jdbc:MySql:/localhost:3306/spider);/设置urlthis.setUsername(root);/用户名this.setPassword(*);/密码this.setMaxActive(5);/设置最大连接数this.setMaxIdle(10);/设置最大管理数this.setDefaultAutoCommit(true);/设置手动提交this.setMaxWait(5000);/设置最大等待时间2 系统总体分析与设计网络爬虫主要是实现网页超链接的抓取,提供给搜索引擎2.1 系统需求分析2.1.1系统总体用例图 图2为系统总体用例图,所示如下:图2 系统总体用例图2.1.1需求细分 1)网页下载模块图3 网页下载模块活动图2)分析模块图4 分析模块活动图3)URL管理模块图5 url管理模块活动图2.2 系统技术2.2.1搜索抓取策略比较目前搜索抓取策略主要包括广度优先(Breadth First) 、深度优先(Depth First)和最优优先策略(Best First) ,三者都源于图的遍历算法。广度优先和深度优先策略是相对较基础,也是较简单的网页搜索抓取策略。广度优先搜索抓取策略是优先抓取同一阶层的网页,或者优先抓取最先发现的 URL。深度优先搜索抓取策略是优先抓取相邻网页,这里的相邻是以网页中的 URL 作为联接。 目前最优优先策略是各类网络爬虫较为常用的搜索抓取策略, 最优优先策略是根据特定需要而制定的策略,其中最重要的就是网页的重要度计算,主要包括有 Backlink Count、PageRank3、Forward Link Count 和 Location Metric 等。Backlink4指的是链向所测网页的联接,Backlink Count 算法中,如果 Backlink 数量越大,则认为该所测网页的重要度度越高。PageRank 算法的基本思想是如果网页 a 有一个指向网页 b 的联接,则网页 b 拥有 a 的一部分重要度。如果页面 b被页面 a1、a2、an所联接,而 ci 是页面 ai 的链出链接数量,设 d 是重要度削弱因子,则 p 的 AckLink Count值为:IR(p)=(1-d)+d () ci ti IR / ) ( 5。由于一开始并不知道 IR(ti)的值,因此一开始给其赋初值为 1,然后通过不断的迭代计算,最够得到 IR(ti)与 IR(p)的收敛值,而这个值就是网页的 PageRank 值。Forward Link Count 是与Backlink Count 相反的算法,它是以网页的链出链接数目来确定网页的重要度。Location Mertic8是通过对网页 URL 的分析来确定重要度,比如 URL 的域,com要比 net 或者其它要重要;URL 的前缀, 要比 要重要;URL 的层数, 要比 /xx 要重要1。 对于主题搜索抓取来说,通常都是以一部分与主题密切相关的网页 URL作为种子 URL开始进行抓取的起点,而网络爬虫的抓取离原来的种子网页越远,则偏离主题的可能性就越大,所以使用广度优先策略要比深度优先策略效果要好很多。而在最优优先中,Backlink Count、PageRank 与 Forward Link Count 其实与深度优先近似,所以在主题搜索中性能都不能得到发挥,而 Location Mertic 由于对 URL 进行分析,将抓取集中在一系列的 Domain 中,在主题搜索抓取中也能获得不错的效果。本文中,使用的google的pageRank算法计算网页的重要度。下面对pageRank算法做一些说明:例如一个由4个页面组成的小团体:A,B, C 和 D。如果所有页面都链向A,那么A的PR(PageRank)值将是B,C 及 D的和。PR(A) = PR(B) + PR(C) + PR(D)继续假设B也有链接到C,并且D也有链接到包括A的3个页面。一个页面不能投票2次。所以B给每个页面半票。以同样的逻辑,D投出的票只有三分之一算到了A的 PageRank 上。根据链处总数平分一个页面的PR值。最后,所有这些被换算为一个百分比再乘上一个系数q。由于下面的算法,没有页面的PageRank会是0。所以,Google通过数学系统给了每个页面一个最小值1 q。所以一个页面的 PageRank 是由其他页面的PageRank计算得到。Google 不断的重复计算每个页面的 PageRank。如果您给每个页面一个随机 PageRank 值(非0),那么经过不断的重复计算,这些页面的 PR 值会趋向于正常和稳定。这就是搜索引擎使用它的原因。PageRank的特性可以通过以下范例用插图表示:假设一个小网站由三个页面A、B、C组成,A连接到B和C,B连接到C,C连接到A。虽然Page和Brin实际上将阻尼系数d设为0.85,但这里我们为了简便计算就将其设为0.5。尽管阻尼系数d的精确值无疑是影响到PageRank值的,可是它并不影响PageRank计算的原理。因此,我们得到以下计算PageRank值的方程:(A) = 0.5 + 0.5 PR(C)PR(B) = 0.5 + 0.5 (PR(A) / 2)PR(C) = 0.5 + 0.5 (PR(A) / 2 + PR(B)这些方程很容易求解,以下得到每个页面的PageRank值:PR(A) = 14/13 = 1.07692308PR(B) = 10/13 = 0.76923077PR(C) = 15/13 = 1.15384615很明显所有页面PageRank之和为3,等于网页的总数。就像以上所提的,此结果对于这个简单的范例来说并不特殊。对于这个只有三个页面的简单范例来说,通过方程组很容易求得PageRank值。2.2.2正则表达式正则表达式(英文:Regular Expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、Hndel 和 Haendel 这三个字符串,都可以由 H(a|ae)ndel 这个模式来描述。大部分正则表达式的形式都有如下的结构:1)替换 | ,竖直分隔符代表替换。例如gray|grey可以匹配grey或gray。 2)数量限定 某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”,“?”和“*”(不加数量限定则代表出现一次且仅出现一次): + ,加号代表前面的字符必须至少出现一次。(1次,或多次)。例如,goo+gle可以匹配google,gooogle,goooogle等; ? ,问号代表前面的字符最多只可以出现一次。(0次,或1次)。例如,colou?r可以匹配colour或者color; * ,星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次,或1次,或多次)。例如,0*42可以匹配42,042,0042,00042等。 3)匹配 圆括号可以用来定义操作符的范围和优先度。例如,gr(a|e)y等价于gray|grey,(grand)?father匹配father和grandfather。 精确的语法可能因不同的工具或程序而异。在本爬虫程序中采用了下列表达式获取html代码中的信息:匹配URL的正则表达式:http:/(w-+.)+(w-|/|?+)?w-(.com|.net|.edu|.org|.cn|.edu|.html|.jsp|.shtml|.php|.asp|.aspx)(?:/|/.+)?匹配title,script, style标签的正则表达式:title.*?,script.*?,style.*?2.2.3 字符串压缩算法分析1)基于Hash算法的存储。 对每一个给定的URL,都是用一个已经建立好的Hash函数,映射到某个物理地址上。当需要进行检测URL是否重复的时候,只需要将这个URL进行Hash映射,如果得到的地址已经存在,说明已经被下载过,放弃下载,否则,将该URL及其Hash地址作为键值对存放到Hash表中。这样,URL去重存储库就是要维护一个Hash表,如果Hash函数设计的不好,在进行映射的时候,发生碰撞的几率很大,则再进行碰撞的处理也非常复杂。而且,这里使用的是URL作为键,URL字符串也占用了很大的存储空间。2)基于MD5压缩映射的存储。MD5算法是一种加密算法,同时它也是基于Hash的算法。这样就可以对URL字符串进行压缩,得到一个压缩字符串,同时可以直接得到一个Hash地址。另外,MD5算法能够将任何字符串压缩为128位整数,并映射为物理地址,而且MD5进行Hash映射碰撞的几率非常小,这点非常好。 从另一个方面来说,非常少的碰撞,对于搜索引擎的爬虫是可以容忍的。况且,在爬虫进行检测的过程中,可以通过记录日志来保存在进行MD5时发生碰撞的URL,通过单独对该URL进行处理也是可行的public static String md5(String str) char hexDigits = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,a, b, c, d, e, f ;/ 16位加密字符串try byte bytes = str.getBytes();MessageDigest messageDigest = MessageDigest.getInstance(MD5);messageDigest.update(bytes);byte updateBytes = messageDigest.digest();int len = updateBytes.length;char myChar = new charlen * 2;int k = 0;for (int i = 0; i 4 & 0x0f;myChark+ = hexDigitsbyte0 & 0x0f;return new String(myChar); catch (Exception e) return null;3 系统实现3.1开发平台1) 硬件平台l CPU:AMD 闪龙2800+ 1.6GHz;l 内存:1GB;l LCD:17英寸高分辨率;l 显卡:128M以上的显卡;l 硬盘:500G SATA 7200转;2) 软件平台l 操作系统:Windows XP;l 数据库:MySql 5.0;l 开发工具:MyEclipse 6.5 + MySql-Front;3.2总体结构3.2.1 分层结构根据概要设计中的技术架构,我们将系统分为如下几层:1 前台表现层(UI界面)2 业务逻辑层(SessionBean)3 数据持久层(Persistence,DAO层)3.2.2 包结构网页下载模块:com.spider.download网页分析模块:com.spider.analyzpr值计算模块:com.spider.pagerankurl管理模块:com.spider.managerdao模块:com.spider.dao3.3各模块功能实现3.2.1 网页下载模块1)网站下载类图6 downloadPage类图网页下载模块的主要功能是实现网页的下载,通过运用J.URL包实现网页的下载,实现代码如下:连接要下载的网站:URL url = new URL(“”);得到网站放回的字节流downUrl.openStream();然后把字节流写到文件中实现网页的下载保存。2) 下载线程类图7 downloadThread类图下载线程类,主要是使用多线程同时下载网页,提高下载网页的效率,如果把没有把下载线程和分析线程独立出来处理,这样会导致到分析线程运行的时候,下载线程处于空闲状态,从而浪费了时间和效率。在带宽允许的情况下,可以设置比较多的线程同时下载更多网页。3.2.2 网页分析模块1)网页分析类图8 AnalyzPage类图网页分析类的主要功能是实现对下载完成的页面进行分析,获取其中的URL,然后对URL进行去重处理,最终的得到分析页面所有的超链接。在分析类里,每次都到文件中寻找一个下载线程下载完成的文件,并获取它的html代码,之所以不直接把网页存入数据库,是由于文件系统读写是比数据库读写要快的,所以每次只是在文件中读取html代码。在获得html代码后,开始对其进行分析,获取url,通过上面介绍的正则表达式,可以匹配到大部分的url,并对一些没有url进行了排除,例如,后缀为.jsp,.gif,.swf,.js,.dtd等没用的多媒体连接,Javascript连接等。分析完url后,调用url管理模块对url进行分析并写入数据库中,网页分析工作完成。2) 网页分析线程类图9 AnalyzThread类图下载线程类,主要是使用多线程同时分析网页,充分的利用cpu的资源,由于独立类下载线程和分析线程,分析线程只要每次到数据库中获取一条下载完成的url然后到文件中的获取它的html代码即可。3.2.3 pageRank计算模块1)Pagerank类,图10 PageRank类图该类是对pagerank算法的实现,其代码如下public void getPageRank(UrlDao urlDao)List urls = urlDao.getPRUrlList();float sum;float pr;float outLinks;for(int i=0;iurls.size();i+)Url url = urls.get(i);sum = 0;List tempUrls = urlDao.getUrlListByPids(url.getPids();for(int j = 0 ; jtempUrls.size();j+)Url urlTemp = tempUrls.get(j);pr = urlDao.getPageRank(urlTemp.getUrlStr();outLinks = urlTemp.getOutLinks();sum = sum + pr/outLinks=0?1:outLinks;pr = sum * alpha + (1-alpha); formater.setMaximumFractionDigits(2); formater.setMinimumFractionDigits(2); String str = formater.format(pr); trypr = Float.valueOf(str);catch (NumberFormatException e) e.printStackTrace();return;System.out.println(pr);urlDao.updateSearcher(url.getUrlStr(),page_rank,new Float(pr);在数据库中,pids字段记录所有链接到本页面的网页的id。在这里通过split()函数把这些id分析出来,就可以分别拿到多个链接到本页网站的pageRank值。然后对pageRank值带入上面介绍的公式进行进算,最终得到pageRank的值。3.2.4 网页去重模块图11 UrlManager类图UrlManager类主要是对url做去重处理,处理的时候效率是比较重要的,由于本爬虫是爬行出来的网站是保存在数据库中的,因为去重操作要对新得到的url列表和数据库已存在的所有url数据去重,如果每次都从数据库中获取到数据再与之比较,效率是极其低下的。在本程序里,采用了Java中的hashtable对数据库中的url进行保存,它有几个好处,一个是因为它是线程安全的,不会造成多线程的同步问题,另外,hashtable是在内存中实现,所以比较的效率要比存放在磁盘的数据库效率快,再加上这些保存的url都是经过上面介绍的md5加密算法压缩过的16为字符串,进一步提高比较效率。在每次运行程序的时候对hashtable进行初始化,也就是从数据库中读取所有数据放到hashtable中,以后每次把新的数据添加到hashtable中,每次去重操作都不用到数据库中再取数据比较,只是对hashtable中的所有元素进行去重比较就可以了。要注意的是,本程序类比较字符串采用了字符串的hashCode()后的hashCode进行比较,在采用过md5算法压缩后的长度相同的字符串比较的时候则不需要再通过调用其hashCode方法进行比较了。3.2.5 网页的数据库管理模块(DAO)图12 UrlDao类图UrlDao主要封装了对数据库的增删改查的操作,在dao里面实现了很多的方法重写,方面业务逻辑的调用。在异常信息方面,则通过log4j写到日志文件中去。3.2.6 工具包工具包中,封装了多个类,包括了,数据库连接池配置DateSource类,获取数据库连接的JDBCDateSource类,Log4j日志类以及md5字符串压缩类。 4 数据库设计与实现4.1数据库表概念结构设计1)URL存储表URL存储表主要用于存放爬行出来的URL文本,以及存储URL的出度,入度,所有链接到该页面的父页面的pid,最后还包括了网页在系统的存放路径。由于查询的时候主要是通过URL的字符串做条件,所以在URL文本出建立索引,提高查询的效率。2)searcher信息表Sercher表存储了爬行完成的所有URL的信息,这些信息包括了URL的pagerank值,html网页的标题,以及处理过的有用代码,提供给搜索引擎使用。4.2数据库表逻辑结构设计下面是信息表的具体实现:表1 URL存储表字段类 型属 性中文名说 明 idintPKURL的id主键,递增urlvarchar(255)NULLURL的值索引in_linksint(10)0网页的出度out_linksint(10)0网页的入度pidvarchar(1000)NULL父ID串save_pathvarchar(100)NULL保存的路径表2 搜索基本信息表字段类 型属 性中文名说 明 idintPKURL的id主键,递增urlvarchar(255)NULLURL的值索引page_rankfolat1.00网页权重值titlevarchar(100)NULL网页标题page_codemediumtextNULL网页内容5 总结在本次毕业论文设计中,对网络爬虫的原理及其实现方法做了相关的研究。网络爬虫的原理主要是同过网络到互联网下载网页比对其进行分析,最终得到新的超链接,然后对超链接分析进行分析去重。要实现网络爬虫并不困难,但是如何写出一个高效的爬虫需要考虑的问题就多了,由于考虑到网络爬虫的效率的问题,同时也因为本人的水平有限,所以本次设计起来还是比较困难的,而且对于多线程模式的使用不够熟悉,导致多线程的同步问题等都处理得不是很好。另外,网络爬虫最好是保存在文件系统中而不是在数据库中,因为数据库的查询比起文件系统的查找要慢很多的,有一个基于Java的全文检索引擎Lucene,使用它来实现爬虫效率是比较高的,它里面还包括各种搜索引擎需要用到得功能,例如:爬虫,分词,全文检索等。虽然这个爬虫程序有着一些不足以及局限性,但是通过了本次对网络爬虫原理以及周边一些实现技术的研究,本人在得到了较大的提高,对于程序的效率问题的思考也比以前加强了。网络爬虫或是搜索引擎都是一门相当深的课题,如果要写出一个优秀的爬虫或搜索引擎,需要了解的知识面是十分广的。网络爬虫是实现搜索引擎的关键技术之一,而搜索引擎在当下的互联网中的运用是十分之广泛的,所以学习网络爬虫,学习搜索引擎技术,是非常必要的。在今后的工作后,本人将继续研究搜索引擎方面技术以及其他相关知识,不断对本程序进行优化,从而提高自己的能力。参 考 文 献1 张海藩. 软件工程导论(第5版). 北京:清华大学出版社,2008.22 吴功宜. 计算机网络(第3版). 北京:清华大学出版社,2007.33 严蔚敏,吴伟民. 数据结构. 北京:清华大学出版社,2006.84 Bruce Eckel 著,陈昊鹏 译. Java编程思想. 北京:机械工业出版社,2008.15 潘晓雷,于浚泊,王丹等译. Java2入门经典. 北京:机械工业出版社,2007.46 吴亚峰,纪超. Java SE6.0. 北京:人民邮电出版社,2007.117 耿祥义张跃平Java2实用教程 北京:清华大学出版社 ,2007.68 拉佛著计晓云译Java数据结构和算法 北京:中国电力出版社,2006.89 郑阿奇MySql实用教程 北京:电子工业出版社,2008.110 施霞萍 Java程序设计教程 北京: 机械工业出版社,2006.5英 文 摘 要The design and implement of Web SpiderHuang H
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产制造行业标准操作流程指南
- 企业团队协作项目管理框架
- 技术文档撰写与审核流程模板
- 工程项目质量控制标准化检测模板
- 智能化装备安全防护责任书9篇
- 美丽的天池300字9篇
- 农村信息技术服务支持协议文本
- 企业文档分类管理与搜索工具
- 供应链稳定持续承诺函8篇
- 企业风险管理标准化工具与应急预案制定
- 地质年代周期表
- 新闻编辑(修改版)马工程课件 第六章
- GB/T 2930.8-2017草种子检验规程水分测定
- 勘察设计工作大纲
- GB/T 17188-1997农业灌溉设备滴灌管技术规范和试验方法
- 关于国有集团公司采购管理办法【五篇】
- 2022年资阳市雁江区社区工作者招聘考试笔试试题及答案解析
- 2.2 第2课时 基本不等式的综合应用(课件)高一数学(人教A版2019必修第一册)
- 帮助卧床老年人使用便器排便课件
- 【高考英语精品专题】必修1 Unit 1 Life Choices-高考英语-一轮总复习备考方略课件PPT(新教材北师大版)
- 中国传媒大学-新媒体概论(刘行芳)-课件
评论
0/150
提交评论