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