Looping sobre urls para hacer lo mismo

Estoy tratando de robar algunos sitios. Aquí está mi código:

for (var i = 0; i < urls.length; i++) { url = urls[i]; console.log("Start scraping: " + url); page.open(url, function () { waitFor(function() { return page.evaluate(function() { return document.getElementById("progressWrapper").childNodes.length == 1; }); }, function() { var price = page.evaluate(function() { // do something return price; }); console.log(price); result = url + " ; " + price; output = output + "\r\n" + result; }); }); } fs.write('test.txt', output); phantom.exit(); 

Quiero eliminar todos los sitios en las direcciones URL de la matriz, extraer cierta información y luego escribir esta información en un archivo de texto.

Pero parece haber un problema con el bucle for. Al raspar solo un sitio sin usar un bucle, todo funciona como quiero. Pero con el ciclo, primero no pasa nada, luego la línea

 console.log("Start scraping: " + url); 

se muestra, pero una vez demasiado. Si url = {a, b, c}, entonces phantomjs hace:

 Start scraping: a Start scraping: b Start scraping: c Start scraping: 

Parece que page.open no se llama en absoluto. Soy novato de JS, así que lo siento por esta estúpida pregunta.

    PhantomJS es asincrónico. Llamando a page.open() varias veces usando un bucle, esencialmente apresura la ejecución de la callback. Está sobrescribiendo la solicitud actual antes de que finalice con una nueva solicitud que luego se sobrescribe. Debe ejecutarlos uno después de otro, por ejemplo, de esta manera:

     page.open(url, function () { waitFor(function() { // something }, function() { page.open(url, function () { waitFor(function() { // something }, function() { // and so on }); }); }); }); 

    Pero esto es tedioso Hay utilidades que pueden ayudarte a escribir un código más agradable como async.js . Puede instalarlo en el directorio del script phantomjs a través de npm.

     var async = require("async"); // install async through npm var tests = urls.map(function(url){ return function(callback){ page.open(url, function () { waitFor(function() { // something }, function() { callback(); }); }); }; }); async.series(tests, function finish(){ fs.write('test.txt', output); phantom.exit(); }); 

    Si no quiere ninguna dependencia, entonces también es fácil definir su propia función recursiva (desde aquí ):

     var urls = [/*....*/]; function handle_page(url){ page.open(url, function(){ waitFor(function() { // something }, function() { next_page(); }); }); } function next_page(){ var url = urls.shift(); if(!urls){ phantom.exit(0); } handle_page(url); } next_page();