2016-10-29 1 views
-1

Ich versuche, einen Schaber zu programmieren, der eine Reihe von Keywords laden und sie auf Amazon suchen wird. Ich muss dann das Schlüsselwort verwenden und auf der Seite suchen, um zu sehen, wie viele Instanzen es gibt.Anfrage erhalten, Schleifen und Senden von Daten außerhalb Anforderung in Node.js

Ich habe gesucht und Leute gesehen, die den Begriff asynchrone Funktion und Rückruf verwenden, aber ich weiß nicht, was diese bedeuten und jedes Mal ist die Erklärung über meinen Kopf. Ich habe versucht, diese Begriffe zu googeln und ich verstehe es immer noch nicht.

Hier ist mein Code und offensichtlich funktioniert es nicht. Wenn es eine einfache Möglichkeit gibt, das zu erreichen, was ich mit meinem derzeitigen Wissen zu tun versuche, wäre das großartig.

// load modules 
var request = require('request'); 
var cheerio = require('cheerio'); 

//split into array 
keywords = ["books", "bags", "shoes"]; 

// loop task for every keyword 
global.i 
for (i = 0; i < keywords.length; i++) { 
console.log(keywords[i] + " was loaded."); 

// get request 
request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i], function (error, response, html) { 
    if (!error && response.statusCode == 200) { 
    var $ = cheerio.load(html); 

    // try to use the keyword (doesn't work) 
    console.log(keywords[i]); 

    } // end get request 
}); // get request end 

// Try to use the html outside get request (doesn't work) 
console.log(html); 

} // loop end 
+0

Variable html innerhalb der Callback-Funktion der Anfrage verwenden Warum haben Sie versucht, für Loops zu verwenden, um alle Anfragen in der gleichen Zeit zu machen, kann Amazon Grenzen für Anfragen pro Sekunde Versuch muss man anfordern um eins mit Intervall. –

+0

Was sollte ich sonst noch benutzen? Es scheint so weit zu funktionieren, wenn ich es mit weniger als 1000 Keywords mache, was alles ist, was ich brauche. –

+0

Ich glaube nicht, dass Amazon erlaubt das –

Antwort

0

Von der Anfrage Sie nimmt zu antworten, der Server (hier Amazon) einige Zeit senden. Im Allgemeinen wären das weniger als 600 ms. Anstatt auf diese Zeitspanne zu warten, setzt javascript die Ausführung in der nächsten Zeile fort. Wenn Sie sich in dieser for-Schleife befinden, stellen Sie eine Anfrage., Script setzt die Ausführung fort. 2 weitere Anfragen werden gestellt. Also alle 3 Anfragen werden gemacht, auf Antwort wartend. in der Zwischenzeit wird die Ausführung in der nächsten Zeile fortgesetzt. Zu diesem Zeitpunkt ist die Variable html nirgendwo im Anwendungsbereich der Anwendung definiert. Also hat es Fehler geworfen. Selbst nachdem die 3 Antworten empfangen wurden, wird die Variable html nicht definiert, da sie innerhalb der Antwortfunktion beschränkt ist. Sie können wie unten

// load modules 
var request = require('request'); 
var cheerio = require('cheerio'); 

//split into array 
keywords = ["books", "bags", "shoes"]; 

// loop task for every keyword 
for (i = 0; i < keywords.length; i++) { 
    console.log("loading", keywords[i]); 

    // get request 
    request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i],  
     function (error, response, html) { 
      if (!error && response.statusCode == 200) { 
       var $ = cheerio.load(html); 
       console.log(keywords[i]); 
       console.log(html); 
      } 
     } 
    ); 
} 
Verwandte Themen