org.apache.nutch.crawl.Crawl实现的是一个完成的抓取过程,所以由它开始。
/* Perform complete crawling and indexing (to Solr) given a set of root urls and the -solr parameter respectively. More information and Usage parameters can be found below. */ public static void main(String args[]) throws Exception { Configuration conf = NutchConfiguration.create(); int res = ToolRunner.run(conf, new Crawl(), args); System.exit(res); }
org.apache.nutch.util.NutchConfiguration
/** * Add the standard Nutch resources to {@link Configuration}. * * @param conf Configuration object to which * configuration is to be added. */ private static Configuration addNutchResources(Configuration conf) { conf.addResource("nutch-default.xml"); conf.addResource("nutch-site.xml"); return conf; }
初始化时,加载nutch-default.xml,nutch-site.xml.
@Override public int run(String[] args) throws Exception { if (args.length < 1) { System.out.println ("Usage: Crawl <urlDir> -solr <solrURL> [-dir d] [-threads n] [-depth i] [-topN N]"); return -1; } 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; //获得输入参数 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 = args[i + 1]; i++; } else if (args[i] != null) { rootUrlDir = new Path(args[i]); } } JobConf job = new NutchJob(getConf()); if (solrUrl == null) { LOG.warn("solrUrl is not set, indexing will be skipped..."); } FileSystem fs = FileSystem.get(job); if (LOG.isInfoEnabled()) { LOG.info("crawl started in: " + dir); LOG.info("rootUrlDir = " + rootUrlDir); LOG.info("threads = " + threads); LOG.info("depth = " + depth); LOG.info("solrUrl=" + solrUrl); if (topN != Long.MAX_VALUE) LOG.info("topN = " + topN); } //建立爬取过程中存放信息的文件夹,对应着各个阶段 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(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()); // initialize crawlDb 初始化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); // fetch it 抓取 if (!Fetcher.isParsing(job)) { parseSegment.parse(segs[0]); // parse it, if needed 解析 } crawlDbTool.update(crawlDb, segs, true, true); // update crawldb 更新crawlDb数据库 } if (i > 0) { linkDbTool.invert(linkDb, segments, true, true, false); // invert links 计算反向链接 if (solrUrl != null) { // index, dedup & merge 使用solr建立索引 FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs)); 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); } } else { LOG.warn("No URLs to fetch - check your seed list and URL filters."); } if (LOG.isInfoEnabled()) { LOG.info("crawl finished: " + dir); } return 0; }
相关推荐
### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...
通过阅读源码,你可以学习到如何设计和实现大规模的网络爬虫系统,以及如何使用 Hadoop 进行分布式处理。 **使用与开发** 如果你打算使用或开发 Nutch,你需要有扎实的 Java 基础和一定的 Hadoop 知识。首先,解压...
主要的源代码文件位于`src/java`目录下,按照包结构组织,例如`org.apache.nutch.crawl`、`org.apache.nutch.indexer`和`org.apache.nutch.parse`等。 2. **配置文件**:在`conf`目录下,有默认的Nutch配置文件,如...
通过学习和研究Nutch源码,开发者不仅可以了解网络爬虫的工作流程,还可以学习到分布式计算、文本处理、搜索算法等多方面的知识。这对于构建自己的搜索引擎系统,或者在大数据领域进行深度开发有着极大的帮助。同时...
- 编辑 `conf/crawl-urlfilter.txt` 文件,去掉对所有 URL 的限制,如注释掉 `(+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/)` 这一行。 - 修改 `nutch-site.xml` 文件,在 `<configuration>` 标签内添加以下属性: -...
1. **源码目录结构**:解压后的apache-nutch-2.3目录包含了源代码、配置文件、构建脚本等。主要目录有`src/main/`,其中`src/main/java`存放Java源码,`src/main/resources`存储配置文件,`src/main/webapp`包含Web...
接着,`conf.addDefaultResource("crawl-tool.xml")` 加载了 Nutch 的特定配置文件 `crawl-tool.xml`,这个文件定义了 Nutch 抓取工具的特定设置。 然后,`NutchJob(conf)` 被用来创建一个 `JobConf` 对象,这是 ...
- 修改配置文件,如 `nutch-site.xml` 和 `crawl-urlfilter.txt`,以适应你的需求。 - **借助 Cygwin 使用 Nutch**: - 安装 Cygwin,这是一个模拟 Linux 环境的工具,使得可以在 Windows 上运行 Linux 命令行...
- **下载Nutch源码**:访问Apache官方网站或其镜像站点,下载Nutch-0.9源码并解压缩至本地目录。 - **创建Java Project**:在Eclipse中创建一个新的Java Project,命名为"Nutch",并选择“Create project from ...
1. 在Nutch源码目录下,使用Gradle构建项目: ``` ./gradlew clean compileJava ``` 2. 初始化数据库: ``` bin/nutch inject urls ``` 其中`urls`是你初始种子URL的文本文件。 3. 执行抓取周期: ``` bin...
特别地,Nutch中的Crawl和Fetch阶段展示了如何管理URL队列,以及如何决定何时重新抓取网页。 在学习Lucene和Nutch的源码时,你会遇到以下几个关键概念: 1. **分词**:Lucene使用Analyzer对输入文本进行分词,不同...
例如,`bin/nutch crawl urls -dir crawl -depth 2 -topN 10`会启动一个深度为2的爬取,并返回前10个结果。 5. **调试和扩展**:利用IDE的调试功能,你可以对Nutch的代码进行逐行分析,理解其工作原理,或者在需要...
- 打开命令行,导航到Nutch源码目录,运行`mvn clean install -DskipTests`命令,这将编译Nutch并创建可执行的JAR文件。 4. **配置Nutch**: - 修改`conf/nutch-site.xml`文件,设置抓取策略、存储路径、抓取间隔...
要使用Nutch 1.2,你需要先安装Hadoop环境,然后编译Nutch源码,配置相应的参数,设置爬取种子,启动爬虫,最后进行索引和搜索。这个过程涉及的文件包括`conf`目录下的配置文件,如`nutch-site.xml`,以及`bin`目录...
- **学习源码**:深入阅读Nutch的源码,理解其内部机制和工作流程。 - **实践项目**:尝试建立自己的小规模搜索引擎项目,应用Nutch解决实际问题。 5. **参考资料** - 官方文档:Apache Nutch官网提供了详细的...
12. **获取Nutch源码**:使用SVN命令从Apache仓库中检出指定版本的Nutch源代码。 13. **构建项目**:使用Ant构建Nutch项目,并设置URL文件以及配置文件`nutch-site.xml`。 14. **启动爬虫**:通过Nutch提供的命令...
1. **文档阅读**:深入了解 Nutch 需要阅读官方提供的文档,如 "Introduction to Nutch, Part 1 Crawling" 和 "Introduction to Nutch, Part 2 Searching",以及源代码。Nutch 的源码结构清晰,便于理解和学习。 2....
- **执行抓取命令**: 使用 `bin/nutch crawl` 命令开始抓取。 - **测试结果**: 检查抓取的数据是否符合预期。 - **Intranet Recrawl**: 对已抓取的内部网进行周期性的重新抓取。 - **爬行全网**: - **数据集...
- 最后,通过调用`Crawl`类的`main`方法,如`org.apache.nutch.crawl.Crawl.main()`,可以启动Nutch的爬取过程。参数如`rootUrlDir`(起始URL目录)、`threads`(线程数)和`topN`(要抓取的页面数量)可以定制爬虫...