(1) 程序通过编码B对源网页数据还原这里的B是要和A相等的,在java中,如得到的源网页的字节数组为
source_byte_array,那么经过转换为String str=new String(source_byte_array,B);即在内存上这些字节数组对应的
字符是正确编码和可显示的,此时的打印输出结果是正常的,此步骤往往用于debug或是控制台输出做测试。
2)确定源网页的编码A编码A往往在网页中的三个位置,http header的content、网页的meta charset中、网页头中
Document定义中。在获取源网页编码时,依次判断下这三部分数据即可,从前往后,优先级亦是如此。理论上这样
做是对的,但国内一些网站确是很不符合规范,比如写的gbk,实际是utf-8,有的是写的utf-8,但实际是gbk,当然
这是很少的一批网站,但确实存在。所以在确定网页编码时,应该对该特殊情况做特别处理,如中文检查、默认编
码等策略。还有一种情况,是以上三者中均没有编码信息,则一般采用cpdetector等第三方网页编码智能识别工具
来做,其原理即为统计字节数组的特征来概率计算得出实际编码,有一定的准确率,但我实际的时候发现,其准确
率还是很有限的。但综合上述的三种编码确认方式后,几乎可以完全解决中文乱码问题。
(3) 统一转码网络爬虫系统数据来源很多,不可能使用数据时,再转化为其原始的数据,假使这样做是很费事的。所
以一般的爬虫系统都要对抓取下来的结果进行统一编码,从而在使用时做到一致对外,方便使用。此时即是在(2)的
基础上,做一个统一的编码转换即可,在java中的实现如下源网页的字节数组为source_byte_array转换为正常的字
符串:String normal_source_str=new String(source_byte_array,C),此时可以用java api直接存储,但往往不直接写
入字符串,因为一般的爬虫存储都是多个源网页存储到一个文件中,所以要记录字节偏移量,故下一步。再将得到
的str转换为统一的编码C格式的字节数组,则byte[] new_byte_array=normal_source_str.getBytes©即可,此时即可
用java io api将数组写入文件,并记录相应的字节数组偏移量等,待真正使用时,直接io读取即可。爬虫过程不仅会
存在乱码问题,还会存在网站爬取涉及法律、IP受限,爬取行为受限等等问题,这个时候就需要不断去解决这些问
题。按照以上方案,大家可以解决爬虫中的乱码问题。
爬虫解决乱码的有效方法你知道吗
最新推荐文章于 2024-01-04 09:44:48 发布