`
cocoIT
  • 浏览: 51066 次
  • 性别: Icon_minigender_1
  • 来自: 福建
文章分类
社区版块
存档分类
最新评论

Nutch 源码分析 (1)

 
阅读更多

org.apache.nutch.crawl.Crawl类的主函数如下所示:

// 应该知道,Nutch查找文件系统是基于Linux系统的机制的,所以提供启动的命令与Linux的Shell命令很相似。

public static void main(String args[]) throws Exception {
if (args.length < 1) {
// 检查命令行参数是否合法,如果小于1个参数,则给出提示。
System.out.println
("Usage: Crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN N]");
return;
}

Configuration conf = NutchConfiguration.create(); // 使用静态类NutchConfiguration创建一个org.apache.hadoop.conf.Configuration实例,可以在Hadoop的源代码中查看到该类的定义(读取hadoop-site.xml配置文件)
conf.addDefaultResource("crawl-tool.xml");
// 读取并设置抓取工具的配置文件,可以在nutch-0.9\conf目录下找到crawl-tool.xml文件
JobConf job = new NutchJob(conf);
// 抓取任务配置实例的创建

Path rootUrlDir = null; // 初始URLs文件所在的目录,使用Hadoop的org.apache.hadoop.fs.Path类创建目录
Path dir = new Path("crawl-" getDate()); // 设置默认抓取到网页的存放目录。如果命令行中没有指定-dir 的值就会使用默认的值:crawl-时间。
int threads = job.getInt("fetcher.threads.fetch", 10);
// 设置默认抓取工作启动线程数目,默认值为10。
int depth = 5;
// 默认抓取工作遍历深度,默认值为5。
int topN = Integer.MAX_VALUE;
// 抓取任务抓取网页的数量,默认为最大值。

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 (args[i] != null) {
rootUrlDir = new Path(args[i]);
}
}

FileSystem fs = FileSystem.get(job); // 根据抓取工作配置JobConf创建一个用来存放抓取到的网页的目录。
if (fs.exists(dir)) {
throw new RuntimeException(dir " already exists.");
// 如果该目录已经存在,则发生运行时异常。
}

if (LOG.isInfoEnabled()) { // 登录日志信息
LOG.info("crawl started in: " dir);
LOG.info("rootUrlDir = " rootUrlDir);
LOG.info("threads = " threads);
LOG.info("depth = " depth);
if (topN != Integer.MAX_VALUE)
LOG.info("topN = " topN);
}

// 在目录dir下面创建下面5个目录,用来存放,抓取工作过程中不同操作生成的文件或者目录。

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);
// 根据Configuration conf创建一个Injector实例
Generator generator = new Generator(conf); // 根据Configuration conf创建一个Generator实例
Fetcher fetcher = new Fetcher(conf);
// 根据Configuration conf创建一个Fetcher实例
ParseSegment parseSegment = new ParseSegment(conf);
// 根据Configuration conf创建一个ParseSegment实例
CrawlDb crawlDbTool = new CrawlDb(conf);
// 根据Configuration conf创建一个CrawlDb实例
LinkDb linkDbTool = new LinkDb(conf);
// 根据Configuration conf创建一个LinkDb实
Indexer indexer = new Indexer(conf);
// 根据Configuration conf创建一个Indexer实例
DeleteDuplicates dedup = new DeleteDuplicates(conf);
// 根据Configuration conf创建一个DeleteDuplicates实
IndexMerger merger = new IndexMerger(conf);
// 根据Configuration conf创建一个IndexMerger实例

// 初始化crawlDb
injector.inject(crawlDb, rootUrlDir);
// 从rootUrlDir目录中读取初始化URLs,将URLs注入到CrawlDb实体中去
int i;
for (i = 0; i < depth; i ) {
// 在segment文件中生成抓取工作列表
Path segment = generator.generate(crawlDb, segments, -1, topN, System
.currentTimeMillis(), false, false);
if (segment == null) {
LOG.info("Stopping at depth=" i " - no more URLs to fetch.");
break;
}
fetcher.fetch(segment, threads);
// 根据配置的线程数开始抓取网页文件
if (!Fetcher.isParsing(job)) {
parseSegment.parse(segment);
// 解析网页文件
}
crawlDbTool.update(crawlDb, new Path[]{segment}, true, true);
// 更新CrawlDb
}
if (i > 0) {
linkDbTool.invert(linkDb, segments, true, true, false); // invert links

indexer.index(indexes, crawlDb, linkDb, fs.listPaths(segments)); // 索引过程
dedup.dedup(new Path[] { indexes });
// 复制索引文件
merger.merge(fs.listPaths(indexes), index, tmpDir); // 将索引目录index中的索引文件合并后写入到indexes目录中
} else {
LOG.warn("No URLs to fetch - check your seed list URL filters.");
}
if (LOG.isInfoEnabled()) { LOG.info("crawl finished: " dir); }
}

通过上面的源代码的整体分析,总结一下具体都在这里做了哪些工作:

1、读取命令行参数,合法以后才继续初始化配置实例;

2、通过读取hadoop-site.xml配置文件,初始化一个Configuration实例,并根据crawl-tool.xml文件内容设置抓取工作配置;

3、设置一些默认抓取工作参数,如果命令行中没有指定就会按照默认的参数值进行抓取工作的执行,比如,抓取工作抓取到的网页文件存放目录rootUrlDir、启动的抓取工作进程数threads、抓取深度depth、抓取网页数量topN;

4、创建抓取工作抓取到的网页文件的存放目录,及其子目录(crawldb、linkdb、segments、indexes、index),这些子目录有的是用来存放原生网页,有的是预处理网页文件,有的是网页解析出的文本内容及其其它相关数据等等;

5、在抓取工作及其索引过程中,要进行很多操作来对网页文件或数据进行处理,这通过初始化一些实现了这些操作的类的实例来完成的,例如:Injector、Generator、Fetcher、ParseSegment、CrawlDb、LinkDb、Indexer、DeleteDuplicates、IndexMerger。这些类中,有的是作为实体类,像CrawlDb、LinkDb,它们需要在抓取工作执行过程中及时更新,保持数据状态的处于良好正确状态。

6、最后,就开始执行相关操作了,包括初始化CrawlDb、生成抓取工作列表、抓取网页文件、更新CrawlDb、倒排Links、建立索引、复制索引文件、合并索引文件。


分享到:
评论

相关推荐

    nutch_src 源码 tar—zip格式

    《Nutch源码分析——深入理解tar和zip格式》 Nutch是一款开源的网络爬虫项目,它在大数据处理和搜索引擎构建领域具有广泛的应用。本文将深入探讨如何获取和理解Nutch的源码,以及涉及的tar和zip两种常见的文件压缩...

    apache-nutch的源码

    Nutch 源码的分析和理解对于想要深入研究搜索引擎工作原理、网页抓取技术和大数据处理的开发者来说至关重要。 在`apache-nutch-2.2.1`这个压缩包中,你将找到以下关键组成部分: 1. **源代码结构**:Nutch 的源...

    nutch1.6源码

    Nutch的源码分析主要涉及以下几个关键知识点: 1. **网络爬虫**:Nutch的核心功能是作为一个网络爬虫,它自动遍历互联网上的网页,通过跟踪页面间的链接来发现新的URL。它使用种子URL开始,然后递归地抓取与这些...

    nutch-1.9 源码

    5. **链接分析**:Nutch使用PageRank算法对网页进行链接分析,评估网页的重要性。这种算法是搜索引擎排名的关键部分,有助于提升搜索结果的相关性。 6. **数据存储**:Nutch默认使用Hadoop的HDFS作为数据存储系统,...

    lucene+nutch搜索引擎开发源码1

    《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...

    nutch-1.5.1源码

    通过分析和学习Nutch-1.5.1源码,开发者不仅可以掌握搜索引擎的核心技术,还能进一步提升在大数据处理、分布式系统和Java编程方面的专业能力。这对于从事相关领域工作或是研究搜索引擎优化(SEO)、信息检索和推荐...

    nutch2.2.1-src

    通过学习和研究Nutch源码,开发者不仅可以了解网络爬虫的工作流程,还可以学习到分布式计算、文本处理、搜索算法等多方面的知识。这对于构建自己的搜索引擎系统,或者在大数据领域进行深度开发有着极大的帮助。同时...

    Lucene nutch 搜索引擎 开发 实例 源码

    Nutch则是一个完整的网络爬虫项目,它扩展了Lucene的功能,集成了网页抓取、分析、存储和索引等一整套流程。Nutch的源码揭示了其如何使用HTTP协议抓取网页,通过Parser解析HTML内容,然后使用Lucene进行索引。特别地...

    nutch1.2源码

    要使用Nutch 1.2,你需要先安装Hadoop环境,然后编译Nutch源码,配置相应的参数,设置爬取种子,启动爬虫,最后进行索引和搜索。这个过程涉及的文件包括`conf`目录下的配置文件,如`nutch-site.xml`,以及`bin`目录...

    Lucene+Nutch本书源码+详细说明

    通过分析这些源码,我们可以学习如何将Nutch抓取的网页内容转化为适合Lucene索引的格式,如何使用Lucene的API构建和更新索引,以及如何设计查询解析器和搜索结果排序算法。 总的来说,这个资源对于想要深入了解搜索...

    nutch-1.3源码

    源码分析可以帮助我们掌握以下关键知识点: 1. **网络爬虫框架**:Nutch 提供了一个完整的爬虫框架,包括种子 URL 的管理、网页的抓取、下载、解析、存储等环节。通过源码,我们可以学习如何设计和实现大规模数据的...

    Nutch2.3.1 环境搭建

    1. 在Nutch源码目录下,使用Gradle构建项目: ``` ./gradlew clean compileJava ``` 2. 初始化数据库: ``` bin/nutch inject urls ``` 其中`urls`是你初始种子URL的文本文件。 3. 执行抓取周期: ``` bin...

    Apache Nutch 1.7 学习总结

    - 打开Cygwin终端,进入Nutch源码目录,配置环境,执行编译和构建命令。 4. **Nutch1.7 测试** - 初始化Nutch的配置文件,根据需求修改`conf/nutch-site.xml`。 - 运行Nutch的基本命令,如抓取种子URL (`bin/...

    Nutch源码研究

    要抓取这个页面,那么就...通过深入分析源码,开发者可以自定义抓取策略、优化性能,甚至开发新的协议插件以支持更多数据源。同时,Nutch 的设计思路也可以为其他分布式系统提供参考,比如大数据处理、网络爬虫项目等。

    eclipse配置nutch,eclipse配置nutch

    1. 访问Nutch的源码库,找到相应的库文件: - MP3解析库:`http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-mp3/lib` - RTF解析库:`...

    nutch 初学文档教材

    1. nutch简介...1 1.1什么是nutch..1 1.2研究nutch的原因...1 1.3 nutch的目标..1 1.4 nutch VS lucene.....2 2. nutch的安装与配置.....3 2.1 JDK的安装与配置.3 2.2 nutch的安装与配置........5 2.3 tomcat的安装...

    nutch爬虫资料

    在源码分析方面,Nutch的源代码结构清晰,适合学习和扩展。主要组件如Fetcher负责下载网页,Parser解析HTML内容,Analyzer进行文本处理,Indexer建立倒排索引。通过阅读源码,可以了解到如何实现分布式爬虫,如何...

    nutch帮助文档;nutch学习 入门

    1. **Nutch简介** Nutch是一个高度可扩展的开源搜索引擎,它提供了网页抓取、解析、过滤、索引和搜索等功能。Nutch最初设计的目标是创建一个与商业搜索引擎相媲美的开放源代码搜索解决方案,用于企业内部或特定领域...

Global site tag (gtag.js) - Google Analytics