[wbia 1.4]修改Heritrix代码得到网页间的链接关系

      1.2中提到可以通过修改Heritrix代码得到网页间的链接关系,这里说下如何进行修改。既然要修改Heritrix的代码,首先要对Heritrix的代码进行配置。

一、Hertrix代码配置

    以下为Heritrix代码配置方法,部分内容转自http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/?S_TACT=105AGX52&S_CMP=reg-ccid

     首先在 Eclipse 中新建 Java 工程 MyHeritrix。然后利用下载的源代码包根据以下步骤来配置这个工程。

1. 导入类库

Heritrix 所用到的工具类库都在 heritrix-1.14.4-src\lib 目录下,需要将其导入 MyHeritrix 工程。

1)将 heritrix-1.14.4-src 下的 lib 文件夹拷贝到 MyHeritrix 项目根目录;

2)在 MyHeritrix 工程上右键单击选择“Build PathConfigure Build Path …”,然后选择 Library 选项卡,单击“Add JARs …”,如图 1 所示。

图 1. 导入类库 - 导入前
图 1. 导入类库 - 导入前

3)在弹出的“JAR Selection”对话框中选择 MyHeritrix 工程 lib 文件夹下所有的 jar 文件,然后点击 OK 按钮。如图 2 所示。

图 2. 选择类库
图 2. 选择类库

设置完成后如图 3 所示:

图 3. 导入类库 - 导入后
图 3. 导入类库 - 导入后

2. 拷贝源代码

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 工程目录层次如图 4 所示。这里运行 Heritrix 所需的源代码等已经准备完备,下面需要修改配置文件并添加运行参数。

图 4. MyHeritrix 工程的目录层次
图 4. MyHeritrix 工程的目录层次

3. 修改配置文件

conf 文件夹是用来提供配置文件的,里面包含了一个很重要的文件:heritrix.properties。heritrix.properties 中配置了大量与 Heritrix 运行息息相关的参数,这些参数的配置决定了 Heritrix 运行时的一些默认工具类、Web UI 的启动参数,以及 Heritrix 的日志格式等。当第一次运行 Heritrix 时,只需要修改该文件,为其加入 Web UI 的用户名和密码。如图 5 所示,设置 heritrix.cmdline.admin = admin:admin,“admin:admin”分别为用户名和密码。然后设置版本参数为 1.14.4。

图 5. 设置登陆用户名和密码
图 5. 设置登陆用户名和密码

4. 配置运行文件

在 MyHeritrix 工程上右键单击选择“Run AsRun Configurations”,确保 Main 选项卡中的 Project 和 Main class 选项内容正确,如图 6 所示。其中的 Name 参数可以设置为任何方便识别的名字。

图 6. 配置运行文件—设置工程和类
图 6. 配置运行文件—设置工程和类

然后在 Classpath 页选择 UserEntries 选项,此时右边的 Advanced 按钮处于激活状态,点击它,在弹出的对话框中选择“Add Folders”,然后选择 MyHeritrix 工程下的 conf 文件夹。如图 7 所示。

图 7. 添加配置文件
图 7. 添加配置文件

至此我们的 MyHeritrix 工程已经可以运行起来了。下面我们来看看如何启动 Heritrix 并设置一个具体的抓取任务。

创建网页抓取任务

找到 org.archive.crawler 包中的 Heritrix.java 文件,它是 Heritrix 爬虫启动的入口,右键单击选择“Run AsJava Application”,如果配置正确,会在控制台输出如图 8 所示的启动信息。

图 8. 运行成功时控制台输出
图 8. 运行成功时控制台输出

在浏览器中输入 http://localhost.sixxs.org:8080,即可打开如图 9 所示的 Web UI 登录界面。

图 9. Heritrix 登录界面
图 9. Heritrix 登录界面

二、配置过程中可能遇到的问题

以下部分内容转自

http://hi.baidu.com/liuqiyuan/blog/item/d0dd42a74005b384d0435825.html

错误1:Access restriction: The type FileURLConnection is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_20\jre\lib\rt.jar,如图 1 所示。
解决方案:这是 JRE 的访问限制导致报错,在 MyHeritrix 工程上右键单击选择“Build PathConfigure Build Path …”,然后选择 Library 选项卡,将“JRE System Library”删除然后重新导入一下即可修复。或者选择“Windows/Preferences/Java/Compiler/Errors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,将默认设置“Error”改为“Warning”或“Ignore”。
图 1.  Access restriction 错误 

错误2:这个时候会报错NullPointerException 的错误:这个错误的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到该文件,将其拷贝到org.archive.util包(MyHeritrix\src\org\archive\util) 中即可。 

