1. 程式人生 > >Java網路爬蟲crawler4j學習筆記 RuleSet類

Java網路爬蟲crawler4j學習筆記 RuleSet類

原始碼

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的子規則。