node爬虫问题
发布于 9 年前 作者 Aralic 3495 次浏览 最后一次编辑是 8 年前 来自 问答

实现功能:

我对一个指定的url进行get请求,然后解析数据。 对里面的url存进一个数组里面,然后遍历这个数组的url 进行get进行获取数据。

问题描述:

因为是并发请求,所以建立了一个变量count,如果count等于之前存放url数组长度, 那么执行最后的done函数。 results [index] 和count应该是同步执行,然后执行done()。 但为什么 done函数里面,打印results.length 为什么有点乱。

代码如下:


var http = require('http');
var cheerio = require('cheerio');
var url = require('url');
var express = require('express');
var pageUrl = 'http://shixi.info/';
var app = express();

//GET 请求指定pageUrl 
http.get(pageUrl , function(res) {
	var html = '';
	res.on('data', function(data) {
		html += data;
	});
	res.on('end', function() {
		callback(html);
	});
});

function callback(html) {
	var $ = cheerio.load(html);
	var arrUrl = [];
	var arrData = [];
	//解析pageUrl下数据 对指定url 存放进数组
	$('article').each(function(index, element) {
		var href = url.resolve(pageUrl, $(element).find('.entry-title a').attr('href'));
		arrUrl.push(href);
	});

	var count = 0;
	var results = [];
	function done() {
		console.log(results.length,count);
	   /*
		7 1
		7 2
		8 3
		10 4
		10 5
		10 6
		10 7
		10 8
		10 9
		10 10
	   */
		if (count == arrUrl.length) {
		   app.get('/', function(req, res) {
			   res.send(JSON.stringify(results));
		   }).listen('8888', '127.0.0.1');
		   console.log('done');
	   }
	}

	//遍历 数组里面的url ,进行GET 请求
	arrUrl.forEach(function(item, index) {
		http.get(item, function(res) {
			var html = '';
			res.on('data', function(data) {
				html += data;
			});

			res.on('end', function() {
				var $ = cheerio.load(html);
				var title = $('.entry-title').text();
				//results [index] 和count应该是同步执行,然后执行done(), 但为什么 done函数里面打印results.length 为什么有点乱
				results[index] = {
					url: item,
					title: title
				};
				count++;
				done();
			}); 

		});
	});
}
2 回复

length看数组的最大索引,我刚才去做了下试验,数组最大索引变大,数组长度也变大了。

@coordcn 明白了,非常感谢。原来是这样。 以前好像在犀牛书看到过,这样之前的没赋值的是undefined。

回到顶部