CasperJS - 如何打开链接数组中的所有链接

时间:2013-07-29 14:22:51

标签: javascript html phantomjs casperjs

我正在努力使CasperJS打开array个链接中的每个链接。我有它,以便在我打开链接后,它将显示该页面的标题。然而,当我运行它时,没有显示任何内容。

我可以使用for loop来显示链接,但效果非常好。

这是我刚才解释的代码:

var x;

casper.start(URL, function() {

    x = links.split(" "); // now x is an array of links

    for (var i = 0; j < x.length; i++) // for every link...
    {
        casper.thenOpen(partialURL + x[i], function() { // open that link
            console.log(this.getTitle() + '\n'); // display the title of page
        });
    }

    this.exit();
});

casper.run();

这是我尝试的另一种方法:

var x;

casper.start(URL, function() {
    x = links.split(" "); // now x is an array of links
    this.exit();
});

for (var i = 0; j < x.length; i++) // for every link...
{
    casper.thenOpen(partialURL + x[i], function() { // open that link
        console.log(this.getTitle() + '\n'); // display the title of page
    });
}

casper.run();

它表示'x'未定义。请注意,我将x设置为全局变量。 你可以做的任何修改都会很棒。感谢。

7 个答案:

答案 0 :(得分:8)

var x; var i = -1;

casper.start(URL, function() {
    x = links.split(" "); // now x is an array of links
});

casper.then(function() {
    this.each(x, function() { 
        i++; // change the link being opened (has to be here specifically)
        this.thenOpen((partialURL + x[i]), function() {
            this.echo(this.getTitle()); // display the title of page
        });
    });
});

casper.run();

答案 1 :(得分:8)

var i = 0;
var nTimes = x.length;

casper.repeat(nTimes, function() {
    //... do your stuff
    i++;
});

为我工作。

答案 2 :(得分:5)

casper.start('about:blank');

var urls = ['http://google.fr', 'http://yahoo.fr', 'http://amazon.fr'];

casper.each(urls, function(casper, url) {
  casper.thenOpen(url, function() {
        this.echo("I'm in your " + url + ".");
    });
});

答案 3 :(得分:2)

就我而言,我不得不刮掉一个页面数量不明的网站。每个页面(最后一个除外)都有一个<a class="next-page" href="/page/N">Next page</a>链接(其中N是页码)。刮刀无法知道它什么时候完成,除非“刮刀”下一页&#34;链接不再存在。

当然,您必须根据网页上可能存在的分页链接类型进行调整。

这就是我的所作所为。因人而异。

// imports
var fs = require('fs');

// scraper state
var state = {page: 1, data: []};

// casper
var casper = require("casper").create();

// scraper function
function scrape() {
  this.echo('Scraping page ' + state.page + '...', 'INFO');

  state.data = state.data.concat(this.evaluate(function() {
    // get some stuff from the page
    return someData;
  });

  var nextUrl = this.evaluate(function() {
    var nextLink = document.querySelector("a.next-page");
    return nextLink && nextLink.href;
  });

  if (nextUrl) {
    state.page = state.page + 1;
    casper.thenOpen(nextUrl, scrape); // <- recursion
  }
});

// run
casper.run(function() {
  fs.write('./data.json', JSON.stringify(state.data, null, '\t'), 'w');
  this.echo('Done!', 'INFO');
});

希望这有助于某人。如果您有其他问题,我会很乐意尝试提供帮助。

答案 4 :(得分:1)

casper.start();
casper.each(Object.keys(array), function(casper, array_elem) {
    this.thenOpen(partialURL+array[attay_item], function() {
        ...
};

至于&#34; undefined&#34;错误。尽量不要使用太多。我经常遇到CasperJS的这个错误,所以我更喜欢写casper而不是这个。

答案 5 :(得分:0)

尝试这样的事情。

var x;

casper.start(URL, function() {
    x = links.split(" "); // now x is an array of links
});

casper.then(function() {
    this.eachThen(x, function(response) {
        this.thenOpen((partialURL + response.data), function() {
            this.echo(this.getTitle()); // display the title of page
        });
    });
});

casper.run();

x未定义,因为for循环正在casper.start之前执行。 在上面的代码中,eachThen()块嵌套在casper.then块内,以便延迟执行。

答案 6 :(得分:0)

我用这段代码解决了同样的问题:

casper.then(function () {
    var i = -1;
    this.eachThen(locations, function () {
        i++;
        //Do stuff here like for example:
        this.thenOpen(YOUR_URL, function () {
            this.waitForSelector("MYSELECTOR", 
            function () {

            },                
            function () {

            })
        });
    })
});