検索

ホームページ  >  に質問  >  本文

node.js - node async写的爬虫小程序请求高手指导

var cnodeUrl = "https://segmentfault.com/";

// 存放所有主题链接链接
var topicUrls = [];

/**
 * 所有的url请求完成后,ep控制异步结束,进入每一个主题
 */
ep.after('topic_html', topicUrls.length, function(topics) {

    var concurrencyCount = 0;  // 记录并发数

    /**
     * 进入主题,取得题目
     * @callback topics [{title:''}]
     */
    var fetchUrl = function(myurl, callback) {
        var fetchStart = new Date().getTime();
        concurrencyCount++;
        console.log('现在的并发数是', concurrencyCount, ',正在抓取的是', myurl);

        superagent.get(myurl).end(function(err, ssres) {
            if (err) {
                callback(err, myurl + ' error happened!');
            }
            var time = new Date().getTime() - fetchStart;
            console.log('抓取 ' + myurl + ' 成功', ',耗时' + time + '毫秒');
            concurrencyCount--;

            var $ = cheerio.load(ssres.text);
            var reslut = {
                title: $('.question__author>a>strong').text(),
                answer: $('#answers-title').text()
            };
            callback(null, result);
        })
    }

    // 控制最大并发数为5,在结果中取出callback返回来的整个结果数组。
    async.mapLimit(topicUrls, 5, function (myurl, callback) {
        fetchUrl(myurl, callback);
    }, function (err, result) {
        console.log('===== result: ======\n', result);
        //res.send(result);
    });
})

// 获得所有主题链接 topicUrls
superagent.get(cnodeUrl).end(function(err, sres) {
    if(err) {
        return next(err);
    }
    var $ = cheerio.load(sres.text);
    $('.stream-list').each(function(idx, element) {
        var $element = $(element).find('.title>a');
        var href = url.resolve(cnodeUrl, $element.attr('href'));
        topicUrls.push(href);
    })
    console.log('get authorUrls successful!\n', topicUrls);
    ep.emit('topic_html', 'get topicUrls successful');
})

得到的结果是:

请教一下哪里出了问题?

大家讲道理大家讲道理2873日前520

全員に返信(1)返信します

  • 阿神

    阿神2017-04-17 14:55:10

    書き直されました:

    var async = require('async');
    var チェリオ = require('チェリオ');
    var superagent = require('superagent');
    
    
    var url = require('url');
    var cnodeUrl = "https://segmentfault.com/";
    
    
    // すべてのトピックのリンクを保存します
    var topicUrls = [];
    
    // すべてのトピックのリンクを取得します topicUrls
    superagent.get(cnodeUrl).end(function(err, sres) {
        if(エラー) {
            次を返します(エラー);
        }
        var $ = Cheerio.load(sres.text);
        $('.stream-list__item').each(function(idx, element) {
            var $element = $(element).find('.title>a');
            var href = url.resolve(cnodeUrl, $element.attr('href'));
            topicUrls.push(href);
        })
        // 同時実行の最大数を 5 に制御し、結果内のコールバックによって返された結果配列全体を取り出します。
        async.mapLimit(topicUrls, 5, function (myurl, callback) {
            fetchUrl(myurl, コールバック);
        }, 関数 (エラー、結果) {
            console.log('====== 結果: ======', 結果);
        });
    })
    
    
    関数 fetchUrl(myurl,callback) {
        var fetchStart = new Date().getTime();
        superagent.get(myurl).end(function(err, ssres) {
            if (エラー) {
                callback(err, myurl + ' エラーが発生しました!');
            }
            var time = new Date().getTime() - fetchStart;
            console.log('クロール' + myurl + '成功', ', かかった時間' + 時間 + 'ミリ秒');
            // 同時実行数--;
    
            var $ = Cheerio.load(ssres.text);
            var 結果 = {
                タイトル: $('.question__author>a>strong').text(),
                答え: $('#answers-title').text()
            };
            callback(null, 結果);
        })
    }

    上記のコードは参考になると思います

    https://github.com/alotang/node-lessons/blob/master/lesson4/app.js

    このコースは書かれていますが、使用しているイベントプロキシ メソッドが間違っている可能性があります

    返事
    0
  • キャンセル返事