抓取链接,存储在数组中,然后 运行 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的

startrun函数只能使用一次,但也有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 模式使代码示例更短一些。