Пытался ползать с помощью ореха. Я использую их Java API со следующей конфигурацией -
Configuration configuration = new Configuration();
configuration.set("plugin.folders", "data/plugins");
configuration.set("hadoop.tmp.dir","data/tmp");
configuration.set("db.ignore.external.links","false");
configuration.set("db.fetch.schedule.class","org.apache.nutch.crawl.DefaultFetchSchedule");
configuration.set("db.url.normalizers","false");
configuration.set("db.url.filters","false");
configuration.set("db.ignore.external.links.mode","byDomain");
configuration.set("db.fetch.retry.max","3");
configuration.set("db.ignore.external.exemptions.file","data/conf/db-ignore-external-exemptions.txt");
configuration.set("plugin.includes","urlnormalizer-(ajax|basic|host|pass|protocol|querystring|regex|slash)|nutch-extensionpoints");
configuration.set("plugin.auto-activation", "true");
configuration.set("fetcher.follow.outlinks.depth", "10");
configuration.set("fetcher.follow.outlinks.num.links", "100");
configuration.set("http.agent.name", "Nutch Crawler");
configuration.set("fetcher.max.crawl.delay", "15000");
configuration.set("http.timeout", String.valueOf(25000));
configuration.set("http.content.limit", String.valueOf(1024 * 1024 * 512));
Мой код -
public void crawlWithNutch() throws Exception{
CrawlerConfiguration crawlerConf = new CrawlerConfiguration();
Path crawlDB = crawlerConf.crawlDB();
Path urlDir = crawlerConf.urlDir();
System.out.println("Injecting urls to web table");
Injector injector = crawlerConf.injector();
injector.inject(crawlDB, urlDir);
Path segmentsDir = crawlerConf.segmentsDir();
Generator generator = crawlerConf.generator();
Fetcher fetcher = crawlerConf.fetcher();
ParseSegment parseSegment = crawlerConf.parseSegment();
CrawlDb crawlDb = crawlerConf.crawlDb();
FileDumper dumper = crawlerConf.dumper();
long segmentTime = new Date().getTime();
boolean stop = false;
int numberOfReduceTasks = 8;
int numberOfPagesInrun = 100;
int numberOfCores = 2;
while(!stop) {
System.out.println("Generator phase");
Path[] paths = generator.generate(crawlDB, segmentsDir, numberOfReduceTasks, numberOfPagesInrun, segmentTime);
if (paths!=null && paths.length>0) {
for (Path path : paths) {
System.out.println("Fetch: " + path);
fetcher.fetch(path, numberOfCores);
System.out.println("Parse: " + path);
parseSegment.parse(path);
}
System.out.println("Update: " + paths);
crawlDb.update(crawlDB, paths, true, true);
} else {
stop = true;
}
}
dumper.dump(new java.io.File("data/crawl/dump"),
new java.io.File("data/crawl/segments"),
tokenize("json"), true, true, false);
}
Выдает исключение на этапе выборки. Исключение -
13:34:00.564 [LocalJobRunner Map Task Executor #0] DEBUG org.apache.nutch.util.ObjectCache - No object cache found for conf=Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml, yarn-default.xml, yarn-site.xml, hdfs-default.xml, hdfs-site.xml, file:/home/ishan/IdeaProjects/crawler/data/tmp/mapred/local/localRunner/ishan/job_local1687861686_0004/job_local1687861686_0004.xml, instantiating a new object cache
13:34:00.570 [LocalJobRunner Map Task Executor #0] WARN org.apache.nutch.parse.ParsePluginsReader - Unable to parse [null].Reason is [java.net.MalformedURLException]
java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:836)
at org.apache.nutch.fetcher.Fetcher.fetch(Fetcher.java:486)
at au.com.sensis.WebCrawler.crawlWithNutch(WebCrawler.java:217)
at au.com.sensis.WebCrawler.main(WebCrawler.java:46)
Я сделал все, что мог. Но все равно я не могу заставить его работать. Любая помощь будет оценена по достоинству. Я думаю, что он получает URL-адрес как «нулевой» и, следовательно, выбрасывает это исключение.
Я добавил свойство - ("parse.plugin.file","data/conf/parse-plugins.xml"), но все равно не повезло. Я думаю, что он получает null как URL-адрес, который он не может получить. Не понимаю почему. Есть ли способ проверить, правильно ли работает этап генерации. В каталоге crawl_segment создается файл детали.
Да, это проще сделать с помощью bin / nutch, но это часть моего проекта, который также состоит из других функций. Это часть этого, и будет лучше, если я буду вызывать его функции через java.
Возможно, попробуйте NutchConfiguration.create() вместо new Configuration() и убедитесь, что папка Nutch conf/ является частью пути к классам.
Пробовал. Не работает.
Просто чтобы проверить: как вызывается метод main (). Поскольку настройка пути к классам нетривиальна, рекомендуется использовать bin/nutch au.com.sensis.WebCrawler. Если вы сомневаетесь, начните с конфигурации по умолчанию с минимально необходимыми настройками (установите только http.agent.name). И взгляните на существующие методы main () (например, Fetcher.main ()).




Вы должны убедиться, что nutch-default.xml добавлен в вашу конфигурацию (см. Класс NutchConfiguration). Похоже, что анализ файла parse-plugins.xml (определяемого свойством parse.plugin.file) завершился неудачно. Хотя сканирование можно выполнить напрямую, вызвав Java-метод Nutch, гораздо проще использовать предоставленные сценарии оболочки (bin / nutch и bin / crawl).