使用CasperJS中的数组发布数据

时间:2015-04-16 12:07:09

标签: javascript web-scraping casperjs

我正在使用CasperJS从example.com获取数据并将其发布到example.org。

casperjs代码:

var data = [];
casper.start('http://example.com', function() {
    this.echo('opened');
});
casper.then(function() {
    data.push( this.getHTML('div#a') ); // first text
    data.push( this.getHTML('div#b') ); // second text
    // ...
});
casper.thenOpen('http://example.org/', {
    method: 'post',
    data: {
        'data_one': data[0],
        'data_two': data[1],
        // ...
    }
});
casper.then(function() {
    this.echo( data );
});

控制台结果:

first text,second text,...

我希望在example.org上收到一些数据,但我添加的所有内容(' data_one',' data_two',...)都是未定义的。

如何正确发布数据?

1 个答案:

答案 0 :(得分:0)

问题是您可以访问data[0]data[1]

CasperJS的执行是异步的。所有then*wait*函数都是异步步骤函数。调用它们只会向队列添加一个步骤,只有在调用casper.run()时,才会执行队列。

这意味着,通过调用casper.thenOpen(),您可以直接访问data,但上一步尚未执行,因此尚未填充。

例如,您可以将casper.thenOpen()分为casper.then()casper.open()

casper.then(function(){
    this.open('http://example.org/', {
        method: 'post',
        data: {
            'data_one': data[0],
            'data_two': data[1],
            // ...
        }
    });
});

请注意,您还可以嵌套步骤。它们排队等待在当前步骤结束时执行:

casper.then(function() {
    data.push( this.getHTML('div#a') ); // first text
    data.push( this.getHTML('div#b') ); // second text

    ...

    this.thenOpen('http://example.org/', {
        method: 'post',
        data: {
            'data_one': data[0],
            'data_two': data[1],
            // ...
        }
    });
});