node.js - node爬虫异步问题
阿神
阿神 2017-04-17 11:48:35
[Node.js讨论组]

实现功能:

我对一个指定的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();
            }); 

        });
    });
}


阿神
阿神

闭关修行中......

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号