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. 老师可以把数据库也给我们吗2. pdo 写入到数据库的内容为中文的时候写入乱码3. 数据库 - 使用读写分离后, MySQL主从复制延迟会导致读不到数据吗?4. PHP类封装的插入数据,总是插入不成功,返回false;5. 二维数组怎么重新组合6. javascript - vue1.0在微信浏览器的兼容性?7. python - 请问为什么csdn登录后,浏览器控制台reponse返回的是空8. 如何使用mysql查询每个用户一次操作时记录的值9. mysql 时间类型 字段(精确到时分秒) 怎么比较?10. thinkphp中Controller里面使用Request::File(’image’);
![android-studio - 一直无法下载android studio的 安卓模拟器求助](http://www.haobala.com/attached/image/news/202310/095450fe73.jpg)