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); });})// 获得所有主题链接 topicUrlssuperagent.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’);})
得到的结果是:

请教一下哪里出了问题?
问题解答
回答1:重写了下:
var async = require(’async’);var cheerio = require(’cheerio’);var superagent = require(’superagent’);var url = require(’url’);var cnodeUrl = 'https://segmentfault.com/';// 存放所有主题链接链接var topicUrls = [];// 获得所有主题链接 topicUrlssuperagent.get(cnodeUrl).end(function(err, sres) { if(err) {return next(err); } 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,在结果中取出callback返回来的整个结果数组。 async.mapLimit(topicUrls, 5, function (myurl, callback) {fetchUrl(myurl, callback); }, function (err, result) {console.log(’===== result: ======’, result); });})function fetchUrl(myurl,callback) { var fetchStart = new Date().getTime(); 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, reslut); })}
你上面的代码,我感觉你是参考
https://github.com/alsotang/node-lessons/blob/master/lesson4/app.js
这个课程写的吧,应该是你用的eventproxy方式不正确
相关文章:
1. html5 - 请问一下写H5的时候 你们都是兼容那些手机2. mysql连表排序3. css3中的 :hover只能应用于a标签不能用于其它标签吗(比如div或li之类的标签)4. javascript - 求助这种功能有什么好点的插件?5. linux - python 安装 Anaconda 环境变量问题请教6. javascript - 使用vue-cli有个报错ERR_INCOMPLETE_CHUNKED_ENCODING7. python3.x - python多线程如何修改数据?8. mysql - SQL添加记录的数据来源于同一个表9. mysql插入文本如果是个sql语句就报错了10. mysql sql where id in(25,12,87) 结果集如何用按照 25 12 87排序?

网公网安备