`

nutch源码阅读(1)-Crawl

 
阅读更多

        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);
  }

          Open Declarationorg.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源码阅读

    ### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...

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

    通过阅读源码,你可以学习到如何设计和实现大规模的网络爬虫系统,以及如何使用 Hadoop 进行分布式处理。 **使用与开发** 如果你打算使用或开发 Nutch,你需要有扎实的 Java 基础和一定的 Hadoop 知识。首先,解压...

    apache-nutch-1.6-src.tar.gz

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

    nutch2.2.1-src

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

    myeclipse8.5导入nutch1.2源码

    - 编辑 `conf/crawl-urlfilter.txt` 文件,去掉对所有 URL 的限制,如注释掉 `(+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/)` 这一行。 - 修改 `nutch-site.xml` 文件,在 `&lt;configuration&gt;` 标签内添加以下属性: -...

    apache-nutch-2.3-src.zip

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

    nutch crawl代码解析

    接着,`conf.addDefaultResource("crawl-tool.xml")` 加载了 Nutch 的特定配置文件 `crawl-tool.xml`,这个文件定义了 Nutch 抓取工具的特定设置。 然后,`NutchJob(conf)` 被用来创建一个 `JobConf` 对象,这是 ...

    Windows下配置nutch

    - 修改配置文件,如 `nutch-site.xml` 和 `crawl-urlfilter.txt`,以适应你的需求。 - **借助 Cygwin 使用 Nutch**: - 安装 Cygwin,这是一个模拟 Linux 环境的工具,使得可以在 Windows 上运行 Linux 命令行...

    Eclipse中编译Nutch-0.9

    - **下载Nutch源码**:访问Apache官方网站或其镜像站点,下载Nutch-0.9源码并解压缩至本地目录。 - **创建Java Project**:在Eclipse中创建一个新的Java Project,命名为"Nutch",并选择“Create project from ...

    Nutch2.3.1 环境搭建

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

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

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

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

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

    windows下的nutch配置总结

    - 打开命令行,导航到Nutch源码目录,运行`mvn clean install -DskipTests`命令,这将编译Nutch并创建可执行的JAR文件。 4. **配置Nutch**: - 修改`conf/nutch-site.xml`文件,设置抓取策略、存储路径、抓取间隔...

    nutch1.2源码

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

    nutch帮助文档;nutch学习 入门

    - **学习源码**:深入阅读Nutch的源码,理解其内部机制和工作流程。 - **实践项目**:尝试建立自己的小规模搜索引擎项目,应用Nutch解决实际问题。 5. **参考资料** - 官方文档:Apache Nutch官网提供了详细的...

    Nutch相关框架视频教程 (1-20)(PDF)

    12. **获取Nutch源码**:使用SVN命令从Apache仓库中检出指定版本的Nutch源代码。 13. **构建项目**:使用Ant构建Nutch项目,并设置URL文件以及配置文件`nutch-site.xml`。 14. **启动爬虫**:通过Nutch提供的命令...

    Nutch 0.8笔记NUTCHNUTCH

    1. **文档阅读**:深入了解 Nutch 需要阅读官方提供的文档,如 "Introduction to Nutch, Part 1 Crawling" 和 "Introduction to Nutch, Part 2 Searching",以及源代码。Nutch 的源码结构清晰,便于理解和学习。 2....

    nutch入门实例教程.pdf

    - **执行抓取命令**: 使用 `bin/nutch crawl` 命令开始抓取。 - **测试结果**: 检查抓取的数据是否符合预期。 - **Intranet Recrawl**: 对已抓取的内部网进行周期性的重新抓取。 - **爬行全网**: - **数据集...

    Nutch程序运行环境配置

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

Global site tag (gtag.js) - Google Analytics