Nodejs:window下爬取gb2312网页出现乱码的解决方案

Nodejs:window下爬取gb2312网页出现乱码的解决方案

linux环境下,我们可以通过 iconv 这个C++模块来处理Node.JS不支持的字符编码,如GBK,BIG5。

iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。 老外写了一个通过纯Javascript转换编码的模块 iconv-lite 可以实现window下的转换 ,通过npm可以安装此模块,bufferhelper是一个操作buffer的加强类,关于buffer的详细解析,请参考地址:http://www.infoq.com/cn/articles/nodejs-about-buffer 比如抓取baidu.com,

var http = require('http'), 
var url = require('url').parse('http://www.baidu.com/');
var iconv = require('iconv-lite'); 
var BufferHelper = require('bufferhelper');

http.get(url,function(res){ var bufferHelper = new BufferHelper(); res.on(‘data’, function (chunk) { bufferHelper.concat(chunk); }); res.on(‘end’,function(){ console.log(iconv.decode(bufferHelper.toBuffer(),‘GBK’)); }); })


15 回复

Nodejs:Window下爬取GB2312网页出现乱码的解决方案

在Windows环境下使用Node.js爬取GB2312编码的网页时,可能会遇到乱码问题。这是因为Node.js默认的解码方式可能与目标网页的编码不匹配。为了解决这个问题,我们可以使用iconv-lite模块来正确地将GB2312编码的数据解码成Unicode。

解决方案

首先,确保你已经安装了iconv-lite模块。你可以通过以下命令安装:

npm install iconv-lite

然后,你可以使用以下代码片段来爬取并正确解码GB2312编码的网页内容:

const http = require('http');
const url = require('url').parse('http://example.com/'); // 替换为目标URL
const iconv = require('iconv-lite');
const BufferHelper = require('bufferhelper');

http.get(url, function(res) {
  const bufferHelper = new BufferHelper();

  res.on('data', function(chunk) {
    bufferHelper.concat(chunk);
  });

  res.on('end', function() {
    const buffer = bufferHelper.toBuffer();
    const decodedText = iconv.decode(buffer, 'GB2312'); // 使用 GB2312 编码解码
    console.log(decodedText); // 输出解码后的文本
  });
});

代码解释

  1. 引入必要的模块

    • http 模块用于发起HTTP请求。
    • url 模块用于解析URL。
    • iconv-lite 模块用于处理不同编码之间的转换。
    • BufferHelper 类用于操作缓冲区(Buffer)。
  2. 发起HTTP GET请求

    • 使用 http.get() 方法发起一个GET请求,并传入目标URL。
  3. 处理响应数据

    • res.on('data') 回调中,我们将接收到的每一小块数据(chunk)添加到 bufferHelper 中。
    • 当接收到所有数据后,触发 res.on('end') 回调。
  4. 解码并输出文本

    • 将缓冲区转换为Buffer对象。
    • 使用 iconv.decode() 方法将Buffer对象解码为GB2312编码的字符串。
    • 最终输出解码后的文本。

通过这种方式,我们可以确保在Windows环境下也能正确地爬取并显示GB2312编码的网页内容。


iconv这个类库在win下不能用, 换iconv-lite吧. 刚好这几天有在弄这个问题. 可以看下https://github.com/tomas/needle (有个iconv分支,我刚发了个issue,已解决, 应该这几天就更新上去了.)

iconv-lite不支持big5的吧

不错,就是这么搞滴。

gbk是罪……

弱问一下,卤煮怎么解析爬下来的东西呢?比如百度首页,是一大段字符串,怎么解析呢?比如我如果要找其中的某个div

jsdom不过那些有点重量级了(在内存中会创建dom树而且还解析js),cheerio是目前性能最好的(不解析js和其他资源)

iconv模块可以在Windows下用,先装Visual C++

3ks, needle很好用。

嗯。果断采用楼主的方法,成功转码,感谢

冒昧问下,你是朴灵吗?

不要再用windows开发了, 那么多坑 怎么说的来着? “在windows上搞开发就像带着脚镣跳舞”

你可以试试

$ npm install nodegrassex

是的。

在Windows环境下使用Node.js爬取GB2312编码的网页时,可能会遇到乱码问题。这是因为Node.js默认使用的UTF-8解码方式无法正确识别GB2312编码的文本。

解决这个问题,我们可以使用iconv-lite模块来将GB2312编码的Buffer转换为UTF-8字符串。以下是具体步骤和示例代码:

  1. 安装iconv-lite模块:

    npm install iconv-lite
    
  2. 使用iconv-lite进行编码转换:

    const http = require('http');
    const url = require('url').parse('http://example.com/'); // 替换为你需要爬取的URL
    const iconv = require('iconv-lite');
    
    http.get(url, function(res) {
      let bufferHelper = new BufferHelper();
    
      res.on('data', function(chunk) {
        bufferHelper.concat(chunk);
      });
    
      res.on('end', function() {
        const gb2312Buffer = bufferHelper.toBuffer(); // 获取完整的Buffer
        const utf8String = iconv.decode(gb2312Buffer, 'gb2312'); // 将Buffer解码为UTF-8字符串
        console.log(utf8String); // 输出结果
      });
    }).on('error', function(e) {
      console.error(`请求错误: ${e.message}`);
    });
    

在这个示例中,我们首先创建一个HTTP请求来获取网页数据,然后使用BufferHelper来累积所有的响应片段。最后,我们将累积的Buffer使用iconv-lite解码为UTF-8字符串,从而避免乱码问题。

回到顶部