2014-01-12 63 views
0

我一直在玩nodejs和zombiejs从网站获取一些个人数据。不幸的是,我被卡在zombiejs只从第一个链接获取数据然后挂断的地步。Zombiejs - 同步获取链接的内容

我遵循的步骤是 -

  1. 进入到基础URL
  2. 获取的页面
  3. 使用异步库的数量由每次打开一个新的浏览器窗口中的一系列获取它们。注意我只创建一个浏览器窗口而不是全新的浏览器实例,因为创建一个浏览器实例非常昂贵。

这是我的代码

var Browser = require("zombie"); 
var async = require('async'); 

var so_base="http://stackoverflow.com"; 
var so_url="http://stackoverflow.com/questions/tagged/java?sort=newest&pagesize=15&page="; 

var browser = new Browser(); 
browser.visit(so_base, function() { 
    var arr=[]; 
    for(var i=1;i<=10;i++) { 
     arr.push(i); 
    } 
    async.eachSeries(
       arr, 
       function(k, callback) { 
         browser.open(); 
         browser.visit(so_url+k,function() { 
           console.log(browser.location.href); 
           console.log(browser.html());   
         }); 
       }, 
       function(e) { 
         console.log(e); 
       }); 
}); 

结果

>node main_zombie.js 
..... HTML DUMP 
http://stackoverflow.com/questions/tagged/java?sort=newest&pagesize=15&page=1 
> 

任何建议,将不胜感激

回答

0

找到

按照

错误 https://github.com/caolan/async#each

需要用空参​​数调用回调函数,如果没有错误,则为null。 所以正确的代码是

var Browser = require("zombie"); 
var async = require('async'); 

var so_base="http://stackoverflow.com"; 
var so_url="http://stackoverflow.com/questions/tagged/java?sort=newest&pagesize=15&page="; 

var browser = new Browser(); 
browser.visit(so_base, function() { 
    var arr=[]; 
    for(var i=1;i<=10;i++) { 
     arr.push(i); 
    } 
    async.eachSeries(
       arr, 
       function(k, callback) { 
         browser.open(); 
         browser.visit(so_url+k,function() { 
           console.log(browser.location.href); 
           console.log(browser.html()); 
         // Add callback and check if we reached the last page 
           if (k == 10) { 
            browser.close(); 
           } 
           callback(); 
         }); 
       }, 
       function(e) { 
         console.log(e); 
       }); 
});