phantomstream

Streaming interface to the PhantomJS headless browser

npm install phantomstream
2 downloads in the last month

phantomstream

Write and automate PhantomJS scripts inside node, using a standard Stream interface.

Getting Started

First off, install the phantomstream module.

npm install phantomstream

Next, create a simple script named "myscript.js".

phantomstream = require("../phantomstream")

// Open up a PhantomJS stream that listens for commands that look like
// "TITLE <url>". Browse to the URL and write the title back via the stream.
var conf = {logger: console}
var ps = phantomstream.open(conf, function(nodestream, phantom, require, global) {

  // This callback executes inside of PhantomJS, not node.  To see the API
  // available to you in PhantomJS, check out their documentation:
  // http://code.google.com/p/phantomjs/wiki/Interface
  var page = require("webpage").create()

  // Listen for the "TITLE <url>" commands via the streaming interface.
  nodestream.on("data", function(data) {
    var matches = /TITLE\s*(.+)/.exec(data)
    if (matches) {
      var url = matches[1]

      // Got a TITLE command, use the PhantomJS page object to browse
      // to that page, get the document title, and write it back to the stream.
      console.info("opening", url)
      page.open(url, function() {
        var title = page.evaluate(function() {
          return document.title
        })
        console.info("sending title =", title)
        nodestream.write(title)
      })
    }
  })

})

// Send an TITLE command to our PhantomJS process and echo the response.
ps.write("TITLE http://www.google.com")
ps.on("data", function(data) {
  console.info("node received:", data.toString())
  process.exit()
})

Run your script with node.

node myscript.js

...you should see output like this:

[phantom-stdout] opening http://www.google.com
[phantom-stdout] sending title = Google
node received: Google

Enjoy! For more ideas on what is possible inside the callback for phantomstream.open(), read the PhantomJS documentation.

Don't forget try out some demos from the examples/ directory :)

Alternatives

If you are looking for higher-level implementations that wrap the PhantomJS API, check these out:

npm loves you