2012-06-29 4 views
16

thời gian gần đây tôi sẽ kiểm tra phantomJS chạy từ python như một đối số dòng lệnh, tôi đã không có vòng để nó được nêu ra nhưng đã thấy ví dụ. Bởi vì PhantomJS được chạy từ dòng lệnh, điều này có vẻ là có thể. Kết quả mà PhantomJS sẽ nhổ ra sẽ đi thẳng vào một biến.Có thể chạy PhantomJS từ Node.js như một đối số dòng lệnh

Trước khi tôi đi xuống con đường đó, làm cho công việc này trong node.js thực sự hữu ích hơn cho tôi và tôi nghĩ, tôi có thể sử dụng nút để chạy PhantomJS như một chương trình được chạy từ dòng lệnh và lưu trữ kết quả dữ liệu mà PhantomJS thường nhổ ra thành một biến?

Tôi không muốn sử dụng phantomjs-node bởi vì nó dường như được sử dụng quá nhiều thủ đoạn.

Lý do cho tất cả những điều này là để có thể chạy PhantomJS cùng một lúc như một hành động chương trình sẽ đưa và sử dụng dữ liệu kết quả của nó được ghi nhận cho một số công cụ khác.

một cách đơn giản, bạn có thể chạy dòng lệnh hệ thống công cụ trong python, tôi có thể làm điều tương tự trong Node.js?

Cheers :)

Edit: Tôi hiểu rằng nút và phantom sử dụng môi trường js khác nhau, đó là mát mẻ bởi vì tôi chỉ muốn chạy phantom như quá trình riêng của mình và bắt tất cả những gì dữ liệu đầu ra vào một biến Node.js (các dữ liệu sẽ là một mảng của một cặp, chuỗi và điểm nổi.) Tôi không muốn 'lái xe' với phantom, tôi sẽ craft các tập tin javascript tải todo những gì tôi muốn. Tất cả những gì tôi muốn là đầu ra phantom. :)

+1

Hầu hết mọi người dường như được sử dụng [ 'child_process.spawn'] (http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) để đạt được điều này. 'child_process' là một mô-đun node.js chuẩn ổn định, có thể nó không phải lúc bạn hỏi - node.js di chuyển khá nhanh. – hippietrail

Trả lời

14

Tôi cho rằng bạn có thể tạo một tập lệnh đơn giản để Node.js chạy; trong tập lệnh đó, tập lệnh phantomjs sẽ được chạy dưới dạng tiến trình con. Bạn có thể xem ví dụ làm việc (và liên kết cho một số tài liệu) in this answer. Tôi cho rằng this discussion cũng có thể hữu ích cho bạn.

+0

Tôi sẽ đi qua hai liên kết và có vẻ như họ đang trực tiếp giải quyết câu hỏi của tôi. Chúc mừng :) – Joseph

+0

Đối với những người quá lười biếng để nhấp qua, một trong các liên kết đề cập đến https://github.com/sgentle/phantomjs-node mà bạn quan tâm. – MarkHu

18

Từ NPM: https://npmjs.org/package/phantomjs

var path = require('path') 
var childProcess = require('child_process') 
var phantomjs = require('phantomjs') 
var binPath = phantomjs.path 

var childArgs = [ 
    path.join(__dirname, 'phantomjs-script.js'), 
    'some other argument (passed to phantomjs script)' 
] 

childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) { 
    // handle results 
}) 
5

Để thay thế cho câu trả lời Donald Derek, bạn có thể sử dụng chức năng spawn. Nó sẽ cho phép bạn đọc đầu ra của tiến trình con ngay khi nó được tạo ra thay vì đầu ra được đệm và trả lại cho bạn tất cả cùng một lúc.

Bạn có thể đọc thêm về nó here.

Một ví dụ từ the documentation.

var spawn = require('child_process').spawn, 
    ls = spawn('ls', ['-lh', '/usr']); 

ls.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

ls.stderr.on('data', function (data) { 
    console.log('stderr: ' + data); 
}); 

ls.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 
+1

làm thế nào bạn sẽ chạy cho phép nói một máy chủ ExpressJS địa phương VÀ đẻ trứng một quá trình phụ cho ma, Casper, vv? Giống như nếu tôi đi đến dấu nhắc lệnh và chạy server.js của tôi có máy chủ tốc hành của tôi và khởi động nó, thì làm thế nào để bạn gọi sinh sản của tiến trình con sau khi bạn khởi động máy chủ ban đầu đó? – PositiveGuy