node爬虫问题
实现功能:
我对一个指定的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。