2011-05-08 43 views

回答

3

您可以將它們添加到現有的URLPool。現有的URLPool實現不可擴展,因此您必須創建可擴展的自己的URLPool類。我打電話給我的類ExpandableURLPool。

URLPool.setProcessed方法在完成處理後由框架調用,並且在那裏您可以將其他URL添加到URL列表。我將以一個示例爲例,但首先,URLPool文檔指出:

當查詢已被抓取並處理其資源時,搜索器調用setProcessed(Query)來通知URLPool。這通常由URLPool用於檢查爬網狀態並在發生故障時記錄錯誤,或者在成功的情況下獲取更多的URL以抓取。 getNextQuery()返回null,但hasNextQuery()返回true的典型示例是URLPool正在等待某些處理過的資源,從這些資源中可以提取更多要抓取的URL。檢查urlpools包中的實現示例。

這意味着,在您的實現ExapndableURLPool的棘手的部分是,如果有正在處理,可能會導致新的URL被添加到池中,一個優秀的查詢hasNextQuery方法應返回true。同樣,如果有尚未完成的未完成查詢並且可能會導致新的URL被添加到池中,getNextQuery必須返回null。 [我不喜歡niocchi放在一起這方面的方式]

這裏是我的ExpandableURLPool的非常初步的版本:

class ExpandableURLPool implements URLPool { 
List<String> urlList = new ArrayList<String>(); 
int cursor = 0; 

int outstandingQueryies = 0; 

public ExpandableURLPool(Collection<String> seedURLS) { 
    urlList.addAll(seedURLS); 
} 

@Override 
public boolean hasNextQuery() { 
    return cursor < urlList.size() || outstandingQueryies > 0; 

} 

@Override 
public Query getNextQuery() throws URLPoolException { 
    try { 
     if (cursor >= urlList.size()) { 
      return null; 
     } else { 
      outstandingQueryies++; 
      return new Query(urlList.get(cursor++)) ; 
     } 
    } catch (MalformedURLException e) { 
     throw new URLPoolException("invalid url", e) ; 
    }  
} 

@Override 
public void setProcessed(Query query) { 
    outstandingQueryies--; 


} 

public void addURL(String url) { 
    urlList.add(url); 
} 

} 

我還創建了一個Worker類,從DiskSaveWorker衍生測試上面的實現:

class MyWorker extends org.niocchi.gc.DiskSaveWorker { 

    Crawler mCrawler = null; 
    ExpandableURLPool pool = null; 

    int maxepansion = 10; 

    public MyWorker(Crawler crawler, String savePath, ExpandableURLPool aPool) { 
     super(crawler, savePath); 
     mCrawler = crawler; 
     pool = aPool; 
    } 

    @Override 
    public void processResource(Query query) { 
     super.processResource(query); 
     // The following is a test 
     if (--maxepansion >= 0 ) { 
      pool.addURL("http://www.somewhere.com"); 
     }  

    } 


} 
+0

非常感謝!很棒。這個答案很完美! – baltazar123 2011-05-09 16:57:17

+0

@ baltazar123很高興幫助。 – ditkin 2011-05-09 22:27:40