node.js用于在函数调用返回之前进行循环迭代,从而创建对象问题

时间:2016-03-23 06:55:05

标签: javascript node.js web-crawler phantomjs

我有节点代码来获取要抓取的网站列表,并且在迭代结果时,它调用使用幻像编写的爬网函数。但是在爬行函数返回结果之前,循环是迭代次数,因此对爬行函数的调用次数是无法处理的。我需要立即回答我的问题。 请有人带我离开这个。

我的主页代码

    db.fetch_serviceEntity(function(serviceEntityData){
      if(serviceEntityData!=""){
        serviceEntityData.forEach(function(item){
            console.log(item.website_url);
            db.fetch_entityId(item.id,function(entityId){
                crawler.getCount(item.website_url, item.name, function(rCount){
                    console.log("number of fresh reviews to crawl : ", parseInt(rCount) - parseInt(item.review_count));
                    if(rCount > item.review_count){
                        fetchReviews(item.website_url, entityId.id, parseInt(rCount) - parseInt(item.review_count), function(){
                            db.updateReviewCount(item.id, rCount, function(){
                                process.exit(0);    
                            });
                        });
                    }
                });
             });
          };    
        }); 
      }
      else {
        console.log("No websites to crawl/database error");
      }
      process.exit(0);
    });

我的抓取功能就在这里

    crawler.prototype.crawl = function(webUrl, callback){
    console.log(webUrl);
    this.driver.create({ path: require('phantomjs').path }, function (err, browser) {
      return browser.createPage(function (err,page) {
        return page.open(webUrl, function (err,status) {
          console.log("opened site? ", status);
          page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function (err) {
            // Wait for a bit for AJAX content to load on the page. Here, we are waiting 5 seconds.
            setTimeout(function () {
              return page.evaluate(function () {
                //Get what you want from the page using jQuery.
                var reviews = [];
                $('li div.review').each(function () { 
                  if($(this).find('div.ypassport').text()){
                    var d = new Date($(this).find('span.rating-qualifier').text().trim());
                    var temp = {
                        id : $(this).attr('data-review-id'), 
                        entity_id : "",
                        user_id : $(this).attr('data-signup-object').split(":")[1],
                    }
                    reviews.push(temp);
                  }
                });

                return {
                  reviews: reviews
                };
              }, function (err,result) {
                browser.exit();
                callback(result);
              });
            }, 5000);
          });
        });
      });
    });

};

我正在使用 node-phantom-simple 来编写抓取功能

我的问题是 - >因为for循环对它进行了多次调用,所以爬行函数给出了一些错误,即某些或其他对象没有创建。 例如在代码中它说“createpage不是undefined的函数”因此意思是浏览器对象没有创建。 有时它会说“打开不是未定义的函数”,因此“页面”对象不会创建。

1 个答案:

答案 0 :(得分:0)

您具有异步功能,但如果从第一个函数返回时process.exit(0),则会删除所有数据库连接,并且不会调用db.updateReviewCount。因此,您可以获得或多或少的任意结果,具体取决于首先关闭的人。

(除此之外,代码是一个回调地狱。也许你想创建更小的函数,然后用asyncco等库甚至手工链接它们。)