2012-11-02 110 views
1

我试图从指定的网站上刮取信息。本网站使用认证首先,这样的AI使用zombie.js:用node.js处理ajax响应

var Browser = require("zombie"); 
var browser = new Browser(); 
browser.visit("https://*****login.aspx", function(){ 
    browser.fill('#user', '*****'); 
    browser.fill('#pwd', '*****'); 
    var button = browser.querySelector('#btnSubmit'); 
    browser.fire('click', button, function(){ 
    //scraping main.aspx 
    }); 
}); 

它的工作,我可以刮main.aspx:有一个<table>,containig有关新的消息的信息(从,日期,主题),问题出现在这里:主题字段是可点击的,点击它会使新窗口显示实际的消息。但它是一个ajaxgrid,当我执行一个点击时:

var field = browser.querySelector('#VeryLongIdOfTheField'); 
browser.fire('click', field, function(){  
    console.log(browser.querySelector('#VeryLongIdOfTheFieldContainingTheMessage').innerHTML); 
}); 

它返回一个错误消息,说未定义没有innerHTML。我想它是因为这个动作处理了一些Ajax魔法。我在这个js/nodejs/jquery/..世界中是新手,需要一些帮助来照亮我。

回答

0

由于数据是使用异步ajax填充的,因此我猜测您的点击与节点内的实际DOM群体之间存在滞后。如何在检查节点内的内容之前等待一下。

browser.fire('click', field, function(){ 
    setTimeout(function(){ 
    console.log(browser.querySelector('#VeryLongIdOfTheFieldContainingTheMessage').innerHTML); 
    }, 3000) 
}); 

如果所用的时间是不是很容易预测,你也可以在循环中运行它,直到你找到重​​试合理数量后的内容或退出。

+0

感谢您的回复!我已经尝试过setTimeout,但没有使用它。我尝试了你建议的循环,但也没有工作。但是我不确定问题是这样的,因为僵尸API提到fireEvent的回调等待资源,如XHR资源,iframe。 – sifear