2016-11-04 1 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); 
    }); 

ich die Web-Informationen von nightmarejs looply.I nicht Scrapy wollen, warum haben zwei Ergebnis Link gleich ist und das Ergebnis geändert wird jedes Mal in läuft. Danke.web scrapy von Alptraum über Schleife, ausgegeben wird nicht immer gleich

Antwort

0

Sie müssen vorsichtig sein, wenn mit Asynchron-Anrufe innerhalb einer Schleife mit Albtraum

prüfen this answer und this detaillierte Erklärung über das Konzept zu arbeiten.

Die Hauptidee kann mit diesem Satz zusammenzufassen versucht werden:

die Operationen in Serie Ausführen erfordert sie die Anordnung in der angegebenen Reihenfolge

Die Dokumentation zeigt auszuführen, wie das using plain, vanilla js und auch erreichen with vo

Hier ist ein kleiner Vorgeschmack darauf, wie Sie dieses Problem lösen können mit 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); 
}); 

Im Grunde, was Sie brauchen, ist Ihre Anrufe alle tun Warteschlange sie in einer Liste und triggerbar Promise.resolve

+0

Ihnen danken sehr viel ... –

Verwandte Themen