文档章节

运行nutch报错:unzipBestEffort returned null

杨尚川
 杨尚川
发布于 2014/03/12 18:47
字数 439
阅读 284
收藏 0

报错信息:fetch of http://szs.mof.gov.cn/zhengwuxinxi/zhengcefabu/201402/t20140224_1046354.html failed with: java.io.IOException: unzipBestEffort returned null

 

完整的报错信息为:

 

2014-03-12 16:48:38,031 ERROR http.Http - Failed to get protocol output
java.io.IOException: unzipBestEffort returned null
at org.apache.nutch.protocol.http.api.HttpBase.processGzipEncoded(HttpBase.java:317)
at org.apache.nutch.protocol.http.HttpResponse.<init>(HttpResponse.java:164)
at org.apache.nutch.protocol.http.Http.getResponse(Http.java:64)
at org.apache.nutch.protocol.http.api.HttpBase.getProtocolOutput(HttpBase.java:140)
at org.apache.nutch.fetcher.Fetcher$FetcherThread.run(Fetcher.java:703)
2014-03-12 16:48:38,031 INFO  fetcher.Fetcher - fetch of http://szs.mof.gov.cn/zhengwuxinxi/zhengcefabu/201402/t20140224_1046354.html failed with: java.io.IOException: unzipBestEffort returned null
2014-03-12 16:48:38,031 INFO  fetcher.Fetcher - -finishing thread FetcherThread, activeThreads=0

 

由此可知抛出异常的代码位于src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java(lib-http插件)类的processGzipEncoded方法的317行:

 

byte[] content;
if (getMaxContent() >= 0) {
  content = GZIPUtils.unzipBestEffort(compressed, getMaxContent());
} else {
  content = GZIPUtils.unzipBestEffort(compressed);
}

if (content == null)
  throw new IOException("unzipBestEffort returned null");

 

nutch1.7\src\plugin\protocol-http\src\java\org\apache\nutch\protocol\http\HttpResponse.java(protocol-http插件)的164行调用了processGzipEncoded方法: 

 

readPlainContent(in);

String contentEncoding = getHeader(Response.CONTENT_ENCODING);
if ("gzip".equals(contentEncoding) || "x-gzip".equals(contentEncoding)) {
	content = http.processGzipEncoded(content, url);
} else if ("deflate".equals(contentEncoding)) {
	content = http.processDeflateEncoded(content, url);
} else {
	if (Http.LOG.isTraceEnabled()) {
		Http.LOG.trace("fetched " + content.length + " bytes from " + url);
	}
}

 

 

通过Firefox的Firebug工具可查看该URL的响应头为Content-Encoding:gzip,Transfer-Encoding:chunked

 

解决方法如下:

 

1、修改文件nutch1.7\src\java\org\apache\nutch\metadata\HttpHeaders.java,增加一个field:

 

public final static String TRANSFER_ENCODING = "Transfer-Encoding";

 
2、修改文件nutch1.7\src\plugin\protocol-http\src\java\org\apache\nutch\protocol\http\HttpResponse.java,替换第160行代码readPlainContent(in);为如下代码

 

String transferEncoding = getHeader(Response.TRANSFER_ENCODING); 
if(transferEncoding != null && "chunked".equalsIgnoreCase(transferEncoding.trim())){    	  
  readChunkedContent(in, line);  
}else{
  readPlainContent(in);  
}

 

3、http内容长度限制不能使用负值,只能使用一个大整数:

 

<property>
	<name>http.content.limit</name>
	<value>655360000</value>
</property>

 
4、因为修改了核心代码插件代码,所以需要重新编译打包发布,执行nutch1.7\build.xml的默认target:runtime  

 

cd nutch1.7
ant

 

提交BUG:

1、https://issues.apache.org/jira/browse/NUTCH-1736

2、https://github.com/apache/nutch/pull/3

 

 

 

 

 


© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
安装nutch2+Hbase+Slor4

介绍 Nutch 网络爬虫 Hbase 分布式存储系统 Solr搜索服务器 版本说明 由于NutchHbaseSolr他们都各自做在自己的版本修改,所以配置他们三者有不同的方法.这里也是参考网络文档做了他们最新版本...

tngou
2013/08/15
6.5K
2
关于intel模拟器和ARM模拟器的问题

intel Atom 的虚拟机在运行加入第三方框架的应用时为什么一直报错啊 用ARM的就不报错 ?有大神帮忙解决下没? Caused by: java.lang.UnsatisfiedLinkError: Couldn't load jpush from loader...

打酱油的coding
2013/12/28
695
4
Nutch1.7和eclipse集成

Nutch1.7和eclipse集成 1、将nutch项目部署到eclipse 首先到nutch官网上找到FAQ链接http://wiki.apache.org/nutch/FAQ,进入链接 点击第二个链接查看。 参照文档进行配置,有卡壳不明白的地方...

hiqj
2014/04/18
34
0
Apache Nutch 1.2 Released

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。 Apache Nutch 1.2 包含了不少的改进和bug修复,详情请看 CHANGES 文件。 你...

红薯
2010/09/25
2.5K
4

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 HTML5教程 介绍HTML5给你认识 习题

1.关于HTML5说法正确的是:(C) A.HTML5只是对HTML4的一个简单升级 B.所有主流浏览器都支持HTML5 C.HTML5新增了离线缓存机制 D.HTML5主要是针对移动端进行了优化 2.为了标识一个HTML文...

老码农的一亩三分地
5分钟前
1
0
关于1加手机rom的分析过程

1、关于清理app缓存的信息 framework.jar和services.jar文件,都位于/system/framework目录下面 framework.jar的android.os.Intent类里面定义了action "android.intent.action.CLEAR_PKG",这......

shatian
6分钟前
1
0
[docker]使用root进入docker

docker exec -it --user root ed0 /bin/bash https://blog.csdn.net/kaifeng86/article/details/73237056...

Danni3
19分钟前
2
0
通过重编译icu替换icuxxxx.dll减少QT5发布体积

最近需要使用QT写一个程序,选择了比较新的QT5.3以获得更多特性进行快速开发。但是QTCreator编译出来的程序是动态链接版本,接着就头痛了,自己程序很小,但是所需要携带的动态链接库却很大,...

shzwork
21分钟前
3
0
关于二叉树的前序、中序、后序三种遍历

二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。 比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根...

城市之雾
26分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部