csdn博客客户端开发日记----2015年7月22日

本文分享了一个优快云博客爬虫项目初期遇到的乱码问题解决方案,通过调整编码设置成功解决了乱码问题,并介绍了使用HttpClient进行网页抓取的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在csdn博客上发现了很多好的文章,找了很多博客导出工具都弄不下来,恰好最近手上没什么事,就想着做一个csdn博客的app。


csdn上也有前辈已经做过博客的app了,我看了下好像只支持专家博客的,对于一般人的好像并不支持查看。原来在学校的时候做过一个查课表的app,虽然是失败了,不过也知道一些网页爬虫的工具,比如httpwatch,htmlpaser等等。工作一年之后,感觉经验比之前要好很多了,所以还是决定这一次试试做个csdn博客app出来。


说是这么说,我也不知道最后有没有耐心坚持做完,但是还是开个头吧,不开个头后面的事情就更难说了。


说了这么多,是为了交代下背景,也是为了激励下自己,加油~~


2015年7月22日

好久没有用HttpClient了,所以对它的用法已经忘得差不多了,这也是我想做这个app的原因之一,因为做项目大概就是查漏补缺、丰富经验的过程吧。


一系列的百度和coding之后,碰到的第一个问题是乱码的问题。


一开始我是用下面的方式,然后将读出来的字节数组用new String(data,"utf-8")的方式保存,但是debug的时候发现new出来的字符串是乱码。


百度后看到有人说不应该用字节流,应该用字符流。


/**
	 * 从输入流中读取数据
	 * 
	 * @param inStream
	 * @return
	 * @throws Exception
	 */
	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		byte[] data = outStream.toByteArray();// 网页的二进制数据
		outStream.close();
		inStream.close();
		return data;
	}



于是我又写了一种方式,但是还是乱码。百思不得其解。


	/**
	 * 从输入流中读取数据
	 * 
	 * @param inStream
	 * @return
	 * @throws Exception
	 */
	public static String read(InputStream inStream) throws Exception {

		InputStreamReader inputStreamReader = new InputStreamReader(inStream,
				HTTP.UTF_8);
		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

		StringBuilder stringBuilder = new StringBuilder();

		String temp;
		while ((temp = bufferedReader.readLine()) != null) {

			stringBuilder.append(temp);
		}

		bufferedReader.close();
		inputStreamReader.close();

		return stringBuilder.toString();
	}


问了很多人,有人说要我多试几种不同的编码,但是我试了之后发现并没有什么卵用。而且我用httpwatch查看的时候,响应头里面的字符集是utf-8的。


后来我在网上找到了有前辈做的csdn博客app,看了下他的代码,对比了下自己的,发现自己请求的时候加了很多请求头。


		addHeader("Accept", "text/html, application/xhtml+xml, */*");
		addHeader("Accept-Encoding", "gzip, deflate, sdch");
		addHeader("Accept-Language", "zh-CN,zh;q=0.8");
		addHeader("Connection", "Keep-Alive");
		addHeader("Host", "blog.youkuaiyun.com");
		addHeader("UA-CPU", "AMD64");
		addHeader("User-Agent",
				"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)");

看上面的请求头,大多都是硬件信息,浏览器标识之类的,只有这两句,第一句是我不知道,第二句是跟中文有关的,然后把它们都注释掉。

<span style="white-space:pre">		</span>addHeader("Accept-Encoding", "gzip, deflate, sdch");
		addHeader("Accept-Language", "zh-CN,zh;q=0.8");

再次请求,发现得到的数据没有乱码了!!!


查了下百科:HTTP Header中Accept-Encoding 是浏览器发给服务器,声明浏览器支持的编码类型


书到用时方恨少啊,早知道在学校好好念书了。


后来发现把上面那句改成


		addHeader("Accept-Encoding", "utf-8");


就好了。


另外,将响应实体转成字符串不用那么麻烦,之前是用这个response.getEntity().getContent() 得到输入流,然后从输入流读到字符串。


但是后来看那位前辈的代码,发现只要一句就可以了EntityUtils.toString(entity)。


这是那位前辈的博客

over.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值