CasperJS – Comment ouvrir tous les liens dans un éventail de liens

J'essaie de faire en sorte que CasperJS ouvre tous les liens dans un array de liens. Je l'ai pour que, après avoir ouvert un lien, il affichera le titre de cette page. Pourtant, lorsque je l'exécute, rien n'est affiché.

Je peux utiliser une for loop pour afficher les liens et ça fonctionne parfaitement.

C'est le code de ce que je viens d'expliquer:

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

C'est une autre méthode que j'ai essayée:

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

Il dit que 'x' dans indéfini. Notez que je définis x comme une variable globale. Toute modification que vous pourriez faire serait excellente. Merci.

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

J'ai travaillé pour moi.

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

Dans mon cas, j'ai dû racler un site qui avait un nombre inconnu de pages. Chaque page (sauf la dernière) avait un <a class="next-page" href="/page/N">Next page</a> (où N est le numéro de page). Il n'y avait aucun moyen pour le racloir de savoir quand il était terminé, sauf lorsque le lien «Next Page» n'était plus présent.

Bien sûr, vous devrez effectuer des ajustements en fonction de quel type de liens de pagination pourrait exister sur votre page.

Voici ce que j'ai fait. 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'); }); 

J'espère que ça aide quelqu'un. Si vous avez d'autres questions, je serai heureux d'essayer d'aider.

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

Et quant à l'erreur "indéfinie". Essayez de ne pas utiliser trop cela. J'ai souvent cette erreur avec CasperJS, donc je préfère écrire casper au lieu de cela.

Essayez quelque chose comme ça.

 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 était indéfini parce que la boucle for était en cours d'exécution avant casper.start . Dans le code ci-dessus, le bloc eachThen() est imbriqué à l'intérieur d'un bloc casper.then afin de retarder son exécution.

J'ai résolu le même problème avec ce code:

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