Nodejs http get 得到的数据为gzip格式 如何使用zlib模块进行解压 然后进行处理
Nodejs http get 得到的数据为gzip格式 如何使用zlib模块进行解压 然后进行处理
#http get 得到的数据为gzib格式 如何使用zlib模块进行解压 然后进行相关处理
你发送请求时,不要带请求压缩的头,返回就不是gzip了,去掉如下的请求头
Accept-Encoding:gzip, deflate, sdch
[@DoubleSpout](/user/DoubleSpout) 设置为空也是返回gzip
一般gzib
的需要gzib
的来解.
[@DoubleSpout](/user/DoubleSpout) 估计是服务端不管三七二十一都gzip返回 发自 CNodeJs ionic
现在的 urllib 相关库不都自动解压的吗?
[@alsotang](/user/alsotang) 不提供自动解压开始我还以为是数据乱码,后来发现是gzip格式 数据API地址 http://esf.wuhan.fang.com/EsfMap/Interfaces/getHouseData.aspx zlib模块可以实现解压 但是还不会使用
[@lzxue](/user/lzxue) 用 superagent 这个库
var superagent = require('superagent');
var url = ‘http://esf.wuhan.fang.com/EsfMap/Interfaces/getHouseData.aspx’;
superagent.get(url).end(function (err, res) {
console.log(res.text)
})
[@alsotang](/user/alsotang) superagent 库确实简单,自动解压
找了个解压的库 gzip-buffer (GZips and GUnzips via a buffer rather than a stream)
function handler(responder) {
var bufferHelper = new BufferHelper();
responder.on("data",function(chunk){
bufferHelper.concat(chunk);
})
responder.on(“end”,function(){
gbuf.gunzip(bufferHelper.toBuffer(), function(unzipped){
var html=iconv.decode(unzipped, ‘gb2312’);
var json=JSON.parse(html);
console.log(json);
})
})
}
[@fengmk2](/user/fengmk2) 那就没办法了~不遵守协议
zlib.gunzip(data, function(err, 'gzip') {
});
[@hades](/user/hades) 测试这个方法了,没解开
[@lzxue](/user/lzxue) @.[@p](/user/p) 不科学你确定是gzip还是inflat,我一直用着好好的。
昨天写爬虫时遇到这个坑了,无论怎么处理都是乱码,刚刚才发现时这个影响的,request headers里去掉这个就不是乱码了,害我因为这个问昨晚没睡好
Node.js HTTP GET 获取 gzip 数据并使用 zlib 模块解压缩及处理
在某些情况下,从HTTP服务器获取的数据可能被压缩成gzip格式。为了正确处理这些数据,我们需要先将其解压缩。Node.js 提供了 zlib
模块来帮助我们完成这项任务。以下是一个简单的示例,展示了如何使用 http
模块发起GET请求,并使用 zlib
模块对返回的gzip数据进行解压缩。
示例代码:
const http = require('http');
const zlib = require('zlib');
const fs = require('fs');
// 目标URL
const url = 'http://example.com/data';
// 发起HTTP GET请求
http.get(url, (response) => {
let data = '';
// 设置响应数据的解码类型
response.setEncoding('utf8');
// 监听data事件以接收响应数据
response.on('data', (chunk) => {
data += chunk;
});
// 监听end事件以确定所有数据已接收完毕
response.on('end', () => {
// 判断是否为gzip压缩数据
if (response.headers['content-encoding'] === 'gzip') {
// 使用zlib.gunzip方法解压缩数据
zlib.gunzip(data, (err, decodedData) => {
if (err) {
console.error('解压缩失败:', err);
return;
}
// 处理解压缩后的数据
console.log('解压缩后的数据:', decodedData);
// 可以将解压缩后的数据写入文件或进行其他处理
fs.writeFileSync('decodedData.txt', decodedData);
});
} else {
// 如果不是gzip压缩数据,则直接处理
console.log('非压缩数据:', data);
}
});
}).on('error', (error) => {
console.error('请求错误:', error);
});
解释:
- 引入必要的模块:我们首先需要引入
http
、zlib
和fs
模块。 - 发起HTTP GET请求:使用
http.get()
方法向目标URL发起GET请求。 - 监听响应数据:通过监听
data
事件,我们可以逐步收集响应数据。这里我们将所有接收到的数据片段拼接在一起。 - 判断数据是否为gzip格式:检查响应头中的
content-encoding
字段是否为gzip
。 - 解压缩数据:如果数据被gzip压缩,我们使用
zlib.gunzip()
方法进行解压缩。 - 处理解压缩后的数据:解压缩完成后,我们可以对数据进行进一步处理,例如打印到控制台或保存到文件中。
- 错误处理:在整个过程中,确保添加适当的错误处理逻辑,以便在发生错误时能够及时发现并处理。
以上就是如何在Node.js中处理HTTP GET请求返回的gzip压缩数据的基本流程。
当你通过HTTP GET请求从服务器获取到的是gzip压缩格式的数据时,你可以使用Node.js内置的zlib
模块来解压数据。以下是如何使用zlib
模块进行解压并处理数据的步骤和示例代码。
步骤
- 发送HTTP GET请求:首先你需要发送一个HTTP GET请求来获取数据。
- 检查响应头:确保响应头中的
Content-Encoding
字段是gzip
。 - 使用zlib.gunzip解压数据:使用
zlib.gunzip
方法对响应体数据进行解压。 - 处理解压后的数据:最后你可以根据需要处理解压后的数据。
示例代码
const https = require('https');
const zlib = require('zlib');
// 发送HTTP GET请求
https.get('https://example.com/data', (res) => {
let chunks = [];
// 监听data事件收集响应体
res.on('data', (chunk) => {
chunks.push(chunk);
});
// 当接收到所有数据时执行
res.on('end', () => {
// 检查Content-Encoding是否为gzip
if (res.headers['content-encoding'] === 'gzip') {
// 使用zlib.gunzip解压数据
zlib.gunzip(Buffer.concat(chunks), (err, data) => {
if (err) {
console.error('解压错误:', err);
return;
}
// 处理解压后的数据
const result = data.toString();
console.log('解压后的数据:', result);
// 在这里处理result
});
} else {
// 如果不是gzip格式,直接处理原始数据
const result = Buffer.concat(chunks).toString();
console.log('原始数据:', result);
// 在这里处理result
}
});
}).on("error", (e) => {
console.error(`发生错误: ${e.message}`);
});
解释
- 首先我们通过
https.get
发送一个GET请求。 res.on('data', ...)
用于收集HTTP响应中的每个数据块。- 当接收到完整的响应体后,在
res.on('end', ...)
中我们检查响应头的Content-Encoding
是否为gzip
。 - 如果是gzip格式,我们使用
zlib.gunzip
对缓冲区数据进行解压,并在回调函数中处理解压后的字符串数据。 - 如果不是gzip格式,则直接将缓冲区数据转换为字符串并处理。
这个过程简单明了地展示了如何使用Node.js的zlib
模块来解压从HTTP GET请求中获得的gzip压缩数据。