2014-11-17 2 views
2

Я пытаюсь настроить craweler4j. Я строю его из источника в Netbeans. Я использую 3.5 версии crawler4j и вызова классов такие же, как и когда-то дал на сайте - воспроизведения для простоты ниже -Crawler4j - NoSuchMethod getOutgoingUrls()

public class MyCrawler extends WebCrawler { 

    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g" 
                 + "|png|tiff?|mid|mp2|mp3|mp4" 
                 + "|wav|avi|mov|mpeg|ram|m4v|pdf" 
                 + "|rm|smil|wmv|swf|wma|zip|rar|gz))$"); 

    /** 
    * You should implement this function to specify whether 
    * the given url should be crawled or not (based on your 
    * crawling logic). 
    */ 
    @Override 
    public boolean shouldVisit(WebURL url) { 
      String href = url.getURL().toLowerCase(); 
      return !FILTERS.matcher(href).matches() && href.startsWith("http://www.ics.uci.edu/"); 
    } 

    /** 
    * This function is called when a page is fetched and ready 
    * to be processed by your program. 
    */ 
    @Override 
    public void visit(Page page) {   
      String url = page.getWebURL().getURL(); 
      System.out.println("URL: " + url); 

      if (page.getParseData() instanceof HtmlParseData) { 
        HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); 
        String text = htmlParseData.getText(); 
        String html = htmlParseData.getHtml(); 
        List<WebURL> links = htmlParseData.getOutgoingUrls(); 

        System.out.println("Text length: " + text.length()); 
        System.out.println("Html length: " + html.length()); 
        System.out.println("Number of outgoing links: " + links.size()); 
      } 
    } 

}

и

public class Controller { 
    public static void main(String[] args) throws Exception { 
      String crawlStorageFolder = "/data/crawl/root"; 
      int numberOfCrawlers = 7; 

      CrawlConfig config = new CrawlConfig(); 
      config.setCrawlStorageFolder(crawlStorageFolder); 

      /* 
      * Instantiate the controller for this crawl. 
      */ 
      PageFetcher pageFetcher = new PageFetcher(config); 
      RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); 
      RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher); 
      CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer); 

      /* 
      * For each crawl, you need to add some seed urls. These are the first 
      * URLs that are fetched and then the crawler starts following links 
      * which are found in these pages 
      */ 
      controller.addSeed("http://www.ics.uci.edu/~welling/"); 
      controller.addSeed("http://www.ics.uci.edu/~lopes/"); 
      controller.addSeed("http://www.ics.uci.edu/"); 

      /* 
      * Start the crawl. This is a blocking operation, meaning that your code 
      * will reach the line after this only when crawling is finished. 
      */ 
      controller.start(MyCrawler.class, numberOfCrawlers);  
    } 

}

На компиляции успешно компилируется, но генерирует следующее исключение. Пожалуйста, предложите.

Exception in thread "Crawler 1" java.lang.NoSuchMethodError: edu.uci.ics.crawler4j.parser.HtmlParseData.getOutgoingUrls()Ljava/util/Set; 
    at MyCrawler.visit(MyCrawler.java:42) 
    at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:351) 
    at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:220) 
    at java.lang.Thread.run(Thread.java:744) 

Я просматриваю код и нашел там одноименный класс. Но все-таки ошибка.

+0

Если вы нашли мой ответ приемлемым, могу я попросить его принять его? – Chaiavi

ответ

1

Ваш код кажется хорошим.

Возможно, вы каким-то образом попали в какой-то адский путь класса - возможно, у вас есть две разные версии библиотеки crawler4j?

Во всяком случае я предлагаю следующее: Посмотрите на новый crawler4j GitHub: https://github.com/yasserg/crawler4j

Используйте систему Maven зависимостей и все ваши проблемы будут пропадет !:

<dependency> 
    <groupId>edu.uci.ics</groupId> 
    <artifactId>crawler4j</artifactId> 
    <version>4.1</version> 
</dependency> 

вы получите последний версия (теперь на github вместо кода Google). И используя Maven, вы автоматически избегаете всех путей к классу ...

В последней версии я все равно исправил множество ошибок, поэтому я действительно предлагаю перемещение t o последнее и самое лучшее

Смежные вопросы