nutch1.4 爬虫父页面参数传递到子页面注意事项

1、inject中以读取文件的方式传入自定义参数:

 

datum.getMetaData().put(KEY, VALUE);

 

 将文件中读取的参数加入。

2、fetch中 传递参数:

1、run方法中由QueueFeeder爬取队列维护爬取列表。

2、根据自定义的线程数量启动FetcherThread线程。

3、FetcherThread从队列中以原子方式获取爬取地址,爬取该地址网页内容并进行解析。解析过程由output()方法封装,该方法中传递参数依靠content来实现,如:

 

content.getMetadata().set(KEY, datum.getMetaData().get(KEY).toString());

 

 

由此将indect中datum传入的参数交给content。

 4、 output()方法 中parseResult变量为解析页面返回变量。

if (parseResult != null) {}部分目前为止未发现存在代码执行的情况,为了避免漏洞给予考虑,在for循环中增加

 

parseData.getContentMeta().set(KEY, datum.getMetaData().get(KEY).toString()); 

 

 

此时解析页面结果保存了参数。在解析结果子链接中增加如下代码:

 

if (maxOutlinkDepth > 0 && outlinkDepth < maxOutlinkDepth) {
             ........
              while(iter.hasNext() && outlinkCounter < maxOutlinkDepthNumLinks) {
                reporter.incrCounter("FetcherOutlinks", "outlinks_following", 1);

                // Create new FetchItem with depth incremented
                //追加修改,重新创建Datum,将父类的网站各项站点属性加入子链接中。
                
                CrawlDatum outLinkDatum = new CrawlDatum(CrawlDatum.STATUS_LINKED, interval);
                if(datum.getMetaData().get(CrawlUrlConstants.SOURCE) != null){
                    outLinkDatum.getMetaData().put(KEY, datum.getMetaData().get(KEY));
                }
                .......
                fetchQueues.addFetchItem(fit);

                outlinkCounter++;
              }
            }
 

 

 5、parseSegment中解析页面内容(注意:4中解析部分目前发现在此处实现)。

 

public void map(WritableComparable key, Content content,
                  OutputCollector<Text, ParseImpl> output, Reporter reporter)
 

 

方法中

 

parseResult = new ParseUtil(getConf()).parse(content); 

 

 

实现页面解析,解析由自定义parse、filter接口实现,在filter中传递参数代码如下:

 

parse.getData().getContentMeta().set(key, content.getMetadata().get(key));

 

 job作业格式化

 

public void reduce(Text key, Iterator<Writable> values,
                     OutputCollector<Text, Writable> output, Reporter reporter)
    throws IOException {
    output.collect(key, (Writable)values.next()); // collect first value
  }

  汇总的结果。

 

job.setOutputFormat(ParseOutputFormat.class);

  指定了格式化对象,并传递参数,代码如下:

 

return new RecordWriter<Text, Parse>() {


        public void write(Text key, Parse parse)
          throws IOException {
          
          ......
          for (int i = 0; i < links.length && validCount < outlinksToStore; i++) {
            ......
			//追加自定义属性:向子链接datum对象添加父链接的属性。

            if(parseData.getContentMeta().get(KEY) != null){
                target.getMetaData().put(KEY, new Text(parseData.getContentMeta().get(KEY)));
            }
.....
            targets.add(new SimpleEntry(targetUrl, target));
			......
            validCount++;
          }
.....
        
      };
 

以上代码展示了参数传递的各个部分,仅供参考!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值