一起读nutch源码一 -- crawl

crawl:one-step crawler for intranets  一站式的爬取。 也就是将 inject,generate,fetch,parse,updatedb这些都合并到这一个操作中完成。那就从crawl开始研究吧。

crawl类在 org.apache.nutch.crawl.Crawl

先看main方法:

  public static void main(String args[]) throws Exception {
   //读取配置文件,包括nutch-default.xml,nutch-site.xml  
   Configuration conf = NutchConfiguration.create();
   //对hadoop的一些配置设置,及解析用户输入放入数组中
    int res = ToolRunner.run(conf, new Crawl(), args);
    System.exit(res);
  }

 接着会执行run方法:

 

//抓取的数据存放的默认的根目录
    Path dir = new Path("crawl-" + getDate());
    //fetch抓取的时候执行的线程数,默认值为10
    int threads = getConf().getInt("fetcher.threads.fetch", 10);

//mapred任务
    JobConf job = new NutchJob(getConf());

//注入url到crawldb的对象
    Injector injector = new Injector(getConf());
    //生成抓取列表的对象
    Generator generator = new Generator(getConf());
    //抓取网页的对象
    Fetcher fetcher = new Fetcher(getConf());
    //解析抓取内容
    ParseSegment parseSegment = new ParseSegment(getConf());
    //抓取url相关信息存放的地方
    CrawlDb crawlDbTool = new CrawlDb(getConf());
    LinkDb linkDbTool = new LinkDb(getConf());
      
    // initialize crawlDb
    //将rootUrlDir下的url信息注入crawlDb中,只需要最初的时候执行一次即可
    injector.inject(crawlDb, rootUrlDir);
    int i;
    //抓取depth次
    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

 /*
       * 这里根据nutch-default.xml中的 fetcher.parse属性做判断,默认为false。
       * false:表示在fetcher的阶段不对网页内容做解析,而是分开步骤在fetch完成后专门解析;
       * true:表示在fetcher阶段就对网页内容做解析。
       */
      if (!Fetcher.isParsing(job)) {
     //解析抓取的网页  
        parseSegment.parse(segs[0]);    // parse it, if needed
      }
      //更加解析后数据更新crawldb
      crawlDbTool.update(crawlDb, segs, true, true); // update crawldb
    }
    if (i > 0) {
      //链接反转 
      linkDbTool.invert(linkDb, segments, true, true, false); // invert links
      //如果有solr,对解析的页面生成索引等
      if (solrUrl != null) {
        // index, dedup & merge
        FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs));
        SolrIndexer indexer = new SolrIndexer(getConf());

可以看到,crawl就是将各个步骤整合在一个类中执行了,所以后面需要对每个具体的操作来进行分析。

 

你可能感兴趣的:(Nutch)