当前位置: 首页 > 编程日记 > 正文

Nutch 二次开发之parse正文内容


关于nutch的基础知识能够參考lemo的专栏

nutch支持二次开发,为了满足搜索的准确率的问题,考虑只将网页正文的内容提取出来作为索引的内容,相应的是parse_text的数据。我使用的事nutch1.4 版本号,在cygwin下运行crawl命令进行爬取。

bin/nutch crawl urls -dir crawl -depth 3 -topN 30

爬取的流程例如以下:inject :将urls下的url文档中的url注入到数据库,generate:从数据库中取得url获取须要爬取的url队列,fetch:从url爬取队列中爬取page,parse:解析page的内容。从这里看到我须要改写的是parse对网页解析部分,parse对网页进行解析后将解析的text放入crawl/segments下相应的parse_text目录下,我们能够通过命令

bin/nutch readseg -dump crawl/segments/20120710142020 segdata

查看详细爬取的内容。

从系统的扩展点,通过实现系统中的parser扩展点,就可以实现自己的parse应用,而系统中对html页面解析是通过默认的parse-html插件实现的,这里我们为了方便(但升级nutch版本号之后就不方便了),直接在parse-html插件处进行改动。

首先我们先找到parse-html实现parser借口的getparse方法,这种方法是详细解析网页内容的。

public ParseResult getParse(Content content) {HTMLMetaTags metaTags = new HTMLMetaTags();URL base;try {base = new URL(content.getBaseUrl());} catch (MalformedURLException e) {return new ParseStatus(e).getEmptyParseResult(content.getUrl(), getConf());}String text = "";String title = "";Outlink[] outlinks = new Outlink[0];Metadata metadata = new Metadata();// parse the contentDocumentFragment root;try {byte[] contentInOctets = content.getContent();InputSource input = new InputSource(new ByteArrayInputStream(contentInOctets));EncodingDetector detector = new EncodingDetector(conf);detector.autoDetectClues(content, true);detector.addClue(sniffCharacterEncoding(contentInOctets), "sniffed");String encoding = detector.guessEncoding(content, defaultCharEncoding);metadata.set(Metadata.ORIGINAL_CHAR_ENCODING, encoding);metadata.set(Metadata.CHAR_ENCODING_FOR_CONVERSION, encoding);input.setEncoding(encoding);if (LOG.isTraceEnabled()) { LOG.trace("Parsing..."); }root = parse(input);} catch (IOException e) {return new ParseStatus(e).getEmptyParseResult(content.getUrl(), getConf());} catch (DOMException e) {return new ParseStatus(e).getEmptyParseResult(content.getUrl(), getConf());} catch (SAXException e) {return new ParseStatus(e).getEmptyParseResult(content.getUrl(), getConf());} catch (Exception e) {e.printStackTrace(LogUtil.getWarnStream(LOG));return new ParseStatus(e).getEmptyParseResult(content.getUrl(), getConf());}// get meta directivesHTMLMetaProcessor.getMetaTags(metaTags, root, base);if (LOG.isTraceEnabled()) {LOG.trace("Meta tags for " + base + ": " + metaTags.toString());}// check meta directivesif (!metaTags.getNoIndex()) {               // okay to indexStringBuffer sb = new StringBuffer();if (LOG.isTraceEnabled()) { LOG.trace("Getting text..."); }try {utils.getText(sb, root);// 这里是详细解析text的位置
    	  text = sb.toString();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();}sb.setLength(0);if (LOG.isTraceEnabled()) { LOG.trace("Getting title..."); }utils.getTitle(sb, root);         // extract titletitle = sb.toString().trim();}if (!metaTags.getNoFollow()) {              // okay to follow linksArrayList<Outlink> l = new ArrayList<Outlink>();   // extract outlinksURL baseTag = utils.getBase(root);if (LOG.isTraceEnabled()) { LOG.trace("Getting links..."); }utils.getOutlinks(baseTag!=null?baseTag:base, l, root);outlinks = l.toArray(new Outlink[l.size()]);if (LOG.isTraceEnabled()) {LOG.trace("found "+outlinks.length+" outlinks in "+content.getUrl());}}ParseStatus status = new ParseStatus(ParseStatus.SUCCESS);if (metaTags.getRefresh()) {status.setMinorCode(ParseStatus.SUCCESS_REDIRECT);status.setArgs(new String[] {metaTags.getRefreshHref().toString(),Integer.toString(metaTags.getRefreshTime())});      }ParseData parseData = new ParseData(status, title, outlinks,content.getMetadata(), metadata);ParseResult parseResult = ParseResult.createParseResult(content.getUrl(), new ParseImpl(text, parseData));// run filters on parseParseResult filteredParse = this.htmlParseFilters.filter(content, parseResult, metaTags, root);if (metaTags.getNoCache()) {             // not okay to cachefor (Map.Entry<org.apache.hadoop.io.Text, Parse> entry : filteredParse) entry.getValue().getData().getParseMeta().set(Nutch.CACHING_FORBIDDEN_KEY, cachingPolicy);}return filteredParse;}

