nutch1.12增加抓取ajax功能页面插件

目前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上。

涉及到4个插件目录:

index-s2jh 基于apache nutch 1.8添加htmlunit ajax支持初始化
lib-htmlunit 增加htmlunit对https的支持
parse-s2jh Signed-off-by: lixia <xautlx@hotmail.com>
protocol-htmlunit 增加htmlunit对https的支持
把这四个目录对应的copy到1.12相应目录下。并对比1.8和1.12的ivy.xml文件中所加载的包,1.8下有几个包,1.12里没有,比如  <dependency org="net.sourceforge.htmlunit" name="htmlunit"  rev="2.16" conf="*->default" />,手动加好。并修改1.12下plugin目录中的build.xml文件增加这四项。
<ant dir="lib-htmlunit" target="deploy" />
  <ant dir="protocol-htmlunit" target="deploy" />
  <ant dir="parse-s2jh" target="deploy" />
  <ant dir="index-s2jh" target="deploy" />
然后ant编译。ok后抓取,ajax内容的页面没问题,但是又发现了乱码。

判断是抓取页面解析内容的时候出现的乱码,可是之前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的小总结,给自己留个记录,方便查阅,希望也能对其他遇到相同问题的人有帮助。

阅读更多
个人分类: 研发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

nutch1.12增加抓取ajax功能页面插件

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