1、初始化一个Configuration实例设置抓取工作配置;
2、设置一些默认抓取工作参数,比如进程数threads、抓取深度depth、抓取网页数量topN;
3、创建抓取工作抓取到的网页文件的存放目录(crawldb、linkdb、segments、indexes、index),用来存放原生网页,以及网页解析出的文本内容及其其它相关数据;
4、在抓取工作及其索引过程中,这通过初始化一些实现了这些操作的类的实例来完成的,例如:Injector、Generator、Fetcher、ParseSegment、CrawlDb、LinkDb、Indexer、DeleteDuplicates、IndexMerger。
5、最后,就开始执行相关操作了,包括初始化CrawlDb、生成抓取工作列表、抓取网页文件、更新CrawlDb、倒排Links、建立索引、复制索引文件、合并索引文件。
- //初始化配置文件
- Configuration conf = NutchConfiguration.createCrawlConfiguration();
- JobConf job = new NutchJob(conf);
- // urls存放目录
- Path rootUrlDir = null;
- Path dir = new Path("crawl-" + getDate());
- //抓取线程数目
- int threads = job.getInt("fetcher.threads.fetch", 10);
- //抓取工作遍历深度
- int depth = 5;
- long topN = Long.MAX_VALUE;
- String indexerName = "lucene";
- String solrUrl = null;
- for (int i = 0; i < args.length; i++) {
- if ("-dir".equals(args[i])) {
- dir = new Path(args[i+1]);
- i++;
- } else if ("-threads".equals(args[i])) {
- threads = Integer.parseInt(args[i+1]);
- i++;
- } else if ("-depth".equals(args[i])) {
- depth = Integer.parseInt(args[i+1]);
- i++;
- } else if ("-topN".equals(args[i])) {
- topN = Integer.parseInt(args[i+1]);
- i++;
- } else if ("-solr".equals(args[i])) {
- indexerName = "solr";
- solrUrl = StringUtils.lowerCase(args[i + 1]);
- i++;
- } else if (args[i] != null) {
- rootUrlDir = new Path(args[i]);
- }
- }
- FileSystem fs = FileSystem.get(job);
- //抓取工作的不同操作需要的五个目录
- Path crawlDb = new Path(dir + "/crawldb");
- Path linkDb = new Path(dir + "/linkdb");
- Path segments = new Path(dir + "/segments");
- Path indexes = new Path(dir + "/indexes");
- Path index = new Path(dir + "/index");
- Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());
- Injector injector = new Injector(conf);
- Generator generator = new Generator(conf);
- Fetcher fetcher = new Fetcher(conf);
- ParseSegment parseSegment = new ParseSegment(conf);
- CrawlDb crawlDbTool = new CrawlDb(conf);
- LinkDb linkDbTool = new LinkDb(conf);
- // 初始化crawlDb
- injector.inject(crawlDb, rootUrlDir);
- int i;
- for (i = 0; i < depth; i++) { // generate new segment
- //生成抓取工作列表,文件名以时间挫命名
- Path[] segs = generator.generate(crawlDb, segments, -1, topN, System
- .currentTimeMillis());
- if (segs == null) {
- LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");
- break;
- }
- //抓取网页内容
- fetcher.fetch(segs[0], threads, org.apache.nutch.fetcher.Fetcher.isParsing(conf)); // fetch it
- if (!Fetcher.isParsing(job)) {
- //解析网页内容
- parseSegment.parse(segs[0]); // parse it, if needed
- }
- //更新CrawlDB
- crawlDbTool.update(crawlDb, segs, true, true); // update crawldb
- }
- if (i > 0) {
- linkDbTool.invert(linkDb, segments, true, true, false); // invert links
- // index, dedup & merge
- FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs));
- if (isSolrIndex) {
- SolrIndexer indexer = new SolrIndexer(conf);
- indexer.indexSolr(solrUrl, crawlDb, linkDb,
- Arrays.asList(HadoopFSUtil.getPaths(fstats)));
- }
- else {
- DeleteDuplicates dedup = new DeleteDuplicates(conf);
- if(indexes != null) {
- // Delete old indexes
- if (fs.exists(indexes)) {
- LOG.info("Deleting old indexes: " + indexes);
- fs.delete(indexes, true);
- }
- // Delete old index
- if (fs.exists(index)) {
- LOG.info("Deleting old merged index: " + index);
- fs.delete(index, true);
- }
- }
- //索引过程
- Indexer indexer = new Indexer(conf);
- indexer.index(indexes, crawlDb, linkDb,
- Arrays.asList(HadoopFSUtil.getPaths(fstats)));
- IndexMerger merger = new IndexMerger(conf);
- if(indexes != null) {
- //复制索引文件
- dedup.dedup(new Path[] { indexes });
- fstats = fs.listStatus(indexes, HadoopFSUtil.getPassDirectoriesFilter(fs));
- //将索引目录index 中的索引文件合并后写入到indexes 目录中
- merger.merge(HadoopFSUtil.getPaths(fstats), index, tmpDir);
- }
- }
- }
转:http://blog.csdn.net/cdl2008sky/article/details/7219825
相关推荐
通过理解和分析 `Crawl` 类的源码,开发者可以更好地掌握 Nutch 如何处理输入,以及如何根据这些输入配置和执行复杂的网络抓取任务。对于想要深入了解 Nutch 或者想要定制 Nutch 功能的人来说,研究 `Crawl` 类的...
要使用Nutch 1.2,你需要先安装Hadoop环境,然后编译Nutch源码,配置相应的参数,设置爬取种子,启动爬虫,最后进行索引和搜索。这个过程涉及的文件包括`conf`目录下的配置文件,如`nutch-site.xml`,以及`bin`目录...
特别地,Nutch中的Crawl和Fetch阶段展示了如何管理URL队列,以及如何决定何时重新抓取网页。 在学习Lucene和Nutch的源码时,你会遇到以下几个关键概念: 1. **分词**:Lucene使用Analyzer对输入文本进行分词,不同...
1. **Nutch框架**:Nutch的核心框架提供了爬虫的基本架构,包括种子URL的管理、网页抓取、分词、链接分析等。框架设计灵活,支持插件机制,方便开发者根据需求定制。 2. **Fetcher模块**:负责从Web上下载网页。它...
在本文中,我们将深入探讨如何搭建Nutch2.3.1的运行环境,以便进行网页抓取和分析。 **一、系统需求** 首先,确保你的系统满足以下基本要求: 1. 操作系统:Nutch可以在Linux、Unix或Mac OS X等类Unix系统上运行,...
- **运行Nutch流程**:执行`bin/nutch crawl`命令,依次进行抓取、解析、索引等步骤。 - **使用Solr或Elasticsearch**:Nutch可以将索引数据导出到Solr或Elasticsearch,以实现更强大的搜索功能。 - **学习源码**...
编译完成后,可以运行Nutch的命令行工具,如`bin/nutch inject`来注入种子URL,`bin/nutch fetch`执行抓取,`bin/nutch update`更新已抓取的页面,`bin/nutch generate`生成待抓取的URL列表,以及`bin/nutch crawl`...
在IT领域,Apache Nutch是一款开源的Web爬虫项目,用于抓取网页并进行索引。而Eclipse作为一款流行的集成开发环境(IDE),被广泛应用于Java开发中。本文将详细解析如何在Eclipse中配置Nutch,以便于开发者更好地...
6. **抓取策略**:Nutch 提供了基于链接分析的抓取策略,通过 PageRank 或其他算法确定哪些页面应该优先抓取。 7. **存储与索引**:Nutch 可以将抓取的网页存储在 HDFS 上,并使用 Apache Solr 或 Elasticsearch ...
主要的源代码文件位于`src/java`目录下,按照包结构组织,例如`org.apache.nutch.crawl`、`org.apache.nutch.indexer`和`org.apache.nutch.parse`等。 2. **配置文件**:在`conf`目录下,有默认的Nutch配置文件,如...
3. **Fetcher**:`Fetcher` 根据 `Generator` 生成的抓取列表下载网页,`Fetcher` 命令可设置线程数来控制并发抓取,下载后的网页源码存放在 `content` 文件夹,状态信息存放在 `crawl_fetch` 文件夹。 4. **Parse*...
- 导入 Nutch 源码,将 `src\java` 目录下的 `org` 文件夹复制到 Java 项目的 `src` 目录下。 - 将 `conf`, `lib`, `plugins` 目录复制到与 `src` 同级目录,并将 `conf` 添加到项目路径。 - 配置项目的 Build...
### Eclipse中编译Nutch-0.9:详解与步骤 #### 核心知识点概览 在本篇文章中,我们将深入探讨如何在Eclipse环境中编译Nutch-...通过遵循上述指南,即使是初学者也能快速上手,利用Nutch-0.9高效抓取和分析网络数据。
**Nutch 2.3 源码分析:** 1. **源码目录结构**:解压后的apache-nutch-2.3目录包含了源代码、配置文件、构建脚本等。主要目录有`src/main/`,其中`src/main/java`存放Java源码,`src/main/resources`存储配置文件...
5. **初始化数据库**: 创建并初始化HBase或MySQL等数据库,用于存储Nutch抓取的URL和元数据。 6. **启动服务**: 启动Hadoop和Nutch相关的服务,如HDFS和MapReduce。 7. **运行Nutch**: 执行爬虫任务,如`bin/nutch ...
例如,`bin/nutch crawl urls -dir crawl -depth 2 -topN 10`会启动一个深度为2的爬取,并返回前10个结果。 5. **调试和扩展**:利用IDE的调试功能,你可以对Nutch的代码进行逐行分析,理解其工作原理,或者在需要...
- 最后,通过调用`Crawl`类的`main`方法,如`org.apache.nutch.crawl.Crawl.main()`,可以启动Nutch的爬取过程。参数如`rootUrlDir`(起始URL目录)、`threads`(线程数)和`topN`(要抓取的页面数量)可以定制爬虫...
**源码分析** 下载 "apache-nutch-1.3-src.tar.gz" 后,你可以深入了解 Nutch 的工作原理和架构。源码包括了各个模块的实现,如 Crawl、Fetch、Parse、Index、Search 等。通过阅读源码,你可以学习到如何设计和实现...
1.4 链接分析:Nutch使用PageRank或其他链接分析算法对抓取的网页进行排序,确定其重要性。 1.5 索引:Nutch支持多种索引库,如Lucene,用于存储和检索抓取的网页内容。 二、Java在爬虫开发中的应用 Java是一种多...