爬虫系统:通过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. HDU 4267 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. 使用Identity Server 4建立Authorization Server (2)

    第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 ...

  3. mysql别名的使用

    在项目中遇到别名的问题,抽时间整理了一下 在sql中,合理的使用别名可以让sql更容易写并且提高可读性.别名使用 as 来表示,可以分为表别名和列别名. 别名应该是先定义后使用才对,所以首先要了解sq ...

  4. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  5. Python中time和datetime模块的简单用法

    python中与时间相关的一个模块是time模块,datetime模块可以看为是time模块的高级封装. time模块中经常用到的有一下几个方法: time()用来获取时间戳,表示的结果为从1970年 ...

  6. 自定义Base16加密

                                                                                              自定义Base16加 ...

  7. java删除数组中的第n个数

    package test; import java.util.Scanner; public class Deletearr { public static void deletearr(){ Sca ...

  8. Markdown规则

    第一次写随想,写的不好还请包涵呀!!! 这两天在用markdown写一些文档,感觉还不错,整理一下其规则,对于新手会有帮助. 1. 文章的标题,一般写在首行,第二行添加"---------- ...

  9. 【开源】canvas图像裁剪、压缩、旋转

    前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求. 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子. 关于图像裁剪.压缩 在HTML5时代,canvas的功能已经非常强大了,可 ...

  10. VS2015如何连接mySQL数据库

    mySQL数据库           如题,今天给大家简单演示一下VS2015如何连接mySQL数据库.       首先呢,大家需要安装vs2015和mySQL这两个软件,我还安装了一个辅助软件SQ ...