我不知道从哪里开始。基本上我需要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在跳转到下一个循环迭代之前完成它需要做的事情?
如果需要,我很乐意提供更多详细信息。我试图尽可能地简化流程,而不会删除所需的信息。
答案 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。