2012-07-14 1 views
0

В crawler4j мы можем переопределить функцию boolean shouldVisit(WebUrl url) и определить, должен ли быть разрешен обход определенного URL-адреса, вернув «true» и «false».Управление списком URL-адресов, которые будут сканироваться во время выполнения

Но можем ли мы добавить URL (ы) во время выполнения? если да, то каковы способы сделать это? В настоящее время я могу добавить URL-адреса в начале программы с использованием addSeed(String url) функции до start(BasicCrawler.class, numberOfCrawlers) в классе CrawlController, и если я попытаюсь добавить новый url, используя addSeed(String url), он дает ошибку. Here - изображение ошибки.

Любая помощь будет оценена и, пожалуйста, дайте мне знать, если для ответа на вопрос требуется более подробная информация о проекте.

ответ

0

Предположительно вы можете реализовать эту функцию, как вам нравится, и зависеть от списка URL-адресов, которые нельзя сканировать. Затем реализация shouldVisit будет включать вопрос о том, указан ли указанный URL в списке запрещенных URL-адресов (или разрешенных URL-адресов) и возвращает true или false на этой основе.

+0

да, я понял ваш ответ, но мой вопрос был, если бы я дал семя в начале как «www.facebook.com», то все ссылки на «Facebook» домен будет переходить из функции 'code' ('shouldVisit'), и в зависимости от реализации функции они будут (не будут), но я могу добавить новое семя, скажем,' code' ('www.google.com') между ними, пока оно сканирует для 'code' (facebook) в своем списке URL-адресов, которые будут сканироваться. Я ясно вам? – Amit

+0

Да, и мой ответ тот же. Вы должны изменить реализацию своей функции, чтобы зависеть от некоторой структуры данных, которую вы можете обновить. – Gian

+0

Вы посмотрели пример 'controller.addSeed (« http://www.ics.uci.edu/ »); пример на первой странице сайта crawler4j? Похоже, вам просто нужно позвонить еще раз - это в основном новый обход, но я не вижу, что это должно иметь большое значение? – Gian

0

Вы можете это сделать.

Используйте public void schedule(WebURL url) для добавления URL-адресов на границу искателя, которая является членом класса Frontier.java. Но для этого вам нужен ваш url типа WebURL. Если вы хотите сделать WebURL из своей строки. Пожалуйста, посмотрите на addSeed() (ниже код), который находится в классе CrawlController.java, чтобы увидеть, как он преобразовал строку (url) в WebURL.

Также используйте существующий экземпляр границы.

Надеется, что это помогает ..

public void addSeed(String pageUrl, int docId) { 
     String canonicalUrl = URLCanonicalizer.getCanonicalURL(pageUrl); 
     if (canonicalUrl == null) { 
      logger.error("Invalid seed URL: " + pageUrl); 
      return; 
     } 
     if (docId < 0) { 
      docId = docIdServer.getDocId(canonicalUrl); 
      if (docId > 0) { 
       // This URL is already seen. 
       return; 
      } 
      docId = docIdServer.getNewDocID(canonicalUrl); 
     } else { 
      try { 
       docIdServer.addUrlAndDocId(canonicalUrl, docId); 
      } catch (Exception e) { 
       logger.error("Could not add seed: " + e.getMessage()); 
      } 
     } 

     WebURL webUrl = new WebURL(); 
     webUrl.setURL(canonicalUrl); 
     webUrl.setDocid(docId); 
     webUrl.setDepth((short) 0); 
     if (!robotstxtServer.allows(webUrl)) { 
      logger.info("Robots.txt does not allow this seed: " + pageUrl); 
     } else { 
      frontier.schedule(webUrl); //method that adds URL to the frontier at run time 
     } 
    }