我们从代码中能够看到详细解析text的位置,我们须要改动的就是这个位置的代码了,能够通过查看源码,nutch是 通过Dom tree的方式进行解析text内容的,而我在这里为了拿到page的正文部分的内容,我选用了开源的工具boilerpipe进行正文的提取。插入如上函数的代码段为:

text = BoilerpipeUtils.getMainbodyTextByBoilerpipe(new InputSource(new ByteArrayInputStream(content.getContent())));if(text.equals("")){utils.getText(sb, root);text = sb.toString();if (LOG.isTraceEnabled()) { LOG.trace("Extract text using DOMContentUtils..."); }}else if (LOG.isTraceEnabled()) { LOG.trace("Extract text using Boilerpipe..."); }FileWriter fw = new FileWriter("E://mainbodypage//URLText.txt",true);fw.write("url::" + content.getUrl() + "\n");fw.write("text::" + text + "\n");fw.close();


我将相应的page的url和text内容写入到特定的path下,这样能够方便測试,如上代码段调用的静态方法类例如以下:

package org.apache.nutch.parse.html;import org.xml.sax.InputSource;
import org.xml.sax.SAXException;import de.l3s.boilerpipe.BoilerpipeExtractor;
import de.l3s.boilerpipe.BoilerpipeProcessingException;
import de.l3s.boilerpipe.document.TextDocument;
import de.l3s.boilerpipe.extractors.CommonExtractors;
import de.l3s.boilerpipe.sax.BoilerpipeSAXInput;public class BoilerpipeUtils {public static String getMainbodyTextByBoilerpipe(InputSource is) throws BoilerpipeProcessingException, SAXException{final TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();final BoilerpipeExtractor extractor = CommonExtractors.ARTICLE_EXTRACTOR;extractor.process(doc);  if(doc.getContent() != null && !doc.getContent().equals(""))return doc.getContent();elsereturn "";}
}

因为用到了开源的工具boilerpipe,因此须要将相关的jar包放入到插件文件夹下的lib文件夹中,同一时候相应的plugin.xml配置中runtime段例如以下:

<runtime><library name="parse-html.jar"><export name="*"/></library><library name="tagsoup-1.2.1.jar"/><library name="boilerpipe-1.2.0.jar"></library><library name="nekohtml-1.9.13.jar"></library><library name="xerces-2.9.1.jar"></library></runtime>


至此就完毕了插件的功能,在eclipse下执行build project后执行如上的crawl命令,就可以得到自己想要的正文部分的parse_text数据了,假设在cwgwin下执行crawl命令,还会报NoClassDefFound的runtimeException,找不到指定的jar包,将如上的三个jar包放入到runtime/local/lib文件夹下就可以。

然而boilerpipe的正文提取效果还存在提升的空间,不尽理想;另外也能够用针对特定站点的定制功能去提取text信息。



相关文章:

翼方健数曹华:构建数据和计算互联网的必由之路

智能时代&#xff0c;数据无疑是最活跃的生产要素&#xff0c;它将决定未来的生产力和生产关系。其中&#xff0c;共享和保护数据&#xff0c;促进数据流通&#xff0c;并最大化数据价值是业内技术发展所关注的焦点。 诞生在这一背景下的隐私计算技术正在蓬勃发展&#xff0c;…

vi常用命令以及 冒号输入

按i进入输入模式 输入: 按ESC结束输入 按:w保存退出 pageup上翻页 pagedown下翻页 :w保存 :q!不保存 :wq保存离开 i o a编辑模式 ESC一般模式 dd 删除光标所在整行 yy 复制光标所在整行

Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...

项目&#xff1a; 1.自动发现nginx调度器及后端apache构建的web服务集群&#xff1b; 2.使用自定义参数监控调度器上nginx服务的相关统计数据及速率数据&#xff1b; 3.使用自定义参数监控后端apache服务的相关统计数据及速率数据&#xff1b;(选做) 4.制定出nginx调度器及后端…

ONNX 浅析:如何加速深度学习算法工程化?

AlphaGo击败围棋世界冠军李世石以来&#xff0c;关于人工智能和深度学习的研究呈现井喷之势。各种新的算法和网络模型层出不穷&#xff0c;令人眼花缭乱。与之相随的&#xff0c;深度学习的训练和推理框架也在不断的推陈出新&#xff0c;比较著名的有&#xff1a;微软的CNTK、G…

如何在OS X中打印到PDF文件

