Сканер Niocchi — как добавить URL в crawle в процессе обхода (обход всего веб-сайта)

#java #web-crawler

#java #веб-сканер

Вопрос:

есть ли у кого-нибудь опыт работы с библиотекой Niocchi? Я начинаю обход с URL домена. В рабочем методе processResource () я анализирую полученный ресурс, извлекаю все внутренние ссылки на этой странице, и мне нужно добавить их в crawle. Но я не могу найти как. Должен ли я добавить его в UrlPool, или ResourcePool, или где-то еще?

Спасибо!

Ответ №1:

Вы можете добавить их в существующий пул URL. Существующие реализации URLPool не расширяемы, поэтому вам придется создать свой собственный класс URLPool, который можно расширять. Я вызвал свой класс ExpandableURLPool.

URLPool.setProcessed метод вызывается фреймворком по завершении обработки, и именно там вы можете добавить дополнительные URL в список url. Я приведу пример, но сначала в документации URLPool указано:

setProcessed (Запрос) вызывается искателем для информирования пула URL-адресов о том, что запрос был просмотрен и его ресурс обработан. Обычно это используется URLPool для проверки статуса обхода и регистрации ошибки в случае сбоя или для получения дополнительных URL для обхода в случае успеха. Типичный пример, когда getNextQuery () возвращает null, но hasNextQuery () возвращает true, — это когда URLPool ожидает возврата некоторых обработанных ресурсов, из которых были извлечены дополнительные URL для обхода. Проверьте пакет urlpools для примеров реализации.

Это подразумевает, что сложность в вашей реализации ExapndableURLPool заключается в том, что метод hasNextQuery должен возвращать true, если обрабатывается невыполненный запрос, который МОЖЕТ привести к добавлению новых URL-адресов в пул. Аналогично, getNextQuery должен возвращать null в случаях, когда есть невыполненный запрос, который еще не завершен и МОЖЕТ привести к добавлению новых URL-адресов в пул. [Мне не нравится, как в этом отношении составлен 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);
}

}
  

Я также создал рабочий класс, производный от 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");
        }       

    }


}
  

Комментарии:

1. Большое спасибо! Отлично работает. Этот ответ идеален!