最近项目中遇到这样一个坑:
某一接口的HttpUrlConnection的请求返回结果为乱码,但PC浏览器直接打开是正常的。
效果图如下:
经过查阅代码发现,该接口的对应Header中有这么一段代码:
headers.put("Accept-Encoding", "gzip,deflate");
那么Accept-Encoding为gzip,deflate代表什么意思呢?
Accept-Encoding为gzip,deflate的含义
Accept-Encoding是用来设置从服务端返回的数据是否进行gzip压缩(gzip是一种数据格式,默认目前仅使用deflate算法压缩data部分)。
也就是说,如果客户端设置了gzip,deflate,等于告诉服务端,客户端是支持gzip格式的数据解压缩的。
若服务端支持gzip,deflate压缩方式,则客户端收到的数据则为gzip格式压缩的。
第一种解决方案:
直接去掉headers.put(“Accept-Encoding”, “gzip,deflate”);
项目中,我们也是采用的此方法。
第二种解决方案:
解码服务端返回的gzip格式压缩的数据。
以下这段代码来自:
http://blog.csdn.net/lzwglory/article/details/19548603
这里我并没有经过验证,直接copy过来的。
private String zipInputStream(InputStream is) throws IOException {
GZIPInputStream gzip = new GZIPInputStream(is);
BufferedReader in = new BufferedReader(new InputStreamReader(gzip, "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line;
while ((line = in.readLine()) != null)
buffer.append(line + "\n");
is.close();
return buffer.toString();
参考:
http://blog.csdn.net/tangzhide/article/details/53535543
http://www.bkjia.com/Javabc/1012944.html
http://blog.csdn.net/lzwglory/article/details/19548603
最近项目中遇到这样一个坑: 某一接口的HttpUrlConnection的请求返回结果为乱码,但PC浏览器直接打开是正常的。 效果图如下: 经过查阅代码发现,该接口的对应Header中有这么一段代码:headers.put("Accept-Encoding", "gzip,deflate");那么Accept-Encoding为gzip,deflate代表什么意思呢?Accept-Encodi
本文会使用Fiddler来查看
HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教程]
HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。
HTTP采用通用的压缩算法,比如
gzip来压缩HTML,Javascript, CSS文件。 能大大减少网络传输的数据量,提高了用户显示网页的速度。当然,同时会增加一点点服务器的开销。 本文从
HTTP协议的角度,来理解
HTTP压缩这个概念。
HTTP内容编码和
HTTP压缩的区别
其中request的header中,设置
Accept-
Encoding为
gzip,
deflate:
req = (
HttpWebRequest)WebRequest.Create(gSkydrive
Url);
req.Headers.Add("
Accept-
Encoding", "
gzip,
deflate");
结果始终
返回是
乱码:
HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头Content-Encoding 中通知客户端该选择。
今天我们就来看一看最常见的gzip压缩方式
压缩原理
gzip使用deflate算法进行压缩。具体就是将要压缩的文件先使用LZ77算法的一个变种进行压缩,对得到的结果再使用Huffman编码的方法进行压缩。
首先介绍下
我们在爬虫做请求的时候,一般会在request中添加请求头:Accept-Encoding,往往会指定方式为“gzip,deflate,br”三种压缩方式。
gzip和deflate为传统的压缩格式
br指的是Brotli,Google在2015年时候发布的新的数据压缩算法,而我们的工具request的response等文本只支持gzip,deflate格式的解压缩,还不支持br形式的解压...
在爬取网页时,如果网页的编码格式是gzip、deflate或br,则需要对网页进行解压缩,才能正确读取其中的内容。可以使用Python的requests库来实现自动解压缩,示例代码如下:
``` python
import requests
from io import BytesIO
import gzip
url = 'https://www.example.com'
headers = {'Accept-Encoding': 'gzip, deflate, br'}
response = requests.get(url, headers=headers)
if response.headers.get('Content-Encoding') == 'gzip':
# 如果网页使用gzip压缩,则解压缩网页内容
content = gzip.GzipFile(fileobj=BytesIO(response.content)).read().decode('utf-8')
else:
# 否则直接读取网页内容
content = response.content.decode('utf-8')
# 处理网页内容,避免中文乱码
# ...
在上述代码中,首先使用requests库发送带有Accept-Encoding头部信息的GET请求,如果服务器返回的响应头中包含Content-Encoding: gzip,则说明网页使用gzip压缩,需要对网页内容进行解压缩。解压缩后得到的内容是二进制数据,需要使用decode('utf-8')方法将其转换为字符串,然后就可以对网页内容进行处理,避免中文乱码问题。