目前nutch有1.x和2.x两个版本,这两个版本并行更行。由于有人说2.x不成熟,问题较多,因此本人选用1.12.但是1.12不能抓取ajax渲染的页面,google上查到,1.8有个版本,有个大牛开发了抓取ajax功能的插件(https://github.com/xautlx/nutch-htmlunit),拿来用了下,安装后,发现有的页面有乱码,按这个方法解决了下,还是不行(http://blog.csdn.net/renyp8799/article/details/38331495)我看1.12上是正常的,因此决定把1.8的插件,移植到1.12上。
<ant dir="lib-htmlunit" target="deploy" /> | |
<ant dir="protocol-htmlunit" target="deploy" /> | |
<ant dir="parse-s2jh" target="deploy" /> | |
<ant dir="index-s2jh" target="deploy" /> |
判断是抓取页面解析内容的时候出现的乱码,可是之前1.12抓同样的页面没有乱码,断定,肯定是那四个插件的某一个在解析的时候导致的。于是定位到src\plugin\protocol-htmlunit\src\java\org\apache\nutch\protocol\htmlunit\HttpResponse.java.发现有这么一段代码
String charsetName = page.getPageEncoding();
//去掉xml头部字符串
pageAsXml = StringUtils.substringAfter(pageAsXml, "?>").trim();
//System.out.println("URL: " + urlStr + ", CharsetName: " + charsetName + " , Page HTML=\n" + pageAsXml);
if (Http.LOG.isTraceEnabled()) {
Http.LOG.trace("URL: " + urlStr + ", CharsetName: " + charsetName + " , Page HTML=\n" + pageAsXml);
}
content = pageAsXml.getBytes(charsetName);
感觉是 String charsetName = page.getPageEncoding();导致的,于是打了日志。运行后发现,charsetName 并不是页面上的编码utf-8,而是iso8859-1,而 page.getPageEncoding();方法是com.gargoylesoftware.htmlunit包里的,查到源码,发现,page.getPageEncoding();有个默认值是iso8859-1,如果没取到页面的编码,则会默认这个值。至此问题清晰了。后面就是怎么取页面编码问题。我这边暂时写死成utf-8.
这是最近一周使用nutch的小总结,给自己留个记录,方便查阅,希望也能对其他遇到相同问题的人有帮助。