Как я могу добавлять URL-адреса в искатель crawler4j в случайные моменты времени во время выполнения

#java #web-crawler

#java #веб-искатель

Вопрос:

Я обращаюсь к crawler4j. http://code.google.com/p/crawler4j /

и простой тестовый обход сайта был успешным. но я хочу добавлять URL-адреса в случайные моменты времени во время выполнения.

этот код показывает следующее исключение при втором построении CrawlController. как я могу добавлять URL-адреса во время выполнения? или повторно использовать CrawlController? (также не удалось повторно использовать случай без повторного построения CrawlController.)

есть идеи? или другой хороший искатель на Java?

редактировать: поскольку это может быть ошибка, я также разместил сообщение на странице crawler4j. http://code.google.com/p/crawler4j/issues/detail?id=87amp;thanks=87amp;ts=1318661893

 private static final ConcurrentLinkedQueue<URI> urls = new ConcurrentLinkedQueue<URI>();
...
URI uri = null;
while (true) {
    uri = urls.poll();
    if (uri != null) {
        CrawlController ctrl = null;
        try {
            ctrl = new CrawlController("crawler");
            ctrl.setMaximumCrawlDepth(3);
            ctrl.setMaximumPagesToFetch(100);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        ctrl.addSeed(uri.toString());
        ctrl.start(MyCrawler.class, depth);
    }else{
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:638)
    at edu.uci.ics.crawler4j.crawler.PageFetcher.startConnectionMonitorThread(PageFetcher.java:124)
    at edu.uci.ics.crawler4j.crawler.CrawlController.<init>(CrawlController.java:77)
  

Ответ №1:

Начиная с версии 3.0, эта функция реализована в crawler4j. Пожалуйста, посетите http://code.google.com/p/crawler4j/source/browse/src/test/java/edu/uci/ics/crawler4j/examples/multiple / для примера использования.

По сути, вам нужно запустить контроллер в неблокирующем режиме:

 controller.startNonBlocking(MyCrawler.class, numberOfThreads);
  

Затем вы можете добавить свои начальные значения в цикл. Обратите внимание, что вам не нужно запускать контроллер несколько раз в цикле.

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

1. спасибо, Ясир. Но, используя выше, нельзя использовать setCustomData, разные для разных начальных значений?