Comment utiliser Casperjs dans Node.js?
Question
Je voudrais utiliser Casperjs dans Node.js.
J'ai fait référence aux URL suivantes pour utiliser Casperjs dans Node.js:
À l'aide des URL ci-dessus, j'ai écrit le code suivant:
//DISPLAY=:0 node test2.js
var phantom = require('phantom');
console.log('Hello, world!');
phantom.create(function (ph) {
ph.casperPath = '/opt/libs/casperjs'
ph.injectJs('/opt/libs/casperjs/bin/bootstrap.js');
var casper = require('casper').create();
casper.start('http://google.fr/');
casper.thenEvaluate(function (term) {
document.querySelector('input[name="q"]').setAttribute('value', term);
document.querySelector('form[name="f"]').submit();
}, {
term: 'CasperJS'
});
casper.then(function () {
// Click on 1st result link
this.click('h3.r a');
});
casper.then(function () {
console.log('clicked ok, new location is ' + this.getCurrentUrl());
});
casper.run();
});
Lorsque j'exécute ce code, j'ai obtenu l'erreur suivante:
Erreur MSG:
tz@tz-ubuntu:/opt/workspaces/TestPhantomjs$ DISPLAY=:0 node test2.js
Hello, world!
Error: Cannot find module 'casper'
at Function._resolveFilename (module.js:332:11)
at Function._load (module.js:279:25)
at Module.require (module.js:354:17)
at require (module.js:370:17)
at /opt/workspaces/TestPhantomjs/test2.js:6:14
at Object.<anonymous> (/opt/workspaces/TestPhantomjs/node_modules/phantom/phantom.js:82:43)
at EventEmitter.<anonymous> (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode/index.js:215:30)
at EventEmitter.emit (events.js:67:17)
at handleMethods (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode-protocol/index.js:138:14)
at EventEmitter.handle (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode-protocol/index.js:98:13)
phantom stdout: Unable to load casper environment: Error: Failed to resolve module fs, tried fs
La solution 2
Nicolas Perriault
2012/2/27 天猪 蓝虫. :
Je veux utiliser les casperjs dans Nodejs. et refs à: https://github.com/sgentle/phantomjs-node et http://casperjs.org/index.html#faq-execuable
Vous ne pouvez pas exécuter Casperjs de cette façon; Qtwebkit et V8 ne partagent pas le même environnement JS (et boucle d'événements), donc votre application Node.js ne pourra pas charger et utiliser un module Casperjs. Vous devez exécuter votre script Casperjs séparément à l'aide d'un appel de sous-processus, comme celui-ci sur github. Je n'ai pas l'intention de rendre les casperjs compatibles avec Phantomjs-node car il utilise
alert()
-Les hacks sales basés avec lesquels je ne suis pas facile.Bravo, - Nicolas Perriault
Autres conseils
Vous pouvez utiliser Spookyjs Pour conduire Casperjs à partir du nœud.
Casperjs comprend un serveur Web pour parler au monde extérieur. Nœud (en utilisant request
, superagent
etc) peut maintenant parler à Casper sur HTTP.
Dans scraper.js
:
#!/usr/bin/env casperjs
// I AM NOT NODEJS
// I AM CASPER JS
// I RUN IN QTWEBKIT, NOT V8
var casper = require('casper').create();
var server = require('webserver').create();
var ipAndPort = '127.0.0.1:8585';
server.listen(ipAndPort, function(request, response) {
casper.start('https://connect.data.com/login');
casper.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36");
casper.then(function(){
// lots of code here, and a few more cassper.then()s
});
casper.run(function(){
console.log('\n\nFinished')
response.statusCode = 200;
var body = JSON.stringify({
phoneNumber: '1800-YOLO-SWAG'
})
response.write(body);
response.close();
});
});
Vous pouvez maintenant courir scraper.js
En tant que serveur Web:
chmod +x scraper.js
./scraper.js
Tu devrais Exécutez-le comme un service Linux comme vous le feriez pour une application de nœud.
Une solution (qui a fonctionné pour moi) consiste à démarrer et à arrêter votre serveur par test. Par exemple, j'ai un runtests.coffee
qui ressemble:
http = require 'http'
glob = require 'glob'
spawn = require('child_process').spawn
db = require './db' # Contains all database stuff.
webapp = require './webapp' # Contains all of the Express stuff.
db.connect 'test' # Connects to the db server and creates an empty test db.
server = http.createServer webapp.makeApp()
server.listen 0, ->
port = server.address().port
process.env.URL = "http://localhost:#{ port }"
glob 'tests/*', (err, filenames) ->
child = spawn 'casperjs', ['test'].concat(filenames)
child.stdout.on 'data', (msg) -> process.stdout.write msg
child.stderr.on 'data', (msg) -> process.stderr.write msg
child.on 'exit', (code) ->
db.disconnect() # Drops the test db.
server.close()
process.exit code
Et mes tests Casperjs tests/
ressembler:
URL = require('system').env.URL # Note, Casper code here, not Node.
casper.test.begin 'Test something', 1, (test) ->
casper.start "#{ URL }/welcome"
casper.then ->
test.assertHttpStatus 200
# ....
casper.run ->
test.done()
Cela signifie essentiellement que votre script ne peut pas trouver Casper; Avez-vous vérifié le chemin et vous êtes-vous assuré que
/opt/libs/casperjs
et:
/opt/libs/casperjs/bin/bootstrap.js
Sont accessibles par un utilisateur de site Web? Compte tenu de l'emplacement, ce n'est probablement pas probable. / Opt est un chemin Unix, mais le site Web cherchera dans {WebsiterootPath} / opt.
Je créerais un sous-dossier «Casperjs» dans le dossier racine de votre site Web et copierait le contenu de
/opt/libs/casperjs
À là. Puis changez vos chemins de
/opt/libs/casperjs
À
/casperjs
J'ai essayé d'exécuter Casper par Node Cron Job aussi, voici ma solution
Dans Casper.js, écho à votre réponse:
casper.then(function() {
var comments = this.evaluate(getComments);
this.echo(JSON.stringify(comments));
})
Utilisez le nœud-cmd dans le fichier de nœud Casper_wrapper.js:
var cmd = require('node-cmd');
module.exports = function(url) {
return new Promise(function(resolve, reject) {
cmd.get(
'casperjs casper.js ' + url, // casper takes args to run the script
function(err, data, stderr){
if (err) {
reject(err);
return;
}
var obj = JSON.parse(data);
resolve(obj);
}
);
});
}