页面评价算法————pagerank算法
网页评价算法作为网页的组织管理工具,充分利用了互联网的巨大链接结构,即一个网页被其他网页链接的数量就决定了该网页的重要性。网页评价算法可以保证系统对用户的需求给出快速响应,把最重要的网页优先显示给用户。
pagerank算法原理:
假设有五个网页A,B,C,D和E,他们相互链接。
因为用户不可能无限地单击链接,常常会因为劳累而随机跳入另一个页面,所以引入阻尼系数d可以看作用户无限单击下去的概率,1-d就是页面本身所具有的网页级别。
为了计算简单,可以将阻尼系数d设为0.5。则下面我们计算一下链接后这五个网页各自的PageRank的情况。
链入页面越多的网页,其排名越靠前。
Google使用随机矩阵的方式来表示网页之间的连接,这种随机矩阵的特点是每行的和是1。
在计算过程中,先给每个网页一个初始值,在迭代过程中,每个网页的网页评分的和是收敛于整个网络页面数的,所以,虽然开始迭代时每个页面的平均网页级数是1,实际上的结果值在(1-d)和(dN+(l-d))之间,它们的迭代过程如表所示。通过迭代计算,直到每个页面的数值逼近一个定值。
综上,得到标准的pagerank算法。Google设置的阻尼系数是0.85
基于java实现pangeRank算法
页面评价算法————PageRank算法性能评价
PageRank算法是著名搜索引擎Google的核心算法并受到瞩目,但深入研究发现,该算法还是存在明显缺陷,PageRank算法偏重旧网页,一个网页的重要程度是由指向该网页的链接个数决定,比如一个网页放到网上不久,那么指向它的网页就很少,通过计算后的PageRank值就很低,在搜索引擎返回结果中就被排在了较后的位置,可是,越旧的网页排名则越靠前。然而,有些情况下,用户是希望先看到较新的网页。还有,因为PageRank算法是基于网页链接结构进行分析的算法,因此,不能区分网页中的超链接与网页的主题是否有关,这样就很容易出现搜索引擎排序结果中出现大量与查询主题无关的网页,产生主题漂移现象。
经过前面的学习,我们已经了解搜索引擎的实现过程可以看作三步:
- 从互联网上抓取网页
- 对网页进行处理,建立索引数据库
- 进行查询。因此无论什么样的搜索引擎,都
必须要有一个设计良好的爬虫来支持。
Heritrix 是基于 Java 的开源爬虫,它可以通过 Web 用户界面来启动、设置爬行参数并监控爬行,同时开发者可以随意地扩展它的各个组件,来实现自己的抓取逻辑,因其方便的可扩展性而深受广大搜索引擎爱好者的喜爱。
Heritrix应用————概述
虽然 Heritrix 功能强大,但其配置复杂,而且官方只在 Linux 系统上测试通过,用户难以上手。现在详细介绍 Heritrix 在 windows 下 Eclipse 中的配置运行,并对其进行简单扩展,使其只针对某一特定网站进行抓取,为构建相应站点的全文搜索引擎打好基础。
虽然 Heritrix 功能强大,但其配置复杂,而且官方只在 Linux 系统上测试通过,用户难以上手。现在详细介绍 Heritrix 在 windows 下 Eclipse 中的配置运行,并对其进行简单扩展,使其只针对某一特定网站进行抓取,为构建相应站点的全文搜索引擎打好基础。
本章使用的 Heritrix 的版本是 1.14.4(不是上周的3.1)下载地址(FTP课件文件夹中有提供):
http://sourceforge.net/projects/archive-crawler/files/
每个版本都有四个压缩包,两个 .tar.gz 包用于 Linux 下,.zip 用于 windows 下。其中 heritrix-1.14.4.zip 是源代码经过编译打包后的文件,而 heritrix-1.14.4-src.zip 中包含原始的源代码,方便进行二次开发。本章需要用到 heritrix-1.14.4-src.zip,将其下载并解压至 heritrix-1.14.4-src 文件夹。
首先在 Eclipse 中新建 Java 工程 MyHeritrix。然后利用下载的源代码包根据以下步骤来配置这个工程。
- 导入类库
Heritrix 所用到的工具类库
都在 heritrix-1.14.4-src\lib
目录下,需要将其导入工程。
将 heritrix-1.14.4-src 下的
lib 文件夹拷贝到 MyHeritrix
项目根并添加引用。
Heritrix应用————在 Eclipse 中的配置
- 拷贝源代码
1)将 heritrix-1.14.4-src\src\java 下的 com、org 和 st 三个文件夹拷贝进 MyHeritrix 工程的 src 下。这三个文件夹包含了运行 Heritrix 所必须的核心源代码;
2)将 heritrix-1.14.4-src\src\resources\org\archive\util 下的文件 tlds-alpha-by-domain.txt 拷贝到 MyHeritrix\src\org\archive\util 中。该文件是一个顶级域名列表,在 Heritrix 启动时会被读取;
3)将 heritrix-1.14.4-src\src 下 conf 文件夹拷贝至 Heritrix 工程根目录。它包含了 Heritrix 运行所需的配置文件;
4)将 heritrix-1.14.4-src\src 中的 webapps 文件夹拷贝至 Heritrix 工程根目录。该文件夹是用来提供 servlet 引擎的,包含了 Heritrix 的 web UI 文件。需要注意的是它不包含帮助文档,如果想使用帮助,可以将 heritrix-1.14.4.zip\docs 中的 articles 文件夹拷贝到 MyHeritrix\webapps\admin\docs(需新建 docs 文件夹)下。或直接用 heritrix-1.14.4.zip 的 webapps 文件夹替换 heritrix-1.14.4-src\src 中的 webapps 文件夹,缺点是这个是打包好的 .war 文件,无法修改源代码。
拷贝完毕后的 MyHeritrix 工程目录层次如图 所示。这里运行 Heritrix 所需的源代码等已经准备完备。
3. 修改配置文件
conf 文件夹是用来提供配置文件的,里面包含了一个很重要的文件:heritrix.properties。heritrix.properties 中配置了大量与 Heritrix 运行息息相关的参数,这些参数的配置决定了 Heritrix 运行时的一些默认工具类、 Web UI 的启动参数,以及 Heritrix 的日志格式等。当第一次运行 Heritrix 时,只需要修改该文件,为其加入 Web UI 的用户名和密码。
如图 所示,设置
heritrix.cmdline.admin = admin:admin,“admin:admin”
分别为用户名和密码。然后设置版本参数为 1.14.4。
- 修改配置文件
conf 文件夹是用来提供配置文件的,里面包含了一个很重要的文件:heritrix.properties。heritrix.properties 中配置了大量与 Heritrix 运行息息相关的参数,这些参数的配置决定了 Heritrix 运行时的一些默认工具类、 Web UI 的启动参数,以及 Heritrix 的日志格式等。当第一次运行 Heritrix 时,只需要修改该文件,为其加入 Web UI 的用户名和密码。
如图 所示,设置
heritrix.cmdline.admin =
admin:admin分别为用户名和
密码。然后设置版本参数为
1.14.4。
- 配置运行文件
在 MyHeritrix 工程上右键单击选择“Run AsRun Configurations”,确保 Main 选项卡中的 Project 和 Main class 选项内容正确,如图 所示。其中的 Name 参数可以设置为任何方便识别的名字。
然后在 Classpath 页选择 UserEntries 选项,此时右边的 Advanced 按钮处于激活状态,点击它,在弹出的对话框中选择“Add Folders”,然后选择 MyHeritrix 工程下的 conf 文件夹。
5.启动Heritrix
找到 org.archive.crawler 包中的 Heritrix.java 文件,它是 Heritrix 爬虫启动的入口,右键单击选择“Run AsJava Application”,如果配置正确,会在控制台输
出如图所示的启动信息。
在浏览器中输入 http://localhost:8080,会打开Web UI 登录界面。用户名和密码均为
Admin
Heritrix 使用 Web 用户界面来启动、设置爬行参数并监控爬行,简单直观,易于管理。下面以 (http://product.pconline.com.cn/mobile/)为种子站点来创建一个抓取实例。
在 Jobs 页面创建一个新的抓取任务,可以创建四种任务类型。
Based on existing job:以一个已经有的抓取任务为模板生
成新的抓取任务。
Based on a recovery:在以前的某个任务中,可能设置过
一些状态点,新的任务将从这个设置的状态点开始。
Based on a profile:专门为不同的任务设置了一些模板,
新建的任务将按照模板来生成。
With defaults:这个最简单,表示按默认的配置来生成一个任务
选择“With defaults”后输入任务相关信息。
注意下方的按钮,通过这些按钮可以对抓取工作进行详细的设置,这里我们只做一些必须的设置。
首先点击“Modules”按钮,在相应的页面为此次任务设置各个处理模块,一共有七项可配置的内容,这里我们只设置 Crawl Scope 和 Writers 两项,下面简要介绍各项的意义。
1)Select Crawl Scope:Crawl Scope 用于配置当前应该在什么范围内抓取网页链接。例如选择 BroadScope 则表示当前的抓取范围不受限制,选择 HostScope 则表示抓取的范围在当前的 Host 范围内。在这里我们选择 org.archive.crawler.scope.BroadScope,并单击右边的 Change 按钮保存设置状态。
2)Select URI Frontier:Frontier 是一个 URL 的处理器,它决定下一个被处理的 URL 是什么。同时,它还会将经由处理器链解析出来的 URL 加入到等待处理的队列中去。这里我们使用默认值。
3)Select Pre Processors:这个队列的处理器是用来对抓取时的一些先决条件进行判断。比如判断 robot.txt 信息等,它是整个处理器链的入口。这里我们使用默认值。
4)Select Fetchers:这个参数用于解析网络传输协议,比如解析 DNS、HTTP 或 FTP 等。这里我们使用默认值。
5)Select Extractors:主要是用于解析当前服务器返回的内容,取出页面中的 URL,等待下次继续抓取。这里我们使用默认值。
6)Select Writers:它主要用于设定将所抓取到的信息以何种形式写入磁盘。一种是采用压缩的方式(Arc),还有一种是镜像方式(Mirror)。这里我们选择简单直观的镜像方式:org.archive.crawler.writer.MirrorWriterProcessor。
7)Select Post Processors:这个参数主要用于抓取解析过程结束后的扫尾工作,比如将 Extrator 解析出来的 URL 有条件地加入到待处理的队列中去。这里我们使用默认值。
设置好的Modules如下:
设置完“Modules”后,点击“Settings”按钮,这里只需要设置 user-agent 和 from,其中:
•“@VERSION@”字符串需要被替换成 Heritrix 的版本信息。
•“PROJECT_URL_HERE”可以被替换成任何一个完整的 URL 地址。
•“from”属性中不需要设置真实的 E-mail 地址,只要是格式正确的邮件地址就可以了。
对于各项参数的解释,可以点击参数前的问号查看。
![ 完成上述设置后点击“Submit job”链接,然后回到 console
控制台,可以看到刚刚创建的任务处于 pending 状态。
点击“Start”启动任务,刷新一下即可看到抓取进度以及相关
参数。同时可以暂停或终止抓取过程。
点击“Start”启动任务
完成上述设置后点击“Submit job”链接,然后回到 console
控制台,可以看到刚刚创建的任务处于 pending 状态。
点击“Start”启动任务,刷新一下即可看到抓取进度以及相关
参数。同时可以暂停或终止抓取过程。
点击“Start”启动任务
同时,在 MyHeritrix 工程目录下自动生成“jobs”文件夹,包含本次抓取任务。抓取下来网页以镜像方式存放,也就是将 URL 地址按“/”进行切分,进而按切分出来的层次存储。
在绿红相间的长条左侧,是几个实时的运行状态,其中包括抓取的平均速度(KB/s)和每秒钟抓取的链接数(URIs /sec),另外的统计还包括抓取任务所消耗的时间和剩余的时间,不过这种剩余时间一般都不准,因为URI的数量总是在不断变化,每当分析一个网页,就会 有新的URI加入队列中。
在绿红相间的长条右侧,是当前的负载,它显示了当前活跃的线程数量,同时,还统计了Heritrix内部的所有队列的平均长度。
系统的资源消耗:每秒下载的速率已经达到了62KB,另外,平均每秒有5.85 个URI被抓取。在负载方面,初设的50个线程均处于工作状态,最长的队列长度已经达到了1118个URI,平均长度为8。从进度条上看,总共有29460个 URI等待抓取,已经完成了2227个URI的抓取,另外,下载的字节总数也已经达到了26mB。再观察一下左边,仅用时5m50s。可见,多线程抓取的速 度还是很快的。
在实验中可以忽略内存的影响。但在真正的开发过程中这个属性比较关键。使用Heritrix 时,至少应为其分配512M的最大HeapSize,也就是在启动它时,应该设置-Xmx512m经为其加入了该参数,而如果要在使用Eclipse启动Heritrix时也设置该参数,具体的设置方法如下图所示。
Heritrix应用———— 运行状态管理
输入Java虚拟机的参数,就可以增大Heritrix的最大可用内存。如 使用了-Xm。x512m参数后的Console界面。
在运行的过程中,值得注意的一点是,进度条的百分比数量并不是准 确的。因为这个百分比实际上是已经处理的链接数和总共分析出的链接数的比值。当页面在不断被抓取分析时,链接的数量也会不断的增加,因此,这个百分比的数 字也在不断的变化。
Heritrix 采用了模块化的设计,用户可以在运行时选择要用的模块。它由核心类(core classes)和插件模块(pluggable modules)构成。核心类可以配置,但不能被覆盖,插件模块可以由第三方模块取代。所以我们就可以用实现了特定抓取逻辑的第三方模块来取代默认的插件模块,从而满足自己的抓取需要。
其中 CrawlController(下载控制器)整个下载过程的总控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。每个 URI 都有一个独立的线程,它从边界控制器(Frontier)获取新的 URI,然后传递给 Processor chains(处理链)经过一系列 Processor(处理器)处理。
说明:
Web Administrative Console: 就是一个基于web的控制台。Heritrix内嵌了Jetty。
CrawlOrder:crawl任务的配置。是一个基于XML的object。Heritrix根据CrawlOrder中的配置,选择合适的模块来组装这次抓取任务的程序。而且,它还包括了一些很重要的信息,比如抓取任务的seeds,还有抓取url的范围,等等。
CrawlController:抓取的核心程序,它读取CrawlOrder来配置内部的模块和参数,Web Console也是和它做交互来控制爬虫。
CrawController内部组成
CrawlController内部组成:
整个下载过程的总的控制者,整个抓取工作的起点,决定整个抓取任务的开始和结束。从Frontier获取URI,传递给
线程池(ToePool)中的ToeThread处理。
Frointier(边界控制器)
主要确定下一个将被处理的URI,负责访问的均衡处理,避免对某一web服务器造成太大的压力。
它保存着crawl的状态:
(1)发现的URI(URIs have been discovered)
(2)正在被处理的URI(URIs are being processed (fetched))
(3)已经处理的URI(URIs have been processed)
TeoThread(处理线程)
Heritrix是多线程的,每一个URI被一个ToeThread处理。
Processor(处理器)
许多Processor组成一个处理链(processor chains)中,每一个处理链对URI进行一系列的处理。下图为处理器的整个结构图:
(1)Pre-fetch processing chain(预处理链)
主要根据robot协议,DNS以及下载范围控制信息判断当前URI是否应当处理。
(2)Fetch processing chain(抓取处理链)
从远程服务器获取数据
(3) Extractor processing chain(抽取处理链)
从网页中抽取新的URI
(4)Write/index processing chain(写处理链)
负责把数据写入本地磁盘
(5)Post-processing chain(后置处理链)
由CrawlStateUpdater,LinksScoper,FrontierScheduler构成。
Post Processing补充说明:
每一个从Frontier中
调度出来的url都需要经历
这些步骤。所以,在爬虫的
运行过程中,Frontier和这些
Processing Chain构成了一
个环,Frontier将需要处理的
url放入Processor Chain
中,从Processor Chain中
提取出的新的url再被放入
Frontier中。
Heritrix内嵌的Extractor并不能够很好的完成所需要的工作,这不是说它不够强大,而是因为在解析一个网页时,常常有特定的需要。比如,可能只想抓取某种格式的链接,或是抓取某一特定格式中的文本片断。Heritrix所提供的大众化的Extractor只能够将所有信息全部抓取下来。在这种情况下,就无法控制Heritrix到底该抓哪些内容,不该抓哪些内容,进而造成镜象信息太复杂,不好建立索引。
以下就使用一个实例,来讲解该如何定制和使用Extractor。这个实例其实很简单,主要功能就是抓取所有在太平洋网站上手机报价网页出现的手机,并且URL格式如下所示。
http://product.pconline.com.cn/mobile/nokia/548857.html(1)分析一下这个URL可以知道,其中的主机部分是http://product.pconline.com.cn,这是的域名,mobile表示是手机板块,而最后的“548857.html”应该是一个手机报价页面的编号。
(2)有了这样的分析,就可以根据URL的特点,来定出一个正则表达式,凡是当链接符合该正则表达式,就认为它是一个潜在的值得抓取的链接,将其收藏,以待抓取。正则表达式如下:
http://product.pconline.com.cn/mobile/[\w]+/[\d]+.html
(3)事实上所有的Extractor均继承自org.archive.crawler.extractor.Extractor这个抽象基类,在它的内部实现了innerProcess方法,自定义的Extractor要覆盖它。
所有的Extractor继承自它后,只需实现extract方法就可以了。以下是扩展Extractor时要做的几件事:
(1)写一个类,继承Extractor的基类。
(2)在构造函数中,调用父类的构造函数,以形成完整的家族对象。
(3)继承extract(curi)方法。
Summary
在搜索引擎的开发过程中,使用一个优秀的爬虫来获得所需要的网页信息是第一步,也是整个系统成功的关键。Heritrix 是一个功能强大而且高效的爬虫,具有良好的可扩展性。本章介绍了它在 windows 下 Eclipse 中的配置运行以及扩展。