fortheleaf 2015-04-07 03:07 采纳率: 0%
浏览 1746

使用nodejs抓取时,出现问题(详看正文)

newsList和newsDetail单独拿出来调试没有问题。但如下放在一起时,提示

 body is not defined

经多次调试,错误节点应该是出现在readNewsDetail()中

 // 转换 gbk 编码的网页内容
        body2 = iconv.decode(body, 'gbk');

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(body2);

这两句。因为直接 var $ = cheerio.load(res.body.toString()); 的话,不会报错。但这样一来,输出的就是乱码了,所以必须转码。但一按照我的写法转码,就会报错……
请教各位,这个问题应该怎么解决?谢谢!!!

源码:

 var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
var async = require('async');
var debug = require('debug')('sina1:update');

/**
 * 获取新闻列表
 */
function readNewsList(url, callback) {
    debug('读取新闻列表:%s', url);

    request(url, function(err, res) {
        if (err) return callback(err);

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(res.body.toString());

        // 读取新闻列表
        var newsList = [];
        $('.news-item').each(function() {
            var $me = $(this);
            var $title = $me.find('h2 a');
            var $time = $me.find('.time');
            var $url = $me.find('h2 a');

            var item = {
                title: $title.text().trim(),
                url: $url.attr('href'),
                time: $time.text().trim()
            };

            newsList.push(item);
        });

        // 返回结果
        callback(null, newsList);
    });
}


/**
 * 获取新闻页面内容
 */
function readNewsDetail(url, callback) {
    debug('读取新闻内容:%s', url);

    request(url, function(err, res) {
        if (err) return callback(err);

        // 转换 gbk 编码的网页内容
        body2 = iconv.decode(body, 'gbk');

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(body2);

        // 获取正文内容

        var newsDetail = [];
        $('.article').each(function() {
            var $me = $(this);
            var $img = $me.find('.img_wrapper img');

            var item = {
                content: $me.html().trim(),
                img: $img.attr('src')
            };

            newsDetail.push(item);

        });
        // 返回结果
        callback(null, newsDetail);
    });
}

// 读取列表下的所有新闻
readNewsList('http://news.sina.com.cn/china/', function(err, newsList) {
    if (err) return console.error(err.stack);

    // 依次取出 newsList 数组的每个元素,调用第二个参数中传入的函数
    // 函数的第一个参数即是 newsList 数组的其中一个元素
    // 函数的第二个参数是回调函数
    async.eachSeries(newsList, function(news, next) {

        // 读取新闻正文
        readNewsDetail(news.url, function(err, detail) {
            console.log(detail);
//          if (err) console.error(err.stack);
//
//          // 直接显示
//          console.log(detail);
//
//
//          // 需要调用 next() 来返回
//          next();
        });

    }, function(err) {
        // 当遍历完 newsList 后,执行此回调函数

        if (err) return console.error(err.stack);

        console.log('完成');
    });

});
  • 写回答

2条回答 默认 最新

  • lhl_lqc 2015-04-07 05:40
    关注

    你这个body没有定义啊。图片说明

    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?