2016-11-04 2 views
0
var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }); 
var fs = require('fs'); 
vo = require('vo'); 
var result; 
nightmare 
    .goto('http://jufa-kyusyu.jp/teams/') 
    .wait(1000) 
    .evaluate(function() { 
    var options = document.querySelectorAll('option'),i; 
    var values =[] 
    for (i = 0; i < options.length; ++i) { 
     values.push(options[i].value) 
     } 
     return values; 
    }) 
    .then(function (values) { 
     for (var i = 0; i < values.length; i++) { 
     if(values[i] == "#") values[i] = "/teams/181.html"; 
    nightmare 
     .goto("http://www.jufa-kyusyu.jp"+values[i]) 
     .evaluate(function() { 
     var abc =  document.querySelector('iframe[class="autoHeight"]').src.toString() 
     return abc; 
    }) 
     .then(function (result) { 
console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    });} 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

Je veux Scrapy l'information sur le Web par nightmarejs looply.I ne sais pas pourquoi ont deux lien résultat est le même et le résultat est changé en cours d'exécution à chaque fois. Je vous remercie.web scrapy par cauchemar à propos de la boucle, la sortie n'est pas même à chaque fois

Répondre

0

Vous devez être prudent lorsque vous travaillez avec des appels asynchrones dans une boucle avec Nightmare

Vérifiez this answer et this explication détaillée du concept.

L'idée principale peut être sumarized par cette phrase:

L'exécution des opérations en série nécessite les arranger pour exécuter dans un ordre séquentiel

La documentation montre comment atteindre cet using plain, vanilla js et aussi with vo

Voici un aperçu sur la façon de résoudre ce problème de boucle avec plaine Javascript:

var urls = ['http://example1.com', 'http://example2.com', 'http://example3.com']; 
urls.reduce(function(accumulator, url) { 
    return accumulator.then(function(results) { 
    return nightmare.goto(url) 
     .wait('body') 
     .title() 
     .then(function(result){ 
     results.push(result); 
     return results; 
     }); 
    }); 
}, Promise.resolve([])).then(function(results){ 
    console.dir(results); 
}); 

Fondamentalement, ce que vous devez faire est de la file d'attente tous vos appels dans une liste et les déclencher en utilisant Promise.resolve

+0

merci beaucoup ... –