爬虫系统:通过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. js日期倒计时效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. C#读写Shapefile

    Shapefile文件是ArcGIS存储矢量要素的标准格式,要读写Shapefile最简单的方法当然是基于ArcObject(或者ArcEngine)开发,不过网上也有一些开源的解译Shapefile ...

  3. SQL Server 数据类型转换函数

    T-SQL提供了两个显示转换的函数:CAST函数和CONVERT函数. 1. CAST函数 语法: CAST ( expression AS data_type [ ( length ) ] ) 示例 ...

  4. css3 滚动条出现 页面不跳动

    .wrap-outer { margin-left: calc(100vw - 100%); }   .wrap-outer { padding-left: calc(100vw - 100%); } ...

  5. Python datetime之timedelta

    该函数表示两个时间的间隔 参数可选.默认值都为0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minut ...

  6. Akka(36): Http:Client-side-Api,Client-Connections

    Akka-http的客户端Api应该是以HttpRequest操作为主轴的网上消息交换模式编程工具.我们知道:Akka-http是搭建在Akka-stream之上的.所以,Akka-http在客户端构 ...

  7. 【APP问题定位(二)】Charles定位工具

    Charles工具是APP测试中简单有使用的一款测试工具,可以通过捕获request和response的信息初步确定bug的原因所在. 本文将从安装.使用两个方面来介绍. 安装 点击这里进入下载页,注 ...

  8. 应用在安卓和ios端APP的证件识别

    移动端证件识别智能图文处理,是利用OCR识别技术,通过手机拍摄身份证图像或者从手机相册中加载证件图像,过滤身份证的背景底纹干扰,自动分析证件各文字进行字符切分.识别,最后将识别结果按姓名.地址.民族. ...

  9. python定时利用QQ邮件发送天气预报

    大致介绍 好久没有写博客了,正好今天有时间把前几天写的利用python定时发送QQ邮件记录一下 1.首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.c ...

  10. [转载] 基于Redis实现分布式消息队列

    转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...