如何告诉CasperJS在给定数组的情况下一次解析一个链接?

时间:2018-01-03 14:15:40

标签: javascript html phantomjs casperjs

这是我用来告诉CasperJS解析(单个)网页以获取一组目标链接的片段。

var casper = require('casper').create();
var links;

function getLinks() {
    var links = document.querySelectorAll('li.Item div.CoverImageContainer a');
    return Array.prototype.map.call(links, function (e) {
        return e.getAttribute('href')
    });
}

casper.start('https://nypl.overdrive.com/search?mediaType=ebook&subject=111&subject=14&sortBy=newlyadded');

casper.then(function () {
    links = this.evaluate(getLinks);
});

casper.run(function () {
    this.echo(' - ' + links.join('\n - ')).exit();
});

输出结果如下:

$ casperjs OD-links.js
 - /media/3204074
 - /media/3691522
 - /media/3360010
 - ...

现在,我希望CasperJS在提供多个URL(数组)时也能这样做,一次处理一个URL。以下是尝试执行此操作的方法:

var casper = require('casper').create();
var links;
var urls;

function getLinks() {
    var links = document.querySelectorAll('li.Item div.CoverImageContainer a');
    return Array.prototype.map.call(links, function (e) {
        return e.getAttribute('href')
    });
}

casper.start('about:blank');
var urls = [
    'https://nypl.overdrive.com/search?sortBy=newlyadded&mediaType=ebook&subject=111&subject=14&page=1',
    'https://nypl.overdrive.com/search?sortBy=newlyadded&mediaType=ebook&subject=111&subject=14&page=2',
    'https://nypl.overdrive.com/search?sortBy=newlyadded&mediaType=ebook&subject=111&subject=14&page=3'
];

casper.each(urls, function(casper, url) {
    casper.thenOpen(url, function() {
        links = this.evaluate(getLinks);
    });

    casper.run(function () {
        this.echo(' - ' + links.join('\n - ')).exit();
    });
});

它几乎可以工作。 CasperJS似乎在解析数组中给出的每个URL,但最后,它只输出从最后一页解析的24个链接,而不是72个(24 * 3个URL)。

如何修复代码?我错过了什么?

(PS:我刚开始学习JS,但需要这个用于个人项目。)

我目前正在使用的

临时解决方法

var casper = require('casper').create();
var links;

function getLinks() {
    var links = document.querySelectorAll('li.Item div.CoverImageContainer a');
    return Array.prototype.map.call(links, function (e) {
        return e.getAttribute('href')
    });
}

// THIS lets us use --url argument
casper.start(casper.cli.get('url'));

casper.then(function () {
    links = this.evaluate(getLinks);
});

casper.run(function () {
    this.echo(' - ' + links.join('\n - ')).exit();
});

所以我的命令变为:

casperjs OD-links.js --url='http://example.com/'

0 个答案:

没有答案