Nutch抓取源码分析之Injector类

(1) 将URL集合进行格式化和过滤,消除其中的非法URL,并设定URL状态(UNFETCHED),按照一定方法进行初始化分值;

(2) 将URL进行合并,消除重复的URL入口;

(3) 将URL及其状态、分值存入crawldb数据库,与原数据库中重复的则删除旧的,更换新的。

 

inject方法

 

[java]  view plain copy
 
  1. public void inject(Path crawlDb, Path urlDir) throws IOException {  
  2.     //创建临时目录  
  3.     Path tempDir = new Path(getConf().get("mapred.temp.dir"".") +  
  4.                "/inject-temp-"+  
  5.                Integer.toString(new Random().nextInt(Integer.MAX_VALUE)));  
  6.    // map text input file to a <url,CrawlDatum> file  
  7.     JobConf sortJob = new NutchJob(getConf());  
  8.     sortJob.setJobName("inject " + urlDir);  
  9.     FileInputFormat.addInputPath(sortJob, urlDir);  
  10.     sortJob.setMapperClass(InjectMapper.class);  
  11.     FileOutputFormat.setOutputPath(sortJob, tempDir);  
  12.     sortJob.setOutputFormat(SequenceFileOutputFormat.class);  
  13.     sortJob.setOutputKeyClass(Text.class);  
  14.     sortJob.setOutputValueClass(CrawlDatum.class);  
  15.     sortJob.setLong("injector.current.time", System.currentTimeMillis());  
  16.     JobClient.runJob(sortJob);  
  17.   
  18.     // merge with existing crawl db  
  19.     JobConf mergeJob = CrawlDb.createJob(getConf(), crawlDb);  
  20.     FileInputFormat.addInputPath(mergeJob, tempDir);  
  21.     mergeJob.setReducerClass(InjectReducer.class);  
  22.     JobClient.runJob(mergeJob);  
  23.     CrawlDb.install(mergeJob, crawlDb);  
  24.     // 删除临时文件  
  25.     FileSystem fs = FileSystem.get(getConf());  
  26.     fs.delete(tempDir, true);  
  27.     long end = System.currentTimeMillis();  
  28. }  

InjectMapper类

