前言

  今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行存储。

一、问题出现

  使用这篇文章里面的方法可以直接爬取页面信息并保存至本地使用Httpclient实现网页的爬取并保存至本地,当爬取这个网页时http://stock.10jqka.com.cn/zhuanti/hlw_list/,发现使用之前(未知编码 -> utf-8编码)的转化方式总是乱码。于是乎查阅了不少资料,发现都不是太适用。最后自己摸索出了一个解决办法,也特此记录。

二、解决方案

  1. 将gb2312格式转化为gbk格式

  2. 将gbk格式转化为utf-8格式

  这里的转化需要使用gbk作为一个中间格式,作为转化桥梁。

三、具体思路

  1. 当打开http://stock.10jqka.com.cn/zhuanti/hlw_list/这个链接,我们查看源码会发现编码格式为gb2312,如下图所示

  

  2. 由于本项目之前就已经使用了转化方案,但是此转化方案对网页为gb2312格式无效,本项目之前的转化方案的核心源代码为: 

public void getContent(String url) {
this.get = new HttpGet(url);
HttpResponse response = client.execute(this.get);
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
String content = new String(bytes);
// 默认为utf-8编码
String charset = "utf-8";
// 匹配<head></head>之间,出现在<meta>标签中的字符编码
Pattern pattern = Pattern.compile("<head>([\\s\\S]*?)<meta([\\s\\S]*?)charset\\s*=(\")?(.*?)\"");
Matcher matcher = pattern.matcher(content.toLowerCase());
if (matcher.find()) {
charset = matcher.group(4);
}
// 将目标字符编码转化为utf-8编码
String temp = new String(bytes, charset);
byte[] contentData = temp.getBytes("utf-8");
return contentData;
}

  这种方案对gb2312转化后还是乱码,之后的解决方案核心源代码为:  

public void getContent(String url) {
this.get = new HttpGet(url);
HttpResponse response = client.execute(this.get);
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
String content = new String(bytes);
// 默认为utf-8编码
String charset = "utf-8";
// 匹配<head></head>之间,出现在<meta>标签中的字符编码
Pattern pattern = Pattern.compile("<head>([\\s\\S]*?)<meta([\\s\\S]*?)charset\\s*=(\")?(.*?)\"");
Matcher matcher = pattern.matcher(content.toLowerCase());
if (matcher.find()) {
charset = matcher.group(4);
if (charset.equals("gb2312")) {
byte[] gbkBytes = new String(bytes, "gbk").getBytes();
return new String(gbkBytes, "utf-8").getBytes();
}
}
// 将目标字符编码转化为utf-8编码
String temp = new String(bytes, charset);
byte[] contentData = temp.getBytes("utf-8");
return contentData;
}

  通过这种方式我们就可以解决gb2312编码转化为utf-8编码时出现的乱码问题。

四、总结

  多思考,多动脑,这里只是给出了一个工程解决方案,并没有深入到其中的原理,由此问题可以引申出很多有意思的问题,如,utf-8、gbk、gb2312的编码方式怎样的?为什么这样转化就可以解决问题?这些问题值得我们去深入研究。由于本篇文章主要是讲工程解决方案,感兴趣的读者可以去深入了解。谢谢各位园友观看~

  附送一篇关于爬虫乱码问题解决的很好的文章,网络爬虫的乱码处理 ,讲得很不错,有做爬虫的园友遇到这一部分的问题时可以好好参考参考。

【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8)的更多相关文章

  1. html乱码原因与网页乱码解决方法

    造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.但无论是哪种情况造成乱码在网页开始时候都需要设置网页编码. charset编码设置 html网页乱码效果截图 一.乱码造 ...

  2. Python使用request包请求网页乱码解决方法

    使用requests请求网页时,返回的页面信息有时是乱码,如下代码 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) App ...

  3. python积累二:中文乱码解决方法

    根据网上提供的解决方法:添加#coding=utf-8或# -*- coding: utf-8 -*- #coding=utf-8 print "还不行?" 执行结果:还是乱码!: ...

  4. QT编写的网页浏览器网页乱码解决方法

    1.如果是本地网页,可以将网页编码改为GB2312 <meta http-equiv="Content-Type" content="text/html; char ...

  5. php mysql 中文乱码解决方法

    本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...

  6. MySql数据库乱码解决方法

    MySql数据库乱码解决方法 解决乱码问题一个原则:存取系统使用一致的编码规则. 多使用mysql的原生命令行,这样才能做更多的事情. ​ 第一步: 确认应用系统需要使用的编码 java的默认编码是跟 ...

  7. gvim的菜单乱码解决方法

    gvim的菜单乱码解决方法: (乱码是由于系统内码不兼容导致,系统内码包括gb2312 gb18030 utf-8 utf-16[unicode]等) 生成文件 ~/.gvimrc 并添加如下语句:s ...

  8. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  9. ueditor的工具栏显示乱码解决方法 小问题.. 是你的页面编码与语言包js编码不符所导致的

    ueditor的工具栏显示乱码解决方法 小问题..  是你的页面编码与语言包js编码不符所导致的解决方法:用记事本将ueditor\..\lang\zh-cn\zh-cn.js打开,然后保存为ANSI ...

随机推荐

  1. 'sessionFactory' or 'hibernateTemplate' is required解决方法

    这种情况就是在通过spring配置hibernate4的时候(注意,这里是hibernate4不是hibernate3,hibernate3的),使用的是HibernateDaoSupport的这种方 ...

  2. Java使用velocity导出word

    效果展示: 使用word编辑好模板

  3. C#打开关闭数据库连接

    一.忘记sqlserver密码时,运行语句,可修改密码,记得查看账户是否被禁用 EXECUTE sp_password NULL,'输入新密码','sa': 二.代码:data source一定要加上 ...

  4. hibernate常用API详解

    根据个人使用Hibernate的经验,介绍一下Hibernate的多种不同的查询和CUD操作,这些东西在日常开发中非常常用,希望对大家有所帮助. 以下示例均以两张表为例:member和userinfo ...

  5. Django的virtualenv环境搭建

    安装virtualenv好处多多,可以让当前的项目使用单独的类库,实现系统类库的隔离,所以能够自由地控制当前项目类库的版本,不受系统类库的影响:还有其他N多好处. 下面是安装说明和使用示例: 首先安装 ...

  6. dbca静默建库和删除库

    dbca查看帮助: [oracle@wen ~]$ dbca -help 1).运行静默建库语句 [oracle@wen ~]$ dbca -silent -cloneTemplate -gdbNam ...

  7. noty – jQuery通知插件

    noty是一个jQuery的通知(信息提示)插件,灵活轻便,是一个非常棒的用于替代传统提示对话框的插件. 当前最新版本为2.1.0: 从https://github.com/needim/noty 可 ...

  8. javascript检测ActiveX插件是否安装/启用

    本文主要提供在IE浏览器下检测ActiveX插件安装/启用的状态. 在一些应用开发中,需要用到一些第三方提供的ActiveX插件,如Flash插件. 为了在未安装插件的浏览器显示友好的提示,需要用到主 ...

  9. apache httpclient cache 实现可缓存的http客户端

    这里的cache storage 采用ehcache,而不是默认的内存式的cache storage.采用ehcache可以将内容缓存到磁盘上. maven <dependency> &l ...

  10. 【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)

    这周没什么时间,一开始就在忙一些CefSharp的事情,Win10的研究就放了下来,CefSharp的资料挺少的,但好在是开源的,可以我们便宜的折腾.因为两个的内容都不多,我就合成一篇文章啦. 这还里 ...