爬虫乱码处理方法.doc

爬虫乱码处理方法.doc

ID:59147165

大小:18.00 KB

页数:3页

时间:2020-09-11

爬虫乱码处理方法.doc_第1页
爬虫乱码处理方法.doc_第2页
爬虫乱码处理方法.doc_第3页
资源描述:

《爬虫乱码处理方法.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1、乱码的解决方法根据原因来找解决方法,就非常简单了。(1)确定源网页的编码A编码A往往在网页中的三个位置,httpheader的content、网页的metacharset中、网页头中Document定义中。在获取源网页编码时,依次判断下这三部分数据即可,从前往后,优先级亦是如此。理论上这样做是对的,但国内一些网站确是很不符合规范,比如写的gbk,实际是utf-8,有的是写的utf-8,但实际是gbk,当然这是很少的一批网站,但确实存在。所以在确定网页编码时,应该对该特殊情况做特别处理,如中文检查、默认

2、编码等策略。还有一种情况,是以上三者中均没有编码信息,则一般采用cpdetector等第三方网页编码智能识别工具来做,其原理即为统计字节数组的特征来概率计算得出实际编码,有一定的准确率,但我实际的时候发现,其准确率还是很有限的。但综合上述的三种编码确认方式后,几乎可以完全解决中文乱码问题,在我基于nutch1.6二次开发的网络爬虫系统中,编码正确经统计可以达到99.99%,也证明了上述方法策略的可行性。(2)程序通过编码B对源网页数据还原显然,这里的B是要和A相等的,在java中,如得到的源网页的字节数组

3、为source_byte_array,那么经过转换为Stringstr=newString(source_byte_array,B);即在内存上这些字节数组对应的字符是正确编码和可显示的,此时的打印输出结果是正常的,此步骤往往用于debug或是控制台输出做测试。(3)统一转码网络爬虫系统数据来源很多,不可能使用数据时,再转化为其原始的数据,假使这样做是很废事的。所以一般的爬虫系统都要对抓取下来的结果进行统一编码,从而在使用时做到一致对外,方便使用。此时即是在(2)的基础上,做一个统一的编码转换即可,在ja

4、va中的实现如下源网页的字节数组为source_byte_array转换为正常的字符串:Stringnormal_source_str=newString(source_byte_array,C),此时可以用javaapi直接存储,但往往不直接写入字符串,因为一般的爬虫存储都是多个源网页存储到一个文件中,所以要记录字节偏移量,故下一步。再将得到的str转换为统一的编码C格式的字节数组,则byte[]new_byte_array=normal_source_str.getBytes(C)即可,此时即可用ja

5、vaioapi将数组写入文件,并记录相应的字节数组偏移量等,待真正使用时,直接io读取即可。   一,通过httpheader中的content_type中的charset来获得,该编码是最准确的。     二,通过得到源网页的meta的charset来获得编码。     三,通过智能探测,如cpdetector,它是目前口碑最好的java实现的智能探测编码,是基于统计实现的,所以注定会有一定的错误率,经过我的实测,若干特殊网页,它确实是不准确的,如网页的meta中charset和实际的浏览器识别的正常显

6、示的charset不相同的情况,它的识别也是错误的,所以最后我坚决没用它,而用了基于简单规则的方式,实际测试1000个种子网址证明,没发现任何乱码,除了一个站点它自身是乱码之外。   重点说下乱码的解决策略:     一、首先读取httpheader中的content_type的charset,如果有,则认定该charset是肯定准确的,直接做为解码的编码格式即可。      二、再按系统默认编码即UTF-8,去按行读取源网页中的meta和title的值,由于这两个值均为英文标签,所以在获取时肯定不会受到

7、乱码的影响,故可以按UTF-8方式准确获取charset和title的值,此时的title有可能是乱码。     三、由于有不少中文站点中,虽然meta中的charset显示的是utf-8或是GBK,但实际的浏览器解析到的正常编码正好相反为gbk或是UTF-8,面对这种特例,而又发现只有在国内的站点会有如此情况,故做规则如下:          (1)首先判断此时的title若均为标点、字母、数字、中英文符号、GB18030的中文字符等,则认为此次的默认编码就是源网页的实际编码,而不管获得的charset

8、是怎样的,并将charset设成为系统的默认编码utf-8。          (2)如果title满足第(1)条件,则用得到的charset去解码原始的字节流(如果charset就是utf-8,则省略后一步,直接将该charset作为实际的编码处理,即utf-8,原因在于很多俄文、西里尔文的标题多是UTF-8编码,但均不属于中文行列)。并获取新解析出来的源网页字符串的title。此时的新解码的charset即为最终的源网页认

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。