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');
})
得到的结果是:
请教一下哪里出了问题?
阿神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
このコースは書かれていますが、使用しているイベントプロキシ メソッドが間違っている可能性があります