抓取链接,存储在数组中,然后 运行 CasperJS 中的另一个进程
Scrape links, store in array and then run another process in CasperJS
我目前有两个 CasperJS 脚本,出于可用性目的,我想将它们合并为一个。 test1.js 抓取网页 link 秒( <a>
元素)。抓取的所有结果 link 都存储在数组 urls
中。脚本 test2.js 获取 link
并从 iframe 中提取 youtube src link。
如何收集所有 link (test1.js) 然后访问每个 link 以提取 youtube
link (test2.js), 最后把YouTube links存入数组并显示结果?
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(目前只需要一个url)
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');
});
CasperJS的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');
});
});
});
我使用 builder/promise 模式使代码示例更短一些。
我目前有两个 CasperJS 脚本,出于可用性目的,我想将它们合并为一个。 test1.js 抓取网页 link 秒( <a>
元素)。抓取的所有结果 link 都存储在数组 urls
中。脚本 test2.js 获取 link
并从 iframe 中提取 youtube src link。
如何收集所有 link (test1.js) 然后访问每个 link 以提取 youtube
link (test2.js), 最后把YouTube links存入数组并显示结果?
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(目前只需要一个url)
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');
});
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');
});
});
});
我使用 builder/promise 模式使代码示例更短一些。