如何在OS X中打印文件到PDF文件&#xff1f;其实不需要安装任何其他软件&#xff0c;OS X本身支持打印到PDF文件这个功能。具体操作详见下面文章&#xff1a;Want to save a document or web page as a PDF file, but you don’t own Adobe Acrobat? No problem, you can prin…

Joomla和Drupal简介

Joomla!是一套在国外相当知名的内容管理系统。Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统&#xff0c;可以在Linux、 Windows、MacOSX等各种不同的平台上执行。目前是由Open Source Matters&#xff08;见扩展阅读&#xff09;这个开放源码组织进行开发与支持&#…

AD RMS高可用(三)部署RMS根群集服务器

1) 在rms服务器上点击“添加角色和功能”&#xff0c;开始rms组件的添加 2) 选择“基于角色或基于功能安装”&#xff0c;点击”下一步“。 3) 选择第一台rms服务&#xff0c;点击”下一步“。 4) 勾选”ADRMS”角色&#xff0c;同时会添加iis服务。点击”下一步“。 5) 保持默…

AI 复活「她」! GPT-3 帮美国小哥复刻逝去未婚妻,但又夺走她……

整理 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 今年 7 月&#xff0c;一名33岁的美国小哥 Joshua Barbeau 在未婚妻去世后&#xff0c;根据她在 Facebook 和 twitter 上的文本在另一名开发人员的帮助下成功在 GPT-3 上微调&#xff0c;能够复刻出未…

centOS怎样强制卸载PHP以及自定义安装PHP

这个是原创的&#xff0c;当然也是在前人的基础上&#xff0c;自己留个拷贝&#xff0c;其他人也不用再摸索了。 转载请保留版权信息谢谢&#xff1a;http://blog.csdn.net/21aspnet/ 很无语&#xff0c;centOS居然php版本才5.1.6&#xff0c;很多开源的CMS无法安装。 查看ph…

深入掌握JMS(一):JMS基础

2019独角兽企业重金招聘Python工程师标准>>> 1. JMS基本概念 JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业 应用的开发。它支持两种消息通信模型&#xff1a;点到点&#xff08;point-to-point&#xff09;&a…

浏览器前进后退对下拉框数据的丢失(省市联动实现和例子)

浏览器前进后退对下拉框数据的丢失的问题&#xff0c;典型的为省市下拉框联动时城市数据的丢失。省市联动一般的实现为城市在省份的选择后js加载。 那么每次城市的改变只需要重新加载新的城市数据并更新下拉框即可&#xff1a; 下拉函数 function ReloadCities() { var $ddlCit…

Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版

最后更新时间&#xff1a;2012.3.21 第一步&#xff1a;Apache安装(已更新到2.2.22) 下载 去 http://www.apache.org 自己找新的 http://httpd.apache.org/ 国内有很多镜像点例如"人人"和"163" http://labs.renren.com/ 注意要找httpd&#xff0c;因为a…

首届“陇剑杯”网络安全大赛线上赛圆满结束

9月14日&#xff0c;集结了各行业领域3020支战队、11135名网络安全精英的首届“陇剑杯”网络安全大赛线上赛圆满结束&#xff0c;成功拉开将于9月25日在甘肃兰州新区举行的总决赛战幕。届时&#xff0c;涵盖网络配置、数据分析和漏洞修复等真实数字化业务场景的网络防御赛道和R…

与流氓软件的一次艰苦“奋战”

不知道大家有么有过这样的经历&#xff0c;英语不好&#xff0c;但有些时候找东西&#xff0c;还只有英文网站上有&#xff0c;但英文网站上下载东西&#xff0c;有时候不小心就会下错&#xff0c;稍有不慎&#xff0c;电脑就中标了&#xff1b;这不我昨天就遇到了&#xff0c;…

mysql5.6基于GTID主从复制设置

1.主库和从库都必须要开启binlog2.主库和从库server-id不相同3.建立主从辅助用户grant replication slave on . to rep192.168.200.% identified by oldboy;[mysqld]server-id1log-binmysql.binbinlog_formatrowgtid_modeONenforce_gtid_consistencylog_slave_updatesrelay_log…

Python 解一道江苏 小升初 数学题,如此变态,看不起来谁?

作者&#xff1a;小小明【江湖人称"明佬"】链接&#xff1a;blog.csdn.net/as604049322/article/details/118388505注明&#xff1a;本文经过作者小小明授权发布&#xff0c;可戳原文链接关注原文作者&#xff01;本文简介大家好&#xff0c;我是黄同学????前段时…

利用负载均衡优化和加速HTTP应用

1.负载均衡技术简介 现代企业信息化应用越来越多的采用B/S应用架构来承载企业的关键业务&#xff0c;因此&#xff0c;确保这些任务的可靠运行就变得日益重要。随着越来越多的企业实施数据集中&#xff0c;应用的扩展性、安全性和可靠性也越来越受到企业的重视。 负载均衡技术通…

