爬虫系统:通过Nutch扩展点开发插件(添加自定义索引字段到solr)

准备工作

1. **爬虫环境** —— *nutch2.3.1 + solr4.10.3 + hbase0.98*
2. **开发环境** —— *Eclipse Mars.2 Release(4.5.2)*
3. **所需jar包** —— *apache-nutch-2.3.jar、hadoop-common-2.6.0.jar、slf4j-api-1.7.9.jar*

什么是Nutch扩展点

>       好的爬虫系统应该同时具备**高扩展性**(scalability)和**高伸缩性**(extensibility)的特点。Nutch爬虫系统不仅是采用动态加载插件形式设计(可扩展性),而且允许利用hadoop集群进行分布式爬取(可伸缩性)。用户可以根据自己的需求开发特定的爬虫系统,同时不需要过多担心业务量剧增会影响爬虫性能。
>       Nutch提供了扩展接口【 *Parser、ParseFilter等*】,用户通过实现这些接口进行插件开发。

本文插件的意义

>       利用nutch原始插件爬取web数据,然后把数据放入solr建索引,此时solr中的索引字段只有默认配置的几个,如果我们需要加入额外的字段,则需要利用Nutch的扩展接口进行索引插件开发。

如何利用Nutch扩展点开发插件

1、 确定实现哪个扩展点?
      本文需要在solr中新增索引字段,所以需要利用索引阶段的扩展点【IndexWriter、IndexingFilter】,Nutch已经实现了indexer-solr插件用于创建solr索引,我们可以重新实现indexer-solr插件替换掉原来的;或者利用索引过滤往索引对象【NutchDocument】中加入需要进行索引的字段。本文使用IndexingFilter。
2、 如何开发插件?
      2.1 eclipse新建java项目;
      2.2 实现IndexingFilter接口;

	public class ExtraIndexer implements IndexingFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(ExtraIndexer.class);
private Configuration conf;
private String CRAWLID_VALUE; /**
* NutchDocument为索引数据对象
* WebPage为爬虫持久层数据表
*/
public NutchDocument filter(NutchDocument doc, String url, WebPage page) throws IndexingException { // just in case
if (doc == null)
return doc;
addCrawlId(doc, url, page);
addFetchTime(doc, url, page);
return doc;
} private NutchDocument addFetchTime(NutchDocument doc, String url, WebPage page) {
String fetchTime = page.getFetchTime().toString();
LOGGER.info(">>>>>>>>>>add fetchtime: " + fetchTime);
doc.add("fetchTime", fetchTime);
return doc;
} private NutchDocument addCrawlId(NutchDocument doc, String url, WebPage page) {
doc.add("crawlId", this.CRAWLID_VALUE);
LOGGER.info(">>>>>>>>>>add crawlId: " + this.CRAWLID_VALUE);
return doc;
} public void setConf(Configuration conf) {
this.conf = conf;
this.CRAWLID_VALUE = conf.get(Nutch.CRAWL_ID_KEY);
LOGGER.info(">>>>>>>>>>crawlID for indexing set to: " + this.CRAWLID_VALUE);
} public Configuration getConf() {
return this.conf;
} @Override
public Collection<Field> getFields() {
return null;
}
}

      2.3 编写配置文件;

plugin.xml:插件信息提供给Nutch识别.

<plugin
id="index-extra"
name="Extra Indexing Filter"
version="1.0.0"
provider-name="nutch.org"> <runtime>
<library name="index-extra.jar">
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="nutch-extensionpoints"/>
</requires>
<extension id="org.apache.nutch.indexer.extra"
name="Nutch Extra Indexing Filter"
point="org.apache.nutch.indexer.IndexingFilter">
<implementation id="ExtraIndexer"
class="org.apache.nutch.indexer.extra.ExtraIndexer"/>
</extension> </plugin>

build.xml:给ant提供编译信息

<project name="index-extra" default="jar-core">
<import file="../build-plugin.xml"/>
</project>

ivy.xml:描述插件的相关依赖,给ivy提供信息方便管理这些依赖

<ivy-module version="1.0">
<info organisation="org.apache.nutch" module="${ant.project.name}">
<license name="Apache 2.0"/>
<ivyauthor name="Apache Nutch Team" url="http://nutch.apache.org"/>
<description>
Apache Nutch
</description>
</info> <configurations>
<include file="../../../ivy/ivy-configurations.xml"/>
</configurations> <publications>
<!--get the artifact from our module name-->
<artifact conf="master"/>
</publications> <dependencies>
</dependencies> </ivy-module>

      2.4 在nutch安装目录下编译插件;

a、把index-extra源码加入到{NUTCH-HOME}/src/plugin

b、修改{NUTCH-HOME}/src/plugin/build.xml文件

c、修改{NUTCH-HOME}/build.xml文件

d、编辑{NUTCH-HOME}/conf中的相关配置文件

e、在{NUTCH-HOME}目录下运行:ant runtime

3、 如何利用开发好的插件?

      3.1 修改nutch-site配置文件;

<property>
<name>plugin.includes</name>
<value>protocol-httpclient|urlfilter-regex|index-(extra|basic|anchor|more|metadata)|indexer-solr|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|parse-(html|tika|text|metatags)</value>
</property>

      3.2 修改schema.xml配置文件;

