`
wbj0110
  • 浏览: 1598363 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Nutch抓取源码分析之Crawl类

阅读更多

1、初始化一个Configuration实例设置抓取工作配置;

2、设置一些默认抓取工作参数,比如进程数threads、抓取深度depth、抓取网页数量topN;

3、创建抓取工作抓取到的网页文件的存放目录(crawldb、linkdb、segments、indexes、index),用来存放原生网页,以及网页解析出的文本内容及其其它相关数据;

4、在抓取工作及其索引过程中,这通过初始化一些实现了这些操作的类的实例来完成的,例如:InjectorGeneratorFetcherParseSegment、CrawlDb、LinkDb、Indexer、DeleteDuplicates、IndexMerger。

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

[java] view plaincopy
 
  1. //初始化配置文件  
  2.     Configuration conf = NutchConfiguration.createCrawlConfiguration();  
  3.     JobConf job = new NutchJob(conf);  
  4. // urls存放目录  
  5.     Path rootUrlDir = null;  
  6. Path dir = new Path("crawl-" + getDate());  
  7. //抓取线程数目  
  8. int threads = job.getInt("fetcher.threads.fetch"10);  
  9. //抓取工作遍历深度  
  10.     int depth = 5;  
  11.     long topN = Long.MAX_VALUE;  
  12.     String indexerName = "lucene";  
  13.     String solrUrl = null;  
  14.       
  15.     for (int i = 0; i < args.length; i++) {  
  16.       if ("-dir".equals(args[i])) {  
  17.         dir = new Path(args[i+1]);  
  18.         i++;  
  19.       } else if ("-threads".equals(args[i])) {  
  20.         threads = Integer.parseInt(args[i+1]);  
  21.         i++;  
  22.       } else if ("-depth".equals(args[i])) {  
  23.         depth = Integer.parseInt(args[i+1]);  
  24.         i++;  
  25.       } else if ("-topN".equals(args[i])) {  
  26.           topN = Integer.parseInt(args[i+1]);  
  27.           i++;  
  28.       } else if ("-solr".equals(args[i])) {  
  29.         indexerName = "solr";  
  30.         solrUrl = StringUtils.lowerCase(args[i + 1]);  
  31.         i++;  
  32.       } else if (args[i] != null) {  
  33.         rootUrlDir = new Path(args[i]);  
  34.       }  
  35.     }  
  36. FileSystem fs = FileSystem.get(job);  
  37. //抓取工作的不同操作需要的五个目录  
  38.     Path crawlDb = new Path(dir + "/crawldb");  
  39.     Path linkDb = new Path(dir + "/linkdb");  
  40.     Path segments = new Path(dir + "/segments");  
  41.     Path indexes = new Path(dir + "/indexes");  
  42.     Path index = new Path(dir + "/index");  
  43.     Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());  
  44.     Injector injector = new Injector(conf);  
  45.     Generator generator = new Generator(conf);  
  46.     Fetcher fetcher = new Fetcher(conf);  
  47.     ParseSegment parseSegment = new ParseSegment(conf);  
  48.     CrawlDb crawlDbTool = new CrawlDb(conf);  
  49.     LinkDb linkDbTool = new LinkDb(conf);  
  50.     // 初始化crawlDb  
  51.     injector.inject(crawlDb, rootUrlDir);  
  52.     int i;  
  53. for (i = 0; i < depth; i++) {             // generate new segment  
  54. //生成抓取工作列表,文件名以时间挫命名  
  55.       Path[] segs = generator.generate(crawlDb, segments, -1, topN, System  
  56.           .currentTimeMillis());  
  57.       if (segs == null) {  
  58.         LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");  
  59.         break;  
  60.       }  
  61.       //抓取网页内容  
  62.       fetcher.fetch(segs[0], threads, org.apache.nutch.fetcher.Fetcher.isParsing(conf));  // fetch it  
  63.       if (!Fetcher.isParsing(job)) {  
  64. //解析网页内容  
  65.         parseSegment.parse(segs[0]);    // parse it, if needed  
  66.       }  
  67. //更新CrawlDB  
  68.       crawlDbTool.update(crawlDb, segs, truetrue); // update crawldb  
  69. }  
  70.   
  71.     if (i > 0) {  
  72.       linkDbTool.invert(linkDb, segments, truetruefalse); // invert links  
  73.       // index, dedup & merge  
  74.       FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs));  
  75.       if (isSolrIndex) {  
  76.         SolrIndexer indexer = new SolrIndexer(conf);  
  77.         indexer.indexSolr(solrUrl, crawlDb, linkDb,   
  78.             Arrays.asList(HadoopFSUtil.getPaths(fstats)));  
  79.       }  
  80.       else {  
  81.         DeleteDuplicates dedup = new DeleteDuplicates(conf);          
  82.         if(indexes != null) {  
  83.           // Delete old indexes  
  84.           if (fs.exists(indexes)) {  
  85.             LOG.info("Deleting old indexes: " + indexes);  
  86.             fs.delete(indexes, true);  
  87.           }  
  88.           // Delete old index  
  89.           if (fs.exists(index)) {  
  90.             LOG.info("Deleting old merged index: " + index);  
  91.             fs.delete(index, true);  
  92.           }  
  93.         }  
  94.         //索引过程  
  95.         Indexer indexer = new Indexer(conf);  
  96.         indexer.index(indexes, crawlDb, linkDb,   
  97.             Arrays.asList(HadoopFSUtil.getPaths(fstats)));  
  98.           
  99.         IndexMerger merger = new IndexMerger(conf);  
  100.         if(indexes != null) {  
  101.           //复制索引文件  
  102.           dedup.dedup(new Path[] { indexes });  
  103.           fstats = fs.listStatus(indexes, HadoopFSUtil.getPassDirectoriesFilter(fs));  
  104.           //将索引目录index 中的索引文件合并后写入到indexes 目录中  
  105.           merger.merge(HadoopFSUtil.getPaths(fstats), index, tmpDir);  
  106.         }  
  107.       }      
  108.     }   

转:http://blog.csdn.net/cdl2008sky/article/details/7219825

分享到:
评论

相关推荐

    nutch crawl代码解析

    通过理解和分析 `Crawl` 类的源码,开发者可以更好地掌握 Nutch 如何处理输入,以及如何根据这些输入配置和执行复杂的网络抓取任务。对于想要深入了解 Nutch 或者想要定制 Nutch 功能的人来说,研究 `Crawl` 类的...

    nutch1.2源码

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

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

    特别地,Nutch中的Crawl和Fetch阶段展示了如何管理URL队列,以及如何决定何时重新抓取网页。 在学习Lucene和Nutch的源码时,你会遇到以下几个关键概念: 1. **分词**:Lucene使用Analyzer对输入文本进行分词,不同...

    nutch2.2.1-src

    1. **Nutch框架**:Nutch的核心框架提供了爬虫的基本架构,包括种子URL的管理、网页抓取、分词、链接分析等。框架设计灵活,支持插件机制,方便开发者根据需求定制。 2. **Fetcher模块**:负责从Web上下载网页。它...

    Nutch2.3.1 环境搭建

    在本文中,我们将深入探讨如何搭建Nutch2.3.1的运行环境,以便进行网页抓取和分析。 **一、系统需求** 首先,确保你的系统满足以下基本要求: 1. 操作系统:Nutch可以在Linux、Unix或Mac OS X等类Unix系统上运行,...

    nutch帮助文档;nutch学习 入门

    - **运行Nutch流程**:执行`bin/nutch crawl`命令,依次进行抓取、解析、索引等步骤。 - **使用Solr或Elasticsearch**:Nutch可以将索引数据导出到Solr或Elasticsearch,以实现更强大的搜索功能。 - **学习源码**...

    搜索引擎nutch配置

    编译完成后,可以运行Nutch的命令行工具,如`bin/nutch inject`来注入种子URL,`bin/nutch fetch`执行抓取,`bin/nutch update`更新已抓取的页面,`bin/nutch generate`生成待抓取的URL列表,以及`bin/nutch crawl`...

    eclipse配置nutch,eclipse配置nutch

    在IT领域,Apache Nutch是一款开源的Web爬虫项目,用于抓取网页并进行索引。而Eclipse作为一款流行的集成开发环境(IDE),被广泛应用于Java开发中。本文将详细解析如何在Eclipse中配置Nutch,以便于开发者更好地...

    nutch1.2 java project

    6. **抓取策略**:Nutch 提供了基于链接分析的抓取策略,通过 PageRank 或其他算法确定哪些页面应该优先抓取。 7. **存储与索引**:Nutch 可以将抓取的网页存储在 HDFS 上,并使用 Apache Solr 或 Elasticsearch ...

    apache-nutch-1.6-src.tar.gz

    主要的源代码文件位于`src/java`目录下,按照包结构组织,例如`org.apache.nutch.crawl`、`org.apache.nutch.indexer`和`org.apache.nutch.parse`等。 2. **配置文件**:在`conf`目录下,有默认的Nutch配置文件,如...

    Nutch简要文档

    3. **Fetcher**:`Fetcher` 根据 `Generator` 生成的抓取列表下载网页,`Fetcher` 命令可设置线程数来控制并发抓取,下载后的网页源码存放在 `content` 文件夹,状态信息存放在 `crawl_fetch` 文件夹。 4. **Parse*...

    Windows下配置nutch

    - 导入 Nutch 源码,将 `src\java` 目录下的 `org` 文件夹复制到 Java 项目的 `src` 目录下。 - 将 `conf`, `lib`, `plugins` 目录复制到与 `src` 同级目录,并将 `conf` 添加到项目路径。 - 配置项目的 Build...

    Eclipse中编译Nutch-0.9

    ### Eclipse中编译Nutch-0.9:详解与步骤 #### 核心知识点概览 在本篇文章中,我们将深入探讨如何在Eclipse环境中编译Nutch-...通过遵循上述指南,即使是初学者也能快速上手,利用Nutch-0.9高效抓取和分析网络数据。

    apache-nutch-2.3-src.zip

    **Nutch 2.3 源码分析:** 1. **源码目录结构**:解压后的apache-nutch-2.3目录包含了源代码、配置文件、构建脚本等。主要目录有`src/main/`,其中`src/main/java`存放Java源码,`src/main/resources`存储配置文件...

    \Lucene Nutch和安装说明文旦

    5. **初始化数据库**: 创建并初始化HBase或MySQL等数据库,用于存储Nutch抓取的URL和元数据。 6. **启动服务**: 启动Hadoop和Nutch相关的服务,如HDFS和MapReduce。 7. **运行Nutch**: 执行爬虫任务,如`bin/nutch ...

    apache-nutch-1.16.rar 已编译好的版本,可以直接导入eclipse、idea

    例如,`bin/nutch crawl urls -dir crawl -depth 2 -topN 10`会启动一个深度为2的爬取,并返回前10个结果。 5. **调试和扩展**:利用IDE的调试功能,你可以对Nutch的代码进行逐行分析,理解其工作原理,或者在需要...

    Nutch程序运行环境配置

    - 最后,通过调用`Crawl`类的`main`方法,如`org.apache.nutch.crawl.Crawl.main()`,可以启动Nutch的爬取过程。参数如`rootUrlDir`(起始URL目录)、`threads`(线程数)和`topN`(要抓取的页面数量)可以定制爬虫...

    apache-nutch-1.3-src.tar.gz_nutch_nutch-1.3.tar.gz

    **源码分析** 下载 "apache-nutch-1.3-src.tar.gz" 后,你可以深入了解 Nutch 的工作原理和架构。源码包括了各个模块的实现,如 Crawl、Fetch、Parse、Index、Search 等。通过阅读源码,你可以学习到如何设计和实现...

    nutch爬虫+java+eclipse

    1.4 链接分析:Nutch使用PageRank或其他链接分析算法对抓取的网页进行排序,确定其重要性。 1.5 索引:Nutch支持多种索引库,如Lucene,用于存储和检索抓取的网页内容。 二、Java在爬虫开发中的应用 Java是一种多...

Global site tag (gtag.js) - Google Analytics