如何在CasperJS中的许多页面上进行嵌套循环

时间:2015-08-16 18:48:25

标签: javascript phantomjs casperjs

我不知道从哪里开始。基本上我需要CasperJS来运行大约15个不同的页面,每个页面运行它需要获取150个不同位置的数据,这些位置需要设置为cookie值。对于每个位置,我需要检查5个不同日期的数据。

其中任何一个看起来都非常简单,但试图让这三个事件发生让我感到困惑。

我试着这样设置:

for(Iterate through URLs){
  for(Iterate through locations){
    for(Iterate through dates){
      phantom.addCookie({
        // Cookie data here based on location and date
      });
      casper.start(url)
      .then(function(){
        // Do some stuff here
      })
      .run();
    }
  }
}

它的作用基本上是遍历所有内容,然后根据最后一个链接,最后一个位置,最后一个日期加载页面。但是每个其他位置都会被跳过。有更简单的方法吗?或许更好,有没有办法告诉我的JavaScript循环等待casper在跳转到下一个循环迭代之前完成它需要做的事情?

如果需要,我很乐意提供更多详细信息。我试图尽可能地简化流程,而不会删除所需的信息。

1 个答案:

答案 0 :(得分:1)

这就是它。需要注意两件事:

    每个脚本只应调用
  • casper.start()casper.run()一次。您可以使用casper.thenOpen()打开不同的网址。

  • 请记住,所有casper.then*()casper.wait*()函数都是异步步骤函数,并且只计划在当前步骤之后执行。由于JavaScript具有功能级别范围,因此您需要为每次迭代“修复”迭代变量,否则您将只获得最后一个URL。 (More information

示例代码:

casper.start(); // deliberately empty

for (var url in urls) {
    for (var location in locations) {
        for (var date in dates) {
            (function(url, location, date){
                casper.then(function(){
                    phantom.addCookie({
                        // Cookie data here based on location and date
                    });
                }).thenOpen(url)
                    .then(function(){
                        // Do some stuff here
                    });
            })(url, location, date);
        }
    }
}

casper.run(); // start all the scheduled steps

如果您使用Array.prototype.forEach而不是for-loop,那么您可以安全地跳过使用IIFE来修复变量。

我不确定,但您可能需要先打开一个页面,然后为该域添加一个Cookie。当该cookie的域当前处于打开状态时,PhantomJS可能只接受cookie。