#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. Большое спасибо! Отлично работает. Этот ответ идеален!