分享

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

 复杂网络621 2013-08-15

 为了记录完整的链接关系,我们需要在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./
http://www./        http://www./statics/css/reset.css
http://www./        http://www./statics/css/2011.css
http://www./        http://www./statics/js/jquery.min.js
http://www./        http://www./statics/js/search_common.js
http://www./        http://www./statics/js/png.js
http://www./        http://www./statics/js/2011/banner.js
http://www./        http://www./
http://www./        http://english./
http://www./        http://www./index.php
http://www./        http://www./special/vote
http://www./        http://www./
http://www./        http://www./
http://www./        http://www./
http://www./        http://www./

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

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

评论

#1楼 2013-03-16 14:56liudi_nba  

linkMap 变量是在哪声明的?

#2楼[楼主] 2013-03-19 10:01liugoodness  

@liudi_nba
时间比较长了,有些记不清了。linkMap应该是一个FileWriter类的对象,是我定义的一个所在类的成员变量。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多