<field name="crawlId" type="string" stored="true" indexed="false"/>
<field name="fetchTime" type="string" stored="true" indexed="false"/>

      3.3 修改solrindex-mapping.xml【nutch和solr索引映射】配置文件;

<field dest="fetchTime" source="fetchTime"/>
<field dest="crawlId" source="crawlId"/>

      3.4 修改solr配置文件;

{NUTCH-HOME}/runtime/local/conf下的schema.xml复制到solr实例的conf目录下{SOLR-HOME}/collection1/conf/,并重启solr服务器

4、运行爬虫命令验证结果?

一站式命令:nohup bin/crawl urls/ craw-name http://××××:8080/solr/ 3

创建索引命令:nohup bin/nutch solrindex http://××××:8080/solr/ -all -crawlId craw-name &

小结

本文抛砖引玉,主要实现了在nutch索引阶段,通过扩展插件的手段,添加自定义的索引字段到NutchDocument索引数据对象中,从而在随后solr的CRUD阶段【indexer-solr】把添加的字段提交到solr。
**注:**博主水平有限,望批评指正!以求共勉!

通过Nutch扩展点开发插件(添加自定义索引字段到solr)的更多相关文章

  1. 七、K3 WISE 开发插件《Update字段级更新触发器 - BOS单审核后反写源单》

    审核成功触发,是一个比较典型的场景.需要用到update触发器,跟踪到审核状态的变化. 引用的源码<采购检验单审核后反写收料通知单>,其中采购检验单是BOS自定义单据. if (objec ...

  2. 在半小时内从无到有开发并调试一款Chrome扩展(Chrome插件/谷歌浏览器插件)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_120 就在不久之前,我们目前这个毕业班的班长那日同学和我说,他正在公司开发Chrome扩展,看起来很高大上的技术,实际开发却非常简 ...

  3. jQuery为开发插件提拱了两个方法:jQuery.fn.extend(); jQuery.extend();

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...

  4. eclipse基础及开发插件

    Eclipse:http://www.eclipse.org/downloads/ Compare Package:http://www.eclipse.org/downloads/packages/ ...

  5. 关于Eclipse开发插件(三)

    视图之间实现事件监听 两个视图中的组件之间的互动,在开发插件的时候是经常碰到的问题.点击视图1列表的某项时,视图2的文本框显示相应的字符. 第一种主动式: 主动式就是在视图1的代码块中获取对视图2的对 ...

  6. Nutch+Lucene搜索引擎开发实践

    网络拓扑 图 1 网络拓扑图 安装Java JDK 首先查看系统是否已经安装了其它版本号的JDK,假设有,先要把其它版本号的JDK卸载. 用root用户登录系统. # rpm-qa|grep gcj ...

  7. jQuery中开发插件的两种方式

    jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...

  8. 使用asp.net mvc引擎开发插件系统

    一.前言 我心中的插件系统应该是像Nop那样(更牛逼的如Orchard,OSGI.NET),每个插件模块不只是一堆实现了某个业务接口的dll,然后采用反射或IOC技术来调用,而是一个完整的mvc小应用 ...

  9. 三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》

    案例需求:在销售订单上新增一个按钮,在订单明细中新增一个字段,命名[即时库存]. 点击按钮,弹出“Hello World!”,并获取订单明细物料的即时库存,填入字段[即时库存]. 开发工具:Visua ...

随机推荐

  1. Azkaban安装部署

    在root的用户下搭建的 • Azkaban安装部署(可参照:http://azkaban.github.io/azkaban/docs/latest/) 1):前提 安装JDK,安装Hadoop,H ...

  2. Android 开发笔记___Intent的使用

    public class ActRequestActivity extends AppCompatActivity implements OnClickListener { private EditT ...

  3. CentOS恢复root口令方法

    CentOS6和CentOS7恢复root口令的方法有很大不同 CentOS6: 在引导菜单倒计时界面按任意键,进入grub引导菜单 按e键进入内核引导参数编辑界面 选中kernel项,按e键编辑引导 ...

  4. js函数整合队列顺序执行插件

    前言 在日常开发中,也许我们会遇到这样的一个问题.我们利用[发布订阅模式](如果不了解的可以直接访问此链接www.cnblogs.com/xiaoxiaokun- )去执行[发布]事件时,遇到函数内部 ...

  5. ace_tree总结。各类问题解决办法汇集

    首先讲一下怎么使用,然后讲一下出现的问题的解决办法 1.引用js和css文件 ace-extra.min.js.ace.min.css.fuelux.tree.min.js.ace-elements. ...

  6. c# 实体类生成工具

    一个简单生成c#实体类的工具 源代码下载

  7. [转载] ETL和Kettle

    http://tech.ccidnet.com/art/1105/20080407/1411567_1.html http://blog.csdn.net/cissyring/article/deta ...

  8. java之JVM学习--基本机构

    JDK,JRE,JVM关系图 JVM物理结构: jvm内存区详解: 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字 ...

  9. 通过游戏认识 --- JQuery与原生JS的差异

      前言 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库( 或JavaScript框架).jQuery设计的宗旨是“write ...

  10. shell的逻辑运算符

    一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是 ...