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++;
}
.....
};
以上代码展示了参数传递的各个部分,仅供参考!