图2. NullPointerException 错误

还有就是在配置过后,可能好多选项找不到了,比如encoding选项,这是隐藏了部分Expert设置,点击setting顶端的show expert setting,就可以显示这些选项。

 

三、修改Heritrix代码,记录链接关系

    为了记录完整的链接关系,我们需要在url进行判重之前记录下要遍历的页面,从而记录下链接关系。需要我们找到Heritrix的判重模块,并修改代码,将要判断的页面和当前页面的url输出到一个文件中,从而得到一条边关系。

    Heritirx判重模块有多种实现。对应的类有:BdbUriUniqFilter、FPUriUniqFilter、BloomUriUniqFilter等。其中Bdb是利用的Berkeley Db记录Uri,然后通过查询数据库进行判重;FP是指fingerprints 判重,将每一个uri哈希到64位的散列表中,在这个类中提供了MD5和SHA1两种散列算法。BloomUriUniqFilter是用BloomFilter机制进行过滤。关于BloomFilter机制,可以参见http://blog.csdn.net/jiaomeng/article/details/1495500

     Heritrix这些判重的类,都派生自一个名为SetBasedUriUniqFilter的类。我们需要修改SetBasedUriUniqFilter类从而实现在判重前纪录下链接关系。这个类所在的文件名称即为SetBasedUriUniqFilter.java中。首先在类的构造函数中新建一个用来记录url间的链接关系的文件。代码如下:

    public SetBasedUriUniqFilter() {
        super();
        String profileLogFile = 
            System.getProperty(SetBasedUriUniqFilter.class.getName()
                + ".profileLogFile");
        if (profileLogFile != null) {
            setProfileLog(new File(profileLogFile));
        }
        if(linkMap!=null) return;
        try {
            linkMap = new FileWriter("linkMap.txt");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

  很明显的可以看到,add函数为写入log的函数,并进行了判重处理。我们可以在判重之前记录下链接关系。由于考虑到Heritrix为多线程抓取,为了防止多线程同时写入文件导致文件写乱,用synchronized进行了简单的互斥处理,代码如下:

    public void add(String key, CandidateURI value) {
        synchronized(mutex) {
            if(linkMap != null) {
                String link = new String(value.flattenVia()+"\t"+value.toString()+"\n");
                try {
                    linkMap.write(link,0,link.length());
                    linkMap.flush();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        profileLog(key);
        if (setAdd(key)) {
            this.receiver.receive(value);
            if (setCount() % 50000 == 0) {
                LOGGER.log(Level.FINE, "count: " + setCount() + " totalDups: "
                        + duplicateCount + " recentDups: "
                        + (duplicateCount - duplicatesAtLastSample));
                duplicatesAtLastSample = duplicateCount;
            }
        } else {
            duplicateCount++;
        }
    }

  进行如此修改后按照之前的说法运行程序,开始重新抓取。在抓取的过程中,可在Heritrix根目录下发现一个名为linkMap.txt的文件,此次抓取持续了一天一夜,到终止的时候Heritrix显示抓取了90%左右的页面。linkMap.txt中记录的url间的链接关系形如:

        http://www.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/css/reset.css
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/css/2011.css
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/js/jquery.min.js
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/js/jquery.sgallery.js
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/js/search_common.js
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/js/png.js
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/statics/js/2011/banner.js
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://english.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/index.php
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/special/vote
http://www.pkusz.edu.cn/        http://news.pkusz.edu.cn/index.php?m=content&c=index&a=show&catid=143&id=1133
http://www.pkusz.edu.cn/        http://news.pkusz.edu.cn/index.php?m=content&c=index&a=show&catid=143&id=1277
http://www.pkusz.edu.cn/        http://news.pkusz.edu.cn/index.php?m=content&c=index&a=show&catid=143&id=1134
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/index.php?m=special&c=index&specialid=1&pc_hash=lbCmic
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/
http://www.pkusz.edu.cn/        http://www.pkusz.edu.cn/

  发现如此记录的路径有很多css和js,另外,有很多重复的边,所以需要在计算Pagerank或其他计算之前去掉css和js,并去掉重复的边。至此,我们得到了一个网页Url的集合和一个网页间链接的集合。去掉css和js,url和链接去重后,我们得到161153个Url以及4264030条边。得到了Url的链接,我们可以根据这个文件以及其他人的抓取结果计算下抓取的覆盖率,在下篇将讲到。

posted on 2012-04-14 22:19  liugoodness  阅读(819)  评论(2编辑  收藏  举报

导航