刮取链接,存储在数组中,然后在CasperJS中运行另一个进程

时间:2015-03-15 19:33:22

标签: javascript casperjs

我目前有两个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');
});

1 个答案:

答案 0 :(得分:2)

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');
    });
  });
});

我使用了构建器/承诺模式使代码示例更短。