有没有经历过Niocchi图书馆的经历?我开始使用域名网址抓取。在Worker方法processResource()中,我解析了我得到的资源,提取了这个页面中的所有内部链接,我需要将它们添加到crawle中。但我无法找到。我应该将它添加到UrlPool,ResourcePool或其他地方吗?
谢谢!
答案 0 :(得分: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");
}
}
}