为了账号安全,请及时绑定邮箱和手机立即绑定

获取的数据是乱码,是怎么回事?

谁能帮我看看我的代码,帮我看看,我是个初学者,弄了好久,还是没弄出来,哪里出错了啊?获取到的数据不论是写到文件,还是读出来都是乱码,就这个样http://img1.sycdn.imooc.com//574b06a70001bf6011760540.jpg

var http = require('http');
var querystring = require('querystring');
var Promise = require('Promise'); // 若版本过低,可使用bluebird替换
var cheerio = require('cheerio'); // 类似于jQuery,安装方法:npm install cheerio
var fs = require('fs');
var path = require('path');

var option={
	hostname: "user.pospal.cn",
	port: 80,
	path:"/Product/Manage",
	method: "POST",
	headers:{
		"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
		"Accept-Encoding": "gzip, deflate, sdch",
		"Accept-Language": "zh-CN,zh;q=0.8",
		"Cache-Control": "max-age=0",
		"Connection": "keep-alive",
		"Cookie": "__ngDebug=true; Vid=V2FQZl1mXj5QNQE6WWU=; .POSPALAUTH30220=0102A061942D6F" +
			"84D308FEA0E15C7F6F8FD3080006350030003100350032003A0000012F00FFA5D1EE8E7CAB31C99" +
			"86D05F03CCD1198462091BE; Hm_lvt_7d46a3151782b7a795ffeba367b5387d=1462767802,146" +
			"2771728; Hm_lpvt_7d46a3151782b7a795ffeba367b5387d=1464480933; Hm_lvt_18c160bec8" + 
			"a91b8858c74ff702e6c788=1463498456,1463575485,1464061183,1464394742; Hm_lpvt_18c" + 
			"160bec8a91b8858c74ff702e6c788=1464513421; ASP.NET_SessionId=10ooianyuuk3mcjwbhqs3rls",
		"Host":"user.pospal.cn",
		"Referer": "http://user.pospal.cn/Product/CaseProductItem",
		"Upgrade-Insecure-Requests": "1",
		"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
	}
};

var req = http.request(option, function (res) {
	res.setEncoding('utf8');
	
	var data = '';
	console.log("Status:" + res.statusCode);
	console.log("headers:" + JSON.stringify(res.headers));
	
	res.on('data', function (chunk) {
		console.log("is Buffer: " + Buffer.isBuffer(chunk));
		console.log(typeof chunk);
		
		data += chunk;
		console.log(chunk.toString());
	});
	
	res.on('end', function () {
		console.log("shuju" + typeof data);
		console.log("数据获取完毕!");
		
		fs.writeFile(path.join(__dirname, 'account.js'), data, (err) => {
		//fs.writeFile('account.js', data, (err) => {
			  if (err) throw err;
			  console.log('It\'s saved!');
		});
		
		filterHtml(data);
	});
});

req.on('error', function (e) {
	console.log("Error: " + e.message);
});

req.end();


正在回答

6 回答

我已找到原因,为将来的自己和遇到同类问题的人作个参考,将解决方法列举于此

我复制的是chrome浏览器发送的headers,其中有一个header头"Accept-Encoding": "gzip, deflate, sdch",告诉服务器支持的压缩编码方式(浏览器这样做的目的是加快传输速度吧),然后我要爬取网站的服务器发来了"deflate"压缩编码的数据,而我的代码中获取到数据后未进行解码,最后导致了乱码。

解决方法:对数据使用nodejs的zlib模块进行解码或者去掉这个header头,解码的代码大致如下

if (encoding == 'gzip') {

            zlib.gunzip(buffer, function (err, decoded) {

            if (err) {

            console.log(err);

            return;

            }

                html = decoded.toString();

                Promise.resolve(html);

            });

            

        } else if (encoding == 'deflate') {

            zlib.inflateRaw(buffer, function (err, decoded) {// 注意异步问题

            if (err) {

            console.log(err);

            return;

            }

                html = decoded.toString();

            });

        } else {

            html = buffer.toString();

        }

 PS:我这里之所以使用header头,是我在登录状态下获取浏览器的headers,这样能爬取到登录后显示的数据,另外我是一个菜鸟

1 回复 有任何疑惑可以回复我~

我的代码有没有问题?谁帮我看看呗

第41行有时打印出false,什么情况?


0 回复 有任何疑惑可以回复我~

编码格式:

'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',

0 回复 有任何疑惑可以回复我~

爬虫程序汉字乱码问题解答:http://www.imooc.com/article/9053

0 回复 有任何疑惑可以回复我~

不对,还是不行

0 回复 有任何疑惑可以回复我~

var cheerio=require('iconv-lite')

var decodeBody=iconv.decode(Buffer.concat(html),'gbk');//html中的字符类型


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
进击Node.js基础(二)
  • 参与学习       76755    人
  • 解答问题       226    个

本教程带你攻破 Nodejs,让 JavaScript流畅运行在服务器端

进入课程

获取的数据是乱码,是怎么回事?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信