用nutch2.0+cassandra1.0爬取和存储网页时发现gbk编码的网页解析提取文本时中文全都变成乱码,非常奇怪,之前nutch1.x从来就不会出现中文乱码的问题的,因为nutch1.x和nutch2.x用的爬虫代码差不多是一样的,所以我猜可能是保存到cassandra时有问题。看了下它保存网页到cassandra的源码,所有需要保存的值它都转换成二进制封装成ByteBuffer对象传到gora中持久化。看下gora-cassandra的源码中操作cassandra的部分
CassandraClient.java中,addColumn添加数据,值为ByteBuffer的则转换成字符串
public void addColumn(String key, String fieldName, Object value) {
if (value == null) {
return;
}
if (value instanceof ByteBuffer) {
value = toString((ByteBuffer) value);
}
String columnFamily = this.cassandraMapping.getFamily(fieldName);
String columnName = this.cassandraMapping.getColumn(fieldName);
this.mutator.insert(key, columnFamily, HFactory.createStringColumn(columnName, value.toString()));
}
ByteUtils.java中把byte转换成字符串的代码
public static String toString(final byte [] b, int off, int len) {
if(b == null) {
return null;
}
if(len == 0) {
return "";
}
String result = null;
try {
result = new String(b, off, len, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
坑爹了,直接就转换成UTF-8保存的,也就是说爬下gbk编码的网页,它把gbk编码转成了UTF-8的字符串,保存到cassandra中,本来这样转换成utf-8也没问题的,不过后来到nutch执行解析的时候,由于nutch的提取页面编码算法比较偏向于请求头的编码(如果请求头没有就提取文件进行计算猜测),而此时的charset=gbk,也就gbk编码。原来utf-8存储到cassandra的数据去出来时转换成了gbk编码,不乱码才怪,知道了原因,要解决就好办了。
我在想为什么它不直接就用二进制的格式存储,这样感觉效率要高点,然后就又看到了CassandraClient.java中的toString方法,还有个TODO注释在那,说不要把二进制的字段从字节转换成字符串存储,原来是还没有完善的。
/**
* TODO do no convert bytes to string to store a binary field
* @param value
* @return
*/
private static String toString(ByteBuffer value) {
ByteBuffer byteBuffer = (ByteBuffer) value;
return ByteUtils.toString(byteBuffer.array(), 0, byteBuffer.limit());
}
于是就到git上看了下gora0.3版的代码,果然改了,不直接转换成字符串存储了,原来还想自己解决,看来又省了,最简单的解决方法就是把nutch2.0的gora依赖库从0.2,改成0.3
分享到:
相关推荐
Lucene2.0+Nutch0.8 API帮助文档,以前每次查看他们的API都得通过他们的网站去获取,实在麻烦。功夫不负有心人,通过自己的努力终于获得他们CHM格式的API,现在拿来跟大家分享一下
Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0 Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0 Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0
nutch2.3+hbase0.94.14+hadoop1.2.1安装文档.txt )
Nutch+solr + hadoop相关框架搭建教程
nutch部分网页乱码BUG修正,有代码和详细修改说明
nutch爬虫,java也能做爬虫,不一定非得用python呦
Linux 下 Nutch 单机配置
基于Nutch+ElasticSearch+MySQL+SSM的简易搜索引擎
nutch乱码BUG修正,详细解释了nutch乱码的原因就修复方法,有代码和详细说明
Lucene+Nutch本书源码+详细说明,研究搜索引擎具体抓取与解析等技术问题,有利于搜索引擎开发新手的熟悉与了解,难得的电子版,值得珍藏
nutch+lucene开发自己的搜索引擎 第三章开源搜索引擎入门
nutch应用,nutch中文分词,nutch中文乱码
NULL 博文链接:https://wujay.iteye.com/blog/1526902
Google的秘密PageRank彻底解说中文版.doc JAVA_Lucene_in_Action教程完整版.doc Java开源搜索引擎.doc Linux下Nutch分布式配置和使用.pdf Lucene+Nutch源码.rar Lucene学习笔记.doc nutch_tutorial.pdf nutch二次...
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!...
有任何使用问题欢迎随时与博主沟通,第一时间进行解答!该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 基于STM32、ESP8266、PHP、QT、应用软件开发、系统...
完整的《Lucene+nutch搜索引擎开发》PDF版一共83.6M,无奈我上传的最高限是80M,所以切成两个。这一个是主文件,还需要下载一个副文件Lucene+nutch搜索引擎开发.z01。解压时直接放到一起,解压这个主文件就行了。
nutch无法下载中文文件的问题 nutch无法下载中文文件的问题
nutch解决搜索结果高亮和网页快照链接无效及网页变形
nutch安装指南,nutch教程,nutch网络爬取