查看sqlserver被锁的表以及如何解锁

查看sqlserver被锁的表以及如何解锁查看被锁表&#xff1a;www.2cto.com select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECTspid 锁表进程 tableName 被锁表名解锁&#x…

Centos 6.4下MySQL备份及还原详情介绍

我们前面文中中介绍了centos 6.4下MySQL的安装及配置&#xff0c;安装后为了保证数据的安全性所以我们同样也要学会备份及还原&#xff0c;备份及还原操作在我们的真实工作环境中是必不可少的&#xff0c;由于是对数据库数据备份&#xff0c;所以今天我们就随之介绍一下&#x…

iPhone 13 终于等到了!降价、新颜色、电池续航性能大提升

整理 | 禾木木、苏宓 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 它来了&#xff0c;真的来了&#xff01; 不知有多少朋友守在今日凌晨观看一年一度的科技春晚——苹果发布会&#xff01; 还是那个熟悉的样子&#xff0c;从加利福尼亚的沙漠中向我们走来&am…

“httpd未被被识别的服务”的解决办法

使用自动编译安装会出现这个问题&#xff0c;也就是输入 #service httpd restart 给出这样的提示&#xff1b;这时候要重启可以 #/usr/local/apache2/bin/apachectl start 如果你希望使用 #service httpd restart 那么需要按下面的做法 注意的是daemon /usr/local/apache…

安装sql 2005 闪退 连接到服务器失败。错误:0x80070424

可以尝试安装.net4.0 我是通过此办法解决。 本文转自 freeterman 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/myunix/1751338&#xff0c;如需转载请自行联系原作者

简述DataInputStream和DataOuputStream

2019独角兽企业重金招聘Python工程师标准>>> Java开发中经常会用到IO流&#xff0c;那么就会碰到DataInputStream和DataOuputStream这两个包装类。下面就来简述一下这两种包装类的用法&#xff1a; 1.DataOutputStream&#xff1a;标准的数据输出流&#xff0c;将ja…

数字时代企业迎变局,如何让增长变简单?

随着企业数字化转型进入深水区&#xff0c;企业增长模式正迎来跨时代巨变&#xff1a;营销场景复杂且多变&#xff0c;用户触点丰富而分散&#xff0c; MarTech&#xff08;营销技术&#xff09;解决方案愈加碎片化&#xff0c;企业营销增长过程中各环节间的割裂&#xff0c;让…

Linux服务器网络开发模型

为什么Nginx的性能要比Apache高得多? 这主要是因为Nginx使用了最新的epoll&#xff08;Linux 2.6内核&#xff09;和kqueue&#xff08;FreeBSD&#xff09;网络I/O模型&#xff0c;而Apache则使用的是传统的select模型。曾在一篇博客上看到有这么个实例&#xff1a;假设你在大…

《从零开始学Swift》学习笔记(Day 47)——final关键字

在类的定义中使用final关键字声明类、属性、方法和下标。final声明的类不能被继承&#xff0c;final声明的属性、方法和下标不能被重写。 下面看一个示例&#xff1a; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051final cl…

CentOS 5.5 编译安装apache+php+mysql,利用CMS快速建立论坛

这个是转来的&#xff0c;细节没有验证&#xff0c;请网友自己斟酌。。。。。。。。。。CentOS 5.5 编译安装apachephpmysql&#xff0c;利用CMS快速建立论坛1、安装Apache [rootbogon tmp]# wget http://labs.renren.com/apache-mirror/httpd/httpd-2.2.15.tar.bz2 [rootbogo…

SDT(software-defined Things)?软件定义的物件

物联网&#xff08;IOT&#xff09;的概念早在1999年就被宝洁公司的员工Kevin Ashton正式提出&#xff0c;可直到这最近几年才越来越火&#xff0c;无论国内外&#xff0c;但凡跟IOT 搭上点边的都能吸引众多的目光。2014年&#xff0c;投到智能硬件方向的风险资金就占到VC的一半…

赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;文章内图源&#xff1a;Tidio近日&#xff0c;波士顿动力发布了一段机器人跳舞的视频&#xff0c;有些人不敢相信他们所看到的&#xff0c;它看起来更像是皮克斯动画而不是真实的镜头。有人说&#xff1a…

Airlaunch 快捷设置代码分享

Airlaunch 快捷设置代码分享设置&#xff1a;prefs:rootSETTING蜂窝网络&#xff1a;prefs:rootMOBILE_DATA_SETTINGS_IDWIFI&#xff1a;prefs:rootWIFI定位服务&#xff1a;prefs:rootLOCATION_SERVICES蓝牙&#xff1a;prefs:rootBluetooth辅助功能&#xff1a;prefs:rootGe…