下面给出 “详解nodejs爬虫程序解决gbk等中文编码问题”的完整攻略。
背景
在编写爬虫程序时,如果在抓取中文网页时,如果网页编码为 gbk 或其他不是 utf-8 的编码,那么会因为编码不匹配而出现乱码,无法正确获取中文数据。因此必须对编码进行转换。
解决方法
方法一:使用iconv-lite包
iconv-lite 是一个将字符串从一种字符编码转换为另一种字符编码的库。具体使用方法如下:
- 安装iconv-lite
npm install --save iconv-lite
- 引入iconv-lite
const iconv = require('iconv-lite');
- 将响应体数据(Buffer类型)转换为字符串
const body = iconv.decode(res.body, 'gbk');
这里的 'gbk' 表示将 res.body 从 gbk 编码转为 utf-8 编码,也可以根据实际情况修改编码类型。
方法二:使用request包
request 是一个非常流行的 Node.js 请求库,同时也能够解决编码问题,具体使用方法如下:
- 安装request和iconv-lite
npm install --save request iconv-lite
- 引入request和iconv-lite
const request = require('request');
const iconv = require('iconv-lite');
- 发送请求
request({
url: 'http://www.example.com',
encoding: null // 告诉request不要自动处理编码
}, (error, response, body) => {
const html = iconv.decode(body, 'gbk');
console.log(html);
});
也可以在全局初始化时设置全局默认编码类型,具体代码如下:
const request = require('request');
const iconv = require('iconv-lite');
request.defaults({
encoding: null, // 告诉request不要自动处理编码
headers: { // 伪造浏览器User-Agent,避免被识别为爬虫
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
}
});
request('http://www.example.com', (error, response, body) => {
const html = iconv.decode(body, 'gbk');
console.log(html);
});
这里设置 headers 是为了避免被目标网站的反爬机制识别为爬虫。
示例说明
下面给出两个例子来说明上述两种方法的使用。
示例一:使用iconv-lite
在这个例子中,我们使用iconv-lite将获取网易云音乐的歌曲列表。
- 安装依赖
npm install --save request request-promise iconv-lite cheerio
- 引入依赖
const request = require('request');
const rp = require('request-promise');
const iconv = require('iconv-lite');
const cheerio = require('cheerio');
- 发送请求
const options = {
uri: 'https://music.163.com/discover/toplist?id=645191942',
transform: (body) => {
return iconv.decode(body, 'gbk');
}
};
rp(options)
.then((html)=> {
const $ = cheerio.load(html);
const list = $('.f-hide li a');
console.log('网易云热歌榜:');
list.each(function (index, element) {
console.log($(element).text());
});
})
.catch((err) => {
console.log(err);
});
这里我们使用了 request-promise
来发送异步请求。通过 iconv.decode()
方法将响应体从 gbk 转换成 utf-8 编码,然后使用 cheerio
解析 HTML 代码,获取到歌曲列表信息。
示例二:使用request
在这个例子中,我们使用request获取豆瓣图书的信息。
- 安装依赖
npm install --save request iconv-lite cheerio
- 引入依赖
const request = require('request');
const iconv = require('iconv-lite');
const cheerio = require('cheerio');
- 发送请求
const url = 'https://book.douban.com/subject/1084336/';
request({
url,
encoding: null, // 告诉request不要自动处理编码
headers: { // 伪造浏览器User-Agent,避免被识别为爬虫
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
}
}, (error, response, body) => {
if (!error && response.statusCode === 200) {
const html = iconv.decode(body, 'gbk');
const $ = cheerio.load(html);
const title = $('h1 span').text();
const author = $('span.pl:contains("作者")').next().text();
const publisher = $('span.pl:contains("出版社")').next().text();
const pubdate = $('span.pl:contains("出版年")').next().text();
const price = $('span.pl:contains("定价")').next().text();
console.log('书名:' + title);
console.log('作者:' + author);
console.log('出版社:' + publisher);
console.log('出版日期:' + pubdate);
console.log('价格:' + price);
} else {
console.log(error);
}
});
此处使用了 request
发送请求,通过设置 encoding: null
不自动处理编码,然后使用 iconv.decode()
方法将响应体从 gbk 转换成 utf-8 编码,接着通过 cheerio
解析 HTML 代码,获取到图书信息。
总结
通过本篇文章,我们介绍了两种解决Node.js中爬虫程序中文编码问题的方法,并且通过两个示例来验证了这两种方法的可行性。同时,对于网站爬取还需注意网站反爬虫机制和版权问题,建议使用爬虫预处理技术和 respect IP 遵守相关法规。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解nodejs爬虫程序解决gbk等中文编码问题 - Python技术站