有没有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/

10-10 19:30