Nodejs http get 得到的数据为gzip格式 如何使用zlib模块进行解压 然后进行处理

Nodejs http get 得到的数据为gzip格式 如何使用zlib模块进行解压 然后进行处理

#http get 得到的数据为gzib格式 如何使用zlib模块进行解压 然后进行相关处理

15 回复

你发送请求时,不要带请求压缩的头,返回就不是gzip了,去掉如下的请求头

Accept-Encoding:gzip, deflate, sdch

一般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) })

顺便看这里学爬虫:https://github.com/alsotang/node-lessons

[@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);
});

解释:

  1. 引入必要的模块:我们首先需要引入 httpzlibfs 模块。
  2. 发起HTTP GET请求:使用 http.get() 方法向目标URL发起GET请求。
  3. 监听响应数据:通过监听 data 事件,我们可以逐步收集响应数据。这里我们将所有接收到的数据片段拼接在一起。
  4. 判断数据是否为gzip格式:检查响应头中的 content-encoding 字段是否为 gzip
  5. 解压缩数据:如果数据被gzip压缩,我们使用 zlib.gunzip() 方法进行解压缩。
  6. 处理解压缩后的数据:解压缩完成后,我们可以对数据进行进一步处理,例如打印到控制台或保存到文件中。
  7. 错误处理:在整个过程中,确保添加适当的错误处理逻辑,以便在发生错误时能够及时发现并处理。

以上就是如何在Node.js中处理HTTP GET请求返回的gzip压缩数据的基本流程。

当你通过HTTP GET请求从服务器获取到的是gzip压缩格式的数据时,你可以使用Node.js内置的zlib模块来解压数据。以下是如何使用zlib模块进行解压并处理数据的步骤和示例代码。

步骤

  1. 发送HTTP GET请求:首先你需要发送一个HTTP GET请求来获取数据。
  2. 检查响应头:确保响应头中的Content-Encoding字段是gzip
  3. 使用zlib.gunzip解压数据:使用zlib.gunzip方法对响应体数据进行解压。
  4. 处理解压后的数据:最后你可以根据需要处理解压后的数据。

示例代码

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压缩数据。

回到顶部