2017-09-23 6 views
0

J'essaie d'utiliser le serveur web pour parler au monde extérieur et setInterval veut que son exécution soit automatique de temps en temps.Comment réglerInterval correct dans casperjs?

Un de mes paramètre casperjs est this.capture(x + 'apple.png');

Je pensais qu'il affichera trois images sous mon dossier si setInterval courir trois fois. Par conséquent, je ne sauvegarde qu'une seule image: 1apple.png.

Bien que je peux voir un bon nombre d'informations sur mon terminal enter image description here

Je veux demander quelle étape dois-je manquer? Toute aide serait appréciée. Merci d'avance.

Voici mon code today.js:

var webserver = require('webserver'); 
var server = webserver.create(); 
var service = server.listen('8080', { 
    'keepAlive': true 
}, function (request, response) { 
    response.statusCode = 200; 
    response.write('<html><body>What the hell~~</body></html>'); 
    var casper = require("casper").create({ 
     verbose: true, 
     logLevel: 'debug',  // debug, info, warning, error 
     pageSettings: { 
      loadImages: false, 
      loadPlugins: false, 
      userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4' 
     } 
    }); 

    var movieTitle = []; 
    var movieEnTitle = []; 
    var title = []; 
    var movieTime = []; 
    var movieVersion = []; 
    var city = '台南'; 
    var latitude = 22.993089; 
    var longitude = 120.196876; 
    var theaterName = '今日戲院'; 
    var data = {}; 
    data.theater = []; 
    data.movie = []; 
    var x =1; 

    function getMovieTitle() { 
     var title = document.querySelectorAll('div.theaterlist_name a'); 
     return Array.prototype.map.call(title, function (e) { 
      return e.innerText; 
     }); 
    }; 

    function getEnTitle() { 
     var title = document.querySelectorAll('div.en a'); 
     return Array.prototype.map.call(title, function (e) { 
      return e.innerText; 
     }); 
    }; 

    function getMovieTime() { 
     var title = document.querySelectorAll('ul.theater_time'); 
     return Array.prototype.map.call(title, function (e) { 
      return e.innerText; 
     }); 
    }; 

    function getMovieVersion() { 
     var version = document.querySelectorAll('div.tapR'); 
     return Array.prototype.map.call(version, function (e) { 
      return e.innerText; 
     }); 
    }; 

    // 台南 今日戲院 from 奇摩 
    casper.start('https://tw.movies.yahoo.com/theater_result.html/id=67', function() { 
     this.echo(this.getTitle()); 
    }); 

    casper.then(function() { 
     this.echo('Image'); 
     this.echo(x); 
     this.capture(x + 'apple.png'); 
     x++; 
    }); 

    casper.then(function() { 
     movieTitle = this.evaluate(getMovieTitle); 
     movieEnTitle = this.evaluate(getEnTitle); 
     movieTime = this.evaluate(getMovieTime); 
     movieVersion = this.evaluate(getMovieVersion); 
    }); 

    casper.then(function() { 
     console.log('Print:\n'); 
     this.echo(movieTitle.length + ' Movie title found :\n'); 
     this.echo(movieTitle.join('\n')); 
     this.echo(movieEnTitle.length + ' Movie title found :\n'); 
     this.echo(movieEnTitle.join('\n')); 
     this.echo(movieTime.length + ' Movie time found :\n'); 
     this.echo(movieTime.join('\n')); 
     this.echo(movieVersion.length + ' Movie version found :\n'); 
     this.echo(movieVersion.join('\n')); 

     this.echo(outPutJSON()); 
    }); 

    function outPutJSON() { 

     data.theater.push({ 
      name: theaterName, 
      city: city, 
      latitude: latitude, 
      longitude: longitude 
     }); 

     // 將中英文名字合併 
     for (var i = 0; i < movieTitle.length; i++) { 
      title.push(movieTitle[i] + movieEnTitle[i]); 
     } 
     for (var i = 0; i < movieTime.length; i++) { 
      var name = title[i]; 
      var sourceTime = movieTime[i].match(/.{1,5}/g); 
      var times = []; 
      times.push(sourceTime); 
      var version = movieVersion[i]; 

      data.movie.push({ 
       name: name, 
       version: version, 
       time: times 
      }); 
     } 
     return JSON.stringify(data); 
    } 

    // casper.run(function() { 
    //  // this.echo('Done').exit(); 
    //  this.echo('Done');  
    // }); 

    setInterval(function() { 
     casper.run(function() { 
      // this.echo('Done').exit(); 
      this.echo('Done');  
     }); 
    }, 2000); 

    response.write(outPutJSON()); 
    response.close(); 
}); 

Voici mon dossier quand je prescris ce fichier, vous pouvez voir que l'image de capture une fois 1apple.png. enter image description here

Répondre

1

Une façon d'obtenir ce que vous voulez serait avoir un emploi cron racler le site à la fréquence désirée et de mettre les résultats dans un répertoire par un serveur Web. Voici un script autonome qui récupérera le titre et capturera l'image d'un site une fois par heure. Modification this.step est probablement pas sage (l'inspiration de ce site: https://github.com/yotsumoto/casperjs-goto)

var casper = require('casper').create(); 
var x = 0; 

casper.start('http://localhost:8080', function() { 
// change 'http://localhost:8080' to the site to be scraped 
    this.echo(this.getTitle()); 
    this.capture(x++ + '.png'); 
    this.wait(60 * 60 * 1000, function() { 
// 60 minutes * 60 seconds * 1000 milliseconds 
    this.step = 0; 
    }); 
}); 

casper.run(); 
+0

Merci pour votre réponse, je mets à jour la question de montrer ce que je veux. J'ai mis une certaine fonction après casper.start, ma question est pourquoi setInterval ne fonctionne pas encore this.capture? –

+1

Merci pour la mise à jour, mais je ne suis toujours pas sûr de comprendre ce que votre code essaie de faire. Essayez-vous d'aller chercher une page web et de la capturer toutes les 2 secondes? Quel est le but du serveur Web enroulé autour de l'invocation de casperjs? – davejagoda

+0

OK, 2 secondes est juste un test, vraiment ce que je veux peut-être une ou deux heures. La fonction this.capture (x + 'apple.png'); est après casper.start. Quand je parle au serveur Web j'obtiendra un png toutes les heures. Comme 1apple.png, 2apple.png, 3apple.png comme ça ... Mais dans mon code je reçois seulement 1apple.png. C'est juste comme mon dossier de projet. –