如何使用CasperJS打开多个URL并将多个链接捕获为图像

时间:2016-01-02 16:47:03

标签: javascript casperjs

我想实现一些代码来捕获链接中的每个图像 但是,如果我运行此代码,那么我只获得最后一个链接的图像。 如何正确获取所有图像?
我发现它与封闭有关,但它也是如此。

var casper = require("casper").create({});

var dst = casper.cli.options["dst"];
var toon_id = casper.cli.options["id"];
var lastno = casper.cli.options["no"];
var no;
for (no=1; no<lastno;no++){
    var nox = no;
    var uri = 'http://comic.naver.com/webtoon/detail.nhn?titleId=' + toon_id + '&no=' + nox;
    (function(m){
        casper.start(uri, function() {
            var i;
            for(i=0;;i++){
                var id = '#content_image_' + i;

                if( casper.exists(id) == false ) break;
                this.captureSelector(m + '_' + i + '.png', id);
            }
        });

        casper.run();    
        console.log('No '+ m + '. has rendered' );
    })(nox);
}

1 个答案:

答案 0 :(得分:1)

在脚本中只应使用casper.start()casper.run()start()会在每次迭代使用相同的实例时覆盖casper实例的所有内部数据。此外,CasperJS是异步的,因此您必须使用诸如所有then*()wait*()函数之类的步骤函数来确保上一步完成。

您可以使用thenOpen()代替start();

casper.start();
for (no=1; no<lastno;no++){
    var nox = no;
    var uri = 'http://comic.naver.com/webtoon/detail.nhn?titleId=' + toon_id + '&no=' + nox;
    (function(m){
        casper.thenOpen(uri, function() {
            var i;
            for(i=0;;i++){
                var id = '#content_image_' + i;

                if( casper.exists(id) == false ) break;
                this.captureSelector(m + '_' + i + '.png', id);
            }
        });

        console.log('No '+ m + '. has rendered' );
    })(nox);
}

casper.run();

请注意,PhantomJS的渲染效率非常低。最好直接download()图像而不是制作剪裁的截图。