Crawler4j - NoSuchMethod getOutgoingUrls()
Я пытаюсь настроить craweler4j. Я строю это из источника в Netbeans. Я использую версию crawler4j версии 3.5, и классы вызовов такие же, как и те, которые когда-то были представлены на сайте (для удобства воспроизведения ниже)
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)
Я копаю код и нашел там класс с таким же именем. Но все равно ошибка.
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 вы автоматически избежите всех адских путей к классам...
В последней версии я исправил множество ошибок, так что я действительно предлагаю перейти к последней и самой лучшей версии