Gnocchi抓取工具 - 如何在抓取过程中添加网址以进行抓取(抓取整个网站)

时间:2011-05-08 13:42:01

标签: java web-crawler

有没有经历过Niocchi图书馆的经历?我开始使用域名网址抓取。在Worker方法processResource()中,我解析了我得到的资源,提取了这个页面中的所有内部链接,我需要将它们添加到crawle中。但我无法找到。我应该将它添加到UrlPool,ResourcePool或其他地方吗?

谢谢!

1 个答案:

答案 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");
        }       

    }


}