有没有Niocchi图书馆的经验?我开始抓取域网址。在Worker方法processResource()中,我解析获得的资源,提取此页面中的所有内部链接,然后需要添加它们以进行爬网。但是我找不到方法。我应该将其添加到UrlPool或ResourcePool还是其他地方?
谢谢!
最佳答案
您可以将它们添加到现有的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。同样,在有尚未完成的未完成查询的情况下,getNextQuery必须返回null,并且可能导致将新的url添加到池中。 [在这方面,我不喜欢尼奥基的组合方式]
这是我的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);
}
}
我还创建了一个派生自DiskSaveWorker的Worker类,以测试上述实现:
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");
}
}
}
关于java - Gnocchi搜寻器-如何在搜寻过程中添加网址以进行搜寻(搜寻整个网站),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5927771/