nodejs抓取动态网页(如何才能做到动态指定网页编码的问题?(图))

优采云 发布时间: 2021-11-26 07:08

  nodejs抓取动态网页(如何才能做到动态指定网页编码的问题?(图))

  使用 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);

});

}

  整个想法:

  现在向下爬取网页内容,动态获取代码,然后使用获取的代码再次爬取。

  所以,缺点是:同一个页面要爬两次!同一个页面要爬两次!同一个页面要爬两次!

  谨慎使用!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线