如何组织我的casperjs脚本

时间:2014-12-08 19:37:58

标签: javascript phantomjs casperjs code-organization

我当前的脚本看起来像这样(伪代码):

casper.start(some_sample_url, function(){
    a_list_of_data = JSON.parse(this.getPageContent())

    for(var i = 0; i < a_list_of_data.length; i++){
        entry = a_list_of_data[i];
        entry_url = entry.get_url();
        result = __utils__.sendAJAX(entry_url, "POST", {some: "data"}, false, {some: "option"});
        casper.download(result, ...);
    }
});
casper.run();

我已经了解到__utils__.sendAJAX应放在this.evaluate中,而casper.then应该放在POST中。但是,在我将代码更改为该表单后,似乎所有{{1}}个请求都没有被发送出去。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

唯一的限制是__utils__仅在页面上下文中定义/注入(casper.evaluate内部)。所以你根本就不能在外面使用它。由于将false作为第三个参数传递给__utils__.sendAJAX会使其成为阻止调用,因此您可以在脚本中使用它。

for(var i = 0; i < a_list_of_data.length; i++){
    entry = a_list_of_data[i];
    entry_url = entry.get_url();
    result = this.evaluate(function(){
        return __utils__.sendAJAX(entry_url, "POST", {some: "data"}, false, {some: "option"});
    });
    casper.download(result, ...);
}

请注意,casper.download被任意限制为30秒下载(硬限制)和仅几兆字节的数据。它实际上在幕后使用__utils__.sendAJAX

如果您期望二进制数据,则需要在从页面上下文返回字符串之前对其进行编码,并在casper上下文中对其进行解码。


所有casper.then*casper.wait*函数都会创建一个步骤,该步骤将添加到步骤队列中并逐个执行。某些功能还会创建casper.repeatcasper.startcasper.run等步骤。如果有一个名为thenonTimeout的回调函数,那就是一个步骤。

您要执行的所有代码必须至少具有一个步骤功能,否则将在控制流程之外执行。有一些策略可以赶上破损的控制流程。但这里不需要这些。