打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[wbia 1.4]修改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://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 阅读(336) 评论(2) 编辑 收藏

评论

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

linkMap 变量是在哪声明的?

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
绝对经典(全国高校图书馆网站集锦) !
精品课程
家长看过来!2018深圳十区学位申请政策变动汇总
一些大学图书随书光盘下载地址
2011注册会计师考试真题-审计
網絡資源,歡迎補充
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服