Java網路爬蟲crawler4j學習筆記 RuleSet類
阿新 • • 發佈:2018-12-26
原始碼
package edu.uci.ics.crawler4j.robotstxt;
import java.util.SortedSet;
import java.util.TreeSet;
// RuleSet類根據robot.txt來定義爬蟲爬取url時的rule
public class RuleSet extends TreeSet<String> {
private static final long serialVersionUID = 1L;
@Override
public boolean add(String str) {
// 返回所有小於str的String集合
SortedSet<String> sub = headSet(str);
// 例如如果已經加入了http://www.baidu.com/image,則不用加入http://www.baidu.con/image/1.jpg
if (!sub.isEmpty() && str.startsWith(sub.last())) {
// no need to add; prefix is already present
return false;
}
boolean retVal = super.add(str);
// 返回所有大於等於str+'\0'的String的集合
sub = tailSet(str + "\0");
// 去掉冗餘的規則,例如如果加入的是http://www.baidu.com/image,則需要去掉http://www.baidu.com/image/1.jpg
while (!sub.isEmpty() && sub.first().startsWith(str)) {
// remove redundant entries
sub.remove(sub.first());
}
return retVal;
}
// 是否包含s作為字首的規則
public boolean containsPrefixOf(String s ) {
SortedSet<String> sub = headSet(s);
// because redundant prefixes have been eliminated,
// only a test against last item in headSet is necessary
if (!sub.isEmpty() && s.startsWith(sub.last())) { // 如果包含有大的規則,則等價於當前規則已經包含
return true; // prefix substring exists
}
// might still exist exactly (headSet does not contain boundary)
return contains(s);
}
}
分析
RuleSet類是一個儲存URL規則的集合,用於robot.txt。在URL的插入過程中,需要判斷是否有包含當前規則的父規則存在,同時需要記得刪除當前規則的所有子規則。
例如:
規則1:www.baidu.com/image
規則2:www.baidu.com/image/1.jpg
規則1是規則2的父規則,規則2是規則1的子規則。