(以下分析针对的是 nutch 1.4)
Crawl 类是运行抓取程序的入口,代码不多,但关联的其他类不少。
抓取的流程是:
1. 将初始的 URL 地址注入到 crawlDb
2. 从crawldb中生成一个url的子集用于抓取
3. 抓取网页
4. 分析网页
5. 更新 crawlDb ,增加新抓取的 url
6. 循环执行 2-5 步,直到达到指定的抓取深度
之后,还需要进行链接反转,将索引导入到 solr 等。
Crawl 类的声明如下:
public class Crawl extends Configured implements Tool
Configured 和 Tool 是 hadoop 中的概念
Configured 是 hadoop 中用来提供配置信息的,在 ToolRunner.run 方法中,会将创建好的 Configuration 对象通过 Configured.setConf 方法注入到 Crawl 中。
Tool 是 hadoop 中用来处理命令行参数并修改 Map-Reduce 任务的参数,它需要在 run 方法中处理这些命令行参数。
因为 Crawl 实现了 Tool 接口,我们可以通过命令行启动数据抓取的 Map-Reduce 任务。
启动 Crawl 的 main 方法如下:
public static void main(String args[]) throws Exception {
// 创建 Configuration 对象
Configuration conf = NutchConfiguration.create();
// 执行任务
int res = ToolRunner.run(conf, new Crawl(), args);
// 退出程序
System.exit(res);
}
NutchConfiguration.create 会加载 nutch-default.xml 和 nutch-site.xml 中的配置信息生成 Configuration 对象。
ToolRunner.run 方法会将创建好的 Configuration 对象通过 Configured.setConf 方法注入到 Crawl 中(Crawl 继承了Configured),并将参数的处理委托给 Tool.run 方法(Crawl 实现了 Tool 接口,因此需要提供 run 方法的实现)。
接下来我们重点分析一下 Crawl 类的 run 方法。
首先是参数的设置:
// 默认参数
Path rootUrlDir = null;
Path dir = new Path("crawl-" + getDate());
int threads = getConf().getInt("fetcher.threads.fetch", 10);
int depth = 5;
long topN = Long.MAX_VALUE;
String solrUrl = null;
这几个参数的含义如下:
rootUrlDir : 要抓取的起始 url 所在的目录
dir : 默认情况下,抓取时生成的文件的目录
threads : 抓取数据的线程数
depth : 通过外链抓取网页的深度,从起始 url 算起
topN : 每轮抓取获得的新的 url 中,只对分值最高的 topN 个 url 再次抓取
solrUrl : solr 的地址。用于调用 solr 的 api 建立用于搜索的索引。
这些参数是可以根据命令行的输入修改的:
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])) {
solrUrl = StringUtils.lowerCase(args[i + 1]);
i++;
} else if (args[i] != null) {
rootUrlDir = new Path(args[i]);
}
}
然后需要创建抓取程序将要用到的对象:
Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());
Injector injector = new Injector(getConf());
Generator generator = new Generator(getConf());
Fetcher fetcher = new Fetcher(getConf());
ParseSegment parseSegment = new ParseSegment(getConf());
CrawlDb crawlDbTool = new CrawlDb(getConf());
LinkDb linkDbTool = new LinkDb(getConf());
这里简要说明一下这些对象的作用:
injector : 将初始的 URL 地址到 crawlDb
generator : 生成要抓取的 URL
fetcher : 抓取网页
parseSegment : 分析网页
crawlDbTool : CrawlDb 类的实例,存放将要抓取的 URL
linkDbTool : 用于存放链接之间的引用关系,便于计算权重
完成以上的准备工作之后,就开始执行主要的处理逻辑:
// 初始化 crawlDb
// 将初始的 URL 地址到 crawlDb
injector.inject(crawlDb, rootUrlDir);
int i;
// 循环执行,直到达到指定的抓取深度
for (i = 0; i < depth; i++) {
// 生成要抓取的 URL
Path[] segs = generator.generate(crawlDb, segments, -1, topN, System.currentTimeMillis());
// 没有需要抓取的 URL 了,提前中止抓取过程
if (segs == null) {
LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");
break;
}
fetcher.fetch(segs[0], threads); // 抓取网页
if (!Fetcher.isParsing(job)) {
parseSegment.parse(segs[0]); // 分析网页
}
crawlDbTool.update(crawlDb, segs, true, true); // 更新 crawldb,增加需要抓取的 URL
}
前面通过抓取和分析网页得到的链接格式为 源链接 => 目标链接,
需要通过反转,得到目标链接对应的源链接,以便于计算目标链接的权重等:
linkDbTool.invert(linkDb, segments, true, true, false);
最后,如果指定了 solrUrl,需要将 nutch 索引导入到 solr 中
// 将索引导入到 solr
if (solrUrl != null) {
// 获取创建好的 nutch 索引的文件索引
FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs));
// 建立 Solr 索引
SolrIndexer indexer = new SolrIndexer(getConf());
indexer.indexSolr(solrUrl, crawlDb, linkDb, Arrays.asList(HadoopFSUtil.getPaths(fstats)));
// 去重
SolrDeleteDuplicates dedup = new SolrDeleteDuplicates();
dedup.setConf(getConf());
dedup.dedup(solrUrl);
}
以上只是对源代码进行字面上的分析,更深入的分析可以参考以下文章:
http://blog.csdn.net/kauu/article/details/1823830
http://www.diybl.com/course/3_program/java/javajs/20100719/459450.html
分享到:
相关推荐
获取与解压Nutch源代码** Nutch的源代码可以通过两种方式获取: - **下载发行版**:从官方网站`http://lucene.apache.org/nutch/release/`下载最新版本的Nutch,然后解压缩到你选择的目录。 - **使用Subversion**...
1. 进入Nutch源代码目录: ``` cd nutch ``` 2. 使用Maven构建Nutch: ``` mvn clean compile assembly:single ``` 这将生成一个包含所有依赖的jar文件。 **配置Nutch** 1. 在`conf`目录下,编辑`nutch-site...
在使用Nutch之前,你需要配置Nutch的运行环境,包括安装Java、设置Hadoop(如果需要分布式爬取)、下载和编译Nutch源代码。还需要配置Nutch的`conf/nutch-site.xml`文件,指定抓取策略、存储路径、爬虫范围等参数。 ...
2. apache-nutch-2.2.1-src.tar.gz:这是 Nutch 2.2.1 的源代码包。 3. apache-tomcat-8.5.39.tar.gz:Tomcat 是一个流行的 Java Servlet 和 JavaServer Pages(JSP)容器,用于运行 Nutch 的 Web 应用程序。 4. jdk...
安装完上述依赖后,将Nutch的源代码包下载到本地,解压至指定目录,如C:\nutch-0.9。解压后,需要修改nutch-site.xml文件以配置Nutch运行时的相关参数,例如配置抓取的用户代理名称: ```xml <name>...
2. 解压下载的源代码到你选择的工作目录,例如`/usr/local/src/nutch-2.3.1`。 **三、配置Nutch** 打开Nutch的`conf`目录,修改以下几个关键配置文件: 1. `build.gradle`:确保`nutchVersion`设置为你当前的Nutch...
11. **安装Subversion和Ant**:首先需要安装Subversion用于获取Nutch源代码,并安装Ant用于构建项目。 12. **获取Nutch源码**:使用SVN命令从Apache仓库中检出指定版本的Nutch源代码。 13. **构建项目**:使用Ant...
1. 使用 `bin/nutch crawl` 命令启动爬虫,指定种子 URL 文件(urls/url.txt)和工作目录。 2. 爬取的数据存储在 `data` 目录下,包括 crawl.db 数据库、segments 文件夹等。 3. `crawldb` 子命令用于查看和分析爬取...
1. **文档阅读**:深入了解 Nutch 需要阅读官方提供的文档,如 "Introduction to Nutch, Part 1 Crawling" 和 "Introduction to Nutch, Part 2 Searching",以及源代码。Nutch 的源码结构清晰,便于理解和学习。 2....
1. **源代码目录**:包含了所有Nutch项目的Java源代码,这些代码负责爬虫的各个模块,如爬行策略、URL过滤、网页解析、索引生成等。主要的源代码文件位于`src/java`目录下,按照包结构组织,例如`org.apache.nutch....
它通过跟踪网页中的链接来发现新的页面,这一过程由`src/java/org/apache/nutch/crawl`目录下的类负责,如`Fetcher`和`Injector`。 2. **解析(Parsing)**:抓取到的网页需要被解析以提取有用的信息。Nutch使用...
Nutch最初设计的目标是创建一个与商业搜索引擎相媲美的开放源代码搜索解决方案,用于企业内部或特定领域的信息检索。 2. **Nutch的功能** - **网页抓取**:Nutch使用爬虫技术,通过种子URL开始,遍历互联网上的...
Nutch 1.16是该项目的一个稳定版本,已经预先编译完成,方便开发者直接在Eclipse或IntelliJ IDEA这样的集成开发环境中导入使用,无需自行配置和编译源代码。 **Nutch的组成部分** 1. **Web爬虫**:Nutch的爬虫负责...
Nutch 是一个高度可扩展且开放源代码的网络爬虫项目,由 Apache 软件基金会维护。它不仅能够抓取网页,还能进行全文检索,通常运行在 Linux 环境下。而 MyEclipse 是一款功能强大的集成开发环境 (IDE),用于 JavaEE ...
总结,Nutch 0.9 版本为用户提供了完整的网络爬虫解决方案,包括Web界面、命令行工具和源代码,使得用户能够快速搭建和运行一个搜索引擎,同时也为开发者提供了深入学习和定制的机会。对于研究和实践搜索引擎技术的...
2. **项目结构**:Nutch 1.2 的项目结构包括源代码、配置文件、工作目录等。主要的代码集中在 `src` 目录下,包括 `java` 和 `conf` 子目录,其中 `conf` 包含了各种配置文件。 3. **配置文件**:`conf` 目录下的 `...
从Apache官方网站下载Nutch的最新源代码,通常通过Git克隆仓库。解压后,进入Nutch的工作目录。 3. **配置Nutch** 打开`conf/nutch-site.xml`文件,这是Nutch的主要配置文件。以下是一些关键配置项: - `...
- 或者,从 Subversion 检出最新源代码并使用 Ant 构建。 尝试执行以下命令以查看 Nutch 命令脚本的文档: ``` bin/nutch ``` 现在,我们可以开始爬取了。有两种爬取方式: 1. **内部网爬取**:使用 `crawl` 命令...
- **源代码管理**:Nutch使用**Subversion (SVN)**作为源代码管理系统。SVN是一种集中式的版本控制系统,能够有效管理项目的历史版本和变更记录。 #### 三、Lucene、Nutch与Hadoop的重要性 在搜索引擎领域,**...