nodejs抓取动态网页(如何才能做到动态指定网页编码的问题?(图))
优采云 发布时间: 2021-11-26 07:08nodejs抓取动态网页(如何才能做到动态指定网页编码的问题?(图))
使用 superagent 抓取 网站 内容。当网页编码不是utf-8编码时,中文会返回乱码。原因是superagent只支持utf-8网页编码。我们可以使用它的扩展 npm 模块 superagent-charset
superagent-charset 使用说明
superagent-charset 扩展了superagent的功能,可以手动指定编码功能。
安装
$ npm i superagent-charset
用
使用 .charset(encoding) 方法,您可以指定编码。详细情况如下:
var assert = require('assert');
var request = require('superagent-charset');
request
.get('http://www.sohu.com/')
.charset('gbk')
.end(function(err,res) {
assert(res.text.indexOf('搜狐') > -1);
});
潜在问题
到目前为止,只解决了我们如何设置编码的问题,但是通常我们抓取网页的时候,都是动态抓取的,也就是说,我们没有手动指定网页的编码,那我们该怎么做呢?动态?指定网页编码怎么样?可以这样做:
动态获取指定的网站编码的网站编码并抓取
如何动态获取网站代码?
为了让浏览器能够正常渲染网页信息,网站通常会设置meta charset信息,比如
或者
我们可以写一个正则匹配规则来匹配这个信息中的charset内容来获取编码,如下:
var charset = "utf-8";
var arr = res.text.match(/]*?)>/g);
if (arr) {
arr.forEach(function (val) {
var match = val.match(/charset\s*=\s*(.+)\"/);
if (match && match[1]) {
if (match[1].substr(0, 1) == '"')match[1] = match[1].substr(1);
charset = match[1].trim();
}
})
}
当然,前提是我们需要先爬下网页。完整代码如下:
parseUrl: function (url, callback) {
async.waterfall([
function (callback) { // 动态获取网站编码
superagent.get(url).end(function (err, res) {
var charset = "utf-8";
var arr = res.text.match(/]*?)>/g);
if (arr) {
arr.forEach(function (val) {
var match = val.match(/charset\s*=\s*(.+)\"/);
if (match && match[1]) {
if (match[1].substr(0, 1) == '"')match[1] = match[1].substr(1);
charset = match[1].trim();
}
})
}
callback(err, charset)
})
}, function (charset, callback) { // 内容爬取
superagent
.get(url)
.charset(charset)
.end(function (err, res) {
if (err) {
console.log(err);
callback(err);
return;
}
var model = {};
var $ = cheerio.load(res.text);
var title = _.trim($('title').text());
if (title.indexOf('-') > 0) {
var strs = _.split(title, '-');
model.title = _.trim(title.substr(0, title.lastIndexOf('-')));
model.source = _.trim(_.last(strs));
} else {
model.title = _.trim(title);
}
callback(err, model);
})
}
],
function (err, model) {
callback(err, model);
});
}
整个想法:
现在向下爬取网页内容,动态获取代码,然后使用获取的代码再次爬取。
所以,缺点是:同一个页面要爬两次!同一个页面要爬两次!同一个页面要爬两次!
谨慎使用!