我目前有两个CasperJS脚本,我想将它们组合成一个用于可用性目的。 test1.js为网页抓取链接(<a>
元素)。刮取的所有结果链接都存储在数组urls
中。脚本test2.js需要link
并从iframe中提取youtube src链接。
如何收集所有链接(test1.js),然后访问每个链接以提取youtube
链接(test2.js),最后将YouTube链接存储在数组中并显示结果?
test1.js
var urls = [];
var casper = require('casper').create();
function getNumberOfItems(casper) {
return casper.getElementsInfo(".listview .badge-grid-item").length;
}
function tryAndScroll(casper) {
casper.page.scrollPosition = { top: casper.page.scrollPosition["top"] + 4000, left: 0 };
var info = casper.getElementInfo('.badge-post-grid-load-more');
if (info.visible) {
var curItems = getNumberOfItems(casper);
if( curItems <= 60 ) {
casper.waitFor(function check(){
return curItems != getNumberOfItems(casper);
}, function then(){
tryAndScroll(this);
}, function onTimeout(){
this.echo("Timout reached");
}, 20000);
}
} else {
casper.echo("no more items");
}
}
casper.start('http://example.com', function() {
tryAndScroll(this);
});
casper.then(function() {
casper.each(this.getElementsInfo('.title'), function(casper, element, j) {
var url = element["attributes"]["href"];
urls.push(url);
});
});
casper.run(function() {
this.echo(urls.join('\n')).exit();
this.echo(urls.length + ' links found');
});
test2.js(目前只需要一个网址)
var casper = require('casper').create();
var yt_links = [];
casper.start('http://example.com', function() {
this.click('.responsivewrapper');
});
casper.then(function() {
casper.each(this.getElementsInfo('.badge-youtube-player'), function(casper, element, j) {
var url = element["attributes"]["src"];
yt_links.push(url);
});
});
casper.run(function() {
this.echo(yt_links.join('\n')).exit();
this.echo(yt_links.length + ' link(s) found');
});
答案 0 :(得分:2)
start
和run
函数只能使用一次,但还有一个thenOpen
函数可以在一个步骤中打开一个URL。所有then*
和wait*
函数都是步进函数。通过调用它们,您基本上可以安排这些函数所代表的步骤。此外,您可以嵌套CasperJS步骤。这样脚本中的步骤就会越来越深,但只有在完成所有嵌套步骤后才会执行树中的更高步骤。
// last step of test1.js
casper.then(function() {
this.getElementsInfo('.title').forEach(function(element) {
// skip elements that don't have a href attribute...
if (!element.attributes.href) {
return;
}
// here come the contents of test2.js
casper.thenOpen(element.attributes.href, function() {
this.click('.responsivewrapper');
}).then(function(){
...
}).then(function(){
this.echo(yt_links.join('\n')).exit();
this.echo(yt_links.length + ' link(s) found');
});
});
});
我使用了构建器/承诺模式使代码示例更短。