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 8

7 ответов:

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();
var i = 0;
var nTimes = x.length;

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

Работал на меня.

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 + ".");
    });
});

В моем случае я должен был очистить сайт, который имел неизвестное количество страниц. На каждой странице (кроме последней) была ссылка <a class="next-page" href="/page/N">Next page</a> (где N - номер страницы). Скребок никак не мог узнать, когда он был закончен, кроме тех случаев, когда ссылка "Следующая страница" больше не присутствовала.

Конечно, вам придется внести коррективы в зависимости от того, какой тип ссылок на страницы может существовать на Вашей странице.

Вот что я сделал. Ymmv.

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

Надеюсь, это кому-то поможет. Если у вас есть другие вопросы, я буду рад попытаться помочь.

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

А что касается" неопределенной " ошибки. Постарайтесь не использовать это слишком много. Я часто испытываю эту ошибку с CasperJS to, поэтому я предпочитаю писать casper вместо этого.

Попробовать что-то вроде этого.

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, чтобы задержать его выполнение.

Я решил ту же проблему с этим кодом:

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 () {

            })
        });
    })
});