使用 CasperJS 正确地遍历数组和打开页面
Correctly iterating through array and open pages with CasperJS
我正在用 CasperJS 做一个小项目。主要思想是从某些网站的子页面获取带有标题和描述的图片链接。我已经尝试了许多不同的方法来实现我想要的,但我被一些代码困住了,我不想继续使用可能不正确的编码方式。
这是我代码中的当前事件序列:
casper.start(url);
casper.thenEvaluate(openPicturesSubpage);
casper.then(getPicturesInfo);
casper.then(getPictureFullRes);
casper.run();
前两个命令按预期工作,所以我将跳到第三个函数的结构。函数代码(我使用jQuery,因为我需要在其他函数中获取一些特定的东西)getPicturesInfo
(变量pictures
是全局的):
getPicturesInfo = function() {
pictures = this.evaluate(function() {
var array = [];
$('.picture-box a').each(function() {
arr.push({
'name': $(this).text(),
'subpage': $(this).attr('href')
});
});
return array;
});
}
基本上,我拥有继续 "browsing" 所需的一切图片的实际全分辨率链接。所以下一步是将新数据附加到已经创建的数组中。这也是我要解决的主要问题。如何正确遍历以前保存的数据数组?所以有最后一个函数的代码 getPictureFullRes
:
getPictureFullRes = function() {
for (var i = 0; i < pictures.length; i++) {
this.thenOpen(pictures[i]['subpage'], getFullResLink);
}
}
问题是我无法将计数器变量 i
传递给我的函数 getFullResLink
。我还尝试向 thisOpen
方法和 getFullResLink
函数添加另一个参数,但它不起作用,因为方法没有该功能。
如何访问 getFullResLink
中适当的数组索引?
我看到了两种可能的解决方法。
使用闭包
像这样定义一个getFullResLinkWrapper
:
function getFullResLinkWrapper(pictureIndex){
return function(){
// contents of getFullResLink that uses `pictureIndex`
};
}
然后你可以这样称呼它:
this.thenOpen(pictures[i]['subpage'], getFullResLinkWrapper(i));
这样您就可以为 getFullResLink
.
的每次迭代包含索引变量
函数内部计数
保证CasperJS执行过程中不跳过then()
步。因此,您可以轻松地在 getFullResLink
函数内推进计数器:
function getFullResLink(){
if (pictureIndex == null) {
pictureIndex = 0;
} else {
pictureIndex++;
}
...
}
我正在用 CasperJS 做一个小项目。主要思想是从某些网站的子页面获取带有标题和描述的图片链接。我已经尝试了许多不同的方法来实现我想要的,但我被一些代码困住了,我不想继续使用可能不正确的编码方式。
这是我代码中的当前事件序列:
casper.start(url);
casper.thenEvaluate(openPicturesSubpage);
casper.then(getPicturesInfo);
casper.then(getPictureFullRes);
casper.run();
前两个命令按预期工作,所以我将跳到第三个函数的结构。函数代码(我使用jQuery,因为我需要在其他函数中获取一些特定的东西)getPicturesInfo
(变量pictures
是全局的):
getPicturesInfo = function() {
pictures = this.evaluate(function() {
var array = [];
$('.picture-box a').each(function() {
arr.push({
'name': $(this).text(),
'subpage': $(this).attr('href')
});
});
return array;
});
}
基本上,我拥有继续 "browsing" 所需的一切图片的实际全分辨率链接。所以下一步是将新数据附加到已经创建的数组中。这也是我要解决的主要问题。如何正确遍历以前保存的数据数组?所以有最后一个函数的代码 getPictureFullRes
:
getPictureFullRes = function() {
for (var i = 0; i < pictures.length; i++) {
this.thenOpen(pictures[i]['subpage'], getFullResLink);
}
}
问题是我无法将计数器变量 i
传递给我的函数 getFullResLink
。我还尝试向 thisOpen
方法和 getFullResLink
函数添加另一个参数,但它不起作用,因为方法没有该功能。
如何访问 getFullResLink
中适当的数组索引?
我看到了两种可能的解决方法。
使用闭包
像这样定义一个getFullResLinkWrapper
:
function getFullResLinkWrapper(pictureIndex){
return function(){
// contents of getFullResLink that uses `pictureIndex`
};
}
然后你可以这样称呼它:
this.thenOpen(pictures[i]['subpage'], getFullResLinkWrapper(i));
这样您就可以为 getFullResLink
.
函数内部计数
保证CasperJS执行过程中不跳过then()
步。因此,您可以轻松地在 getFullResLink
函数内推进计数器:
function getFullResLink(){
if (pictureIndex == null) {
pictureIndex = 0;
} else {
pictureIndex++;
}
...
}