最近一个月一直在对nutch1.6版进行中等层次的二次开发,本来是想重新做一个自写的爬虫系统,鉴于前基做过微博爬虫系统,感觉再重写一个完整的爬虫费时、费力还没太大的含金量,故而直接基于nutch开发。
之所以说中是因为没有改动nutch的核心部分map/reduce,但改动了除此之外的绝大部分问题,最终形成了任务提交多样化、调度合理、数据流优化、乱码处理、源码与正文保存等较为合理的网络爬虫系统。经过处理之后,本爬虫可以采集中文、繁体、英文、藏文、俄文、日文、西里尔文等多种文字。现就网络爬虫中经常遇到的乱码问题,给予简要总结。
如果直接用nutch提供的web页面(nutch1.2版及之前是有自带的web展示系统,但之后的版本就没有了)就会很容易发现,总是会出现或多或少的页面。当深入源码后你会发现,nutch源码中对源网页中的编码的识别是很浅的,统一用utf-8来处理,没有做相关的编码的精准识别,只是留了相应的接口,供二次开发人员自行添加如cpdetector之类的基于统计的编码识别方式。
本系统的二次开发,主要采用截取nutch数据流的开始和结尾两部分数据来做,即提交数据、网页源码的数据两部分来做。网页通过阅读源码的网络IO代码会发现,http网页源码的流的读出是通过socket连接,得到其inputstream输入流之后,以字节流的方来来读的。
这里有个重点:如果源网页是GBK字节流,在程序端接收时的inputstream得到的字节数组的编码方式肯定是GBK字节流,即源网页是什么编码方式的字节流,程序端接收到的字节流的编码方式肯定是相同的。因此,只要在程序端解析出该流实际的编码方式即可将该流获得的源网页的字节数组转化