有沒有人用Niocchi圖書館的經驗?我開始爬網域網址。在Worker方法processResource()中,我解析我得到的資源,提取此頁面中的所有內部鏈接,並且需要將它們添加到抓取中。但我不知道如何。我應該將它添加到UrlPool或ResourcePool還是其他地方?Niocchi履帶 - 如何添加網址爬行過程中爬行(爬行整個網站)
謝謝!
有沒有人用Niocchi圖書館的經驗?我開始爬網域網址。在Worker方法processResource()中,我解析我得到的資源,提取此頁面中的所有內部鏈接,並且需要將它們添加到抓取中。但我不知道如何。我應該將它添加到UrlPool或ResourcePool還是其他地方?Niocchi履帶 - 如何添加網址爬行過程中爬行(爬行整個網站)
謝謝!
您可以將它們添加到現有的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");
}
}
}
非常感謝!很棒。這個答案很完美! – baltazar123 2011-05-09 16:57:17
@ baltazar123很高興幫助。 – ditkin 2011-05-09 22:27:40