为了记录完整的链接关系,我们需要在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间的链接关系形如:
发现如此记录的路径有很多css和js,另外,有很多重复的边,所以需要在计算Pagerank或其他计算之前去掉css和js,并去掉重复的边。至此,我们得到了一个网页Url的集合和一个网页间链接的集合。去掉css和js,url和链接去重后,我们得到161153个Url以及4264030条边。得到了Url的链接,我们可以根据这个文件以及其他人的抓取结果计算下抓取的覆盖率,在下篇将讲到。 posted on 2012-04-14 22:19 liugoodness 阅读(336) 评论(2) 编辑 收藏 |
|
来自: 复杂网络621 > 《Heritrix》