[java]  view plain copy
 
  1. public static class InjectMapper implements Mapper<WritableComparable, Text, Text, CrawlDatum> {  
  2.     private URLNormalizers urlNormalizers; //URL 标准化工具  
  3.     private int interval;   //设置抓取间隔时间  
  4.     private float scoreInjected; //url 对页面的得分值  
  5.     private JobConf jobConf;  
  6.     private URLFilters filters;    //url 过滤器  
  7.     private ScoringFilters scfilters;  //得分器  
  8.     private long curTime;  
  9.   
  10.     public void configure(JobConf job) {  
  11.       this.jobConf = job;  
  12.       urlNormalizers = new URLNormalizers(job, URLNormalizers.SCOPE_INJECT);  
  13.       interval = jobConf.getInt("db.fetch.interval.default"2592000);  
  14.       filters = new URLFilters(jobConf);  
  15.       scfilters = new ScoringFilters(jobConf);  
  16.       scoreInjected = jobConf.getFloat("db.score.injected"1.0f);  
  17.       curTime = job.getLong("injector.current.time", System.currentTimeMillis());  
  18.     }  
  19.     public void close() {}  
  20.     public void map(WritableComparable key, Text value,  
  21.                     OutputCollector<Text, CrawlDatum> output, Reporter reporter)  
  22.       throws IOException {  
  23.       String url = value.toString();              // value is line of text  
  24.   
  25.       if (url != null && url.trim().startsWith("#")) {  
  26.                  return;  
  27.       }  
  28.        
  29.       // if tabs : metadata that could be stored  
  30.       // must be name=value and separated by \t  
  31.       float customScore = -1f;  
  32.       int customInterval = interval;  
  33.       Map<String,String> metadata = new TreeMap<String,String>();  
  34.       if (url.indexOf("\t")!=-1){  
  35.           String[] splits = url.split("\t");  
  36.           url = splits[0];  
  37.           for (int s=1;s<splits.length;s++){  
  38.               // find separation between name and value  
  39.               int indexEquals = splits[s].indexOf("=");  
  40.               if (indexEquals==-1) {  
  41.                   // skip anything without a =  
  42.                   continue;           
  43.               }  
  44.               String metaname = splits[s].substring(0, indexEquals);  
  45.               String metavalue = splits[s].substring(indexEquals+1);  
  46.               if (metaname.equals(nutchScoreMDName)) {  
  47.                   try {  
  48.                   customScore = Float.parseFloat(metavalue);}  
  49.                   catch (NumberFormatException nfe){}  
  50.               }  
  51.               else if (metaname.equals(nutchFetchIntervalMDName)) {  
  52.                   try {  
  53.                       customInterval = Integer.parseInt(metavalue);}  
  54.                   catch (NumberFormatException nfe){}  
  55.               }  
  56.               else metadata.put(metaname,metavalue);  
  57.           }  
  58.       }  
  59.       try {  
  60.         //url 标准化  
  61.         url = urlNormalizers.normalize(url, URLNormalizers.SCOPE_INJECT);  
  62.         //过滤非法url  
  63.         url = filters.filter(url);               
  64.       } catch (Exception e) {  
  65.         if (LOG.isWarnEnabled()) { LOG.warn("Skipping " +url+":"+e); }  
  66.         url = null;  
  67.       }  
  68.       if (url != null) {                          // if it passes  
  69.         value.set(url);                           // collect it  
  70.        // CrawlDatum保存注入状态、抓取间隔时间,抓取时间、得分等等  
  71.         CrawlDatum datum = new CrawlDatum(CrawlDatum.STATUS_INJECTED, customInterval);  
  72.         datum.setFetchTime(curTime);  
  73.         // now add the metadata  
  74.         Iterator<String> keysIter = metadata.keySet().iterator();  
  75.         while (keysIter.hasNext()){  
  76.             String keymd = keysIter.next();  
  77.             String valuemd = metadata.get(keymd);  
  78.             datum.getMetaData().put(new Text(keymd), new Text(valuemd));  
  79.         }  
  80.         if (customScore != -1) datum.setScore(customScore);  
  81.         else datum.setScore(scoreInjected);  
  82.         try {  
  83.             scfilters.injectedScore(value, datum);  
  84.         } catch (ScoringFilterException e) {  
  85.             if (LOG.isWarnEnabled()) {  
  86.                 LOG.warn("Cannot filter injected score for url " + url  
  87.                         + ", using default (" + e.getMessage() + ")");  
  88.             }  
  89.         }  
  90.         output.collect(value, datum);  
  91.       }  
  92.     }  
  93.   }  

 

InjectReducer 类

 

[java]  view plain copy
 
  1. public static class InjectReducer implements Reducer<Text, CrawlDatum, Text, CrawlDatum> {  
  2.    public void configure(JobConf job) {}      
  3.    public void close() {}  
  4.    private CrawlDatum old = new CrawlDatum();  
  5.    private CrawlDatum injected = new CrawlDatum();  
  6.      
  7.    public void reduce(Text key, Iterator<CrawlDatum> values,  
  8.                       OutputCollector<Text, CrawlDatum> output, Reporter reporter)  
  9.      throws IOException {  
  10.      boolean oldSet = false;  
  11.      while (values.hasNext()) {  
  12.        CrawlDatum val = values.next();  
  13.    // 如果某个URL已经注入到CrawlDB  
  14.        if (val.getStatus() == CrawlDatum.STATUS_INJECTED) {  
  15.          injected.set(val);  
  16.          //设置状态为不需要抓取  
  17.          injected.setStatus(CrawlDatum.STATUS_DB_UNFETCHED);  
  18.        } else {  
  19.          old.set(val);  
  20.          oldSet = true;  
  21.        }  
  22.      }  
  23.      CrawlDatum res = null;  
  24.      if (oldSet) res = old; // don't overwrite existing value  
  25.      else res = injected;  
  26.      output.collect(key, res);  
  27.    }  
  28.  }  

转自:http://blog.csdn.net/cdl2008sky/article/details/7219836

你可能感兴趣的:(Nutch)