【问题标题】:Installing/Using Phantom.js with Meteor使用 Meteor 安装/使用 Phantom.js
【发布时间】:2014-05-22 16:14:10
【问题描述】:

我目前正在努力将 Phantom.js 与我的 Meteor 应用程序一起使用。我已将它安装在我的本地计算机(Ubuntu 14.04)上,它已添加到我的路径中(我可以从我的终端运行它),我还运行并安装了 Phantomjs 的智能包装器:mrt add phantomjs

我可以看到在我的.meteor > local > build > programs > server > npm 目录中有一个phantomjs 目录。

我的问题是,我如何实际使用 Phantom?我正在尝试从服务器端抓取东西。我尝试了以下事情(使用coffeescript): phantom = Npm.require "phantomjs" phantom = Npm.require "phantom" phantom = Meteor.require "phantomjs" phantom = Meteor.require "phantom"

(我也尝试过使用大写“P”)

以这种方式进行的所有尝试都会产生:Error: Cannot find module 'phantomjs'

任何澄清将不胜感激!

【问题讨论】:

  • 您是否安装它以与可爬取软件包一起使用?如果是这样,那么它只需要在 PATH 上,这样它就可以用于为机器人创建页面(更多内容在 manuel-schoebel.com/blog/meteor-and-seo 中进行了解释)。
  • 我不是。我只是用它来做一些抓取。

标签: meteor phantomjs


【解决方案1】:

[编辑] 现在流星支持开箱即用的 npm 包:https://guide.meteor.com/using-npm-packages.html#installing-npm


这是 Meteor > 1.0.0 的过程

添加 npm 包

meteor add meteorhacks:npm

运行meteor让npm包预初始化

meteor

在根目录下创建了一个文件 packages.json。将其编辑为:

{
  "phantomjs": "1.9.13"
}

在你的服务器端代码中使用幻象:

var phantomJS = Meteor.npmRequire("phantomjs");

红利:使用示例(感谢 Ben Green),可将其放在代码中的任何位置:

if (Meteor.isServer) {
    Meteor.startup(function () {
        var phantomjs = Meteor.npmRequire('phantomjs');

        var spawn = Meteor.npmRequire('child_process').spawn;
        Meteor.methods({
            runTest: function (options) {
                command = spawn(phantomjs.path, ['assets/app/phantomDriver.js']);
                command.stdout.on('data', function (data) {
                    console.log('stdout: ' + data);
                });
                command.stderr.on('data', function (data) {
                    console.log('stderr: ' + data);
                });
                command.on('exit', function (code) {
                    console.log('child process exited with code ' + code);
                });
            }
        });

        Meteor.call("runTest");// run the test as soon as meteor server starts
    });
}

创建phantomjs脚本文件./private/phantomDriver.js并将其编辑为

var page = require('webpage').create();
page.open('http://github.com/', function (){
    console.log('Page Loaded');
    page.render('github.png');
    phantom.exit();
});

【讨论】:

  • 我认为你应该在 /private/phantomDriver.js 中创建 phantomjs 脚本文件。
  • @MaximusS,假设我刚刚从我的流星目录启动应用程序,你的路径与我写的完全一样。前导点代表当前工作目录,在这种情况下是流星应用程序文件夹。 (不要与文件或目录名称前的前导点混淆,目的是隐藏最后一个)
  • 啊,我明白了。您是否有使用spiderable 包的经验?
  • 另一个快速的问题弗拉维恩。即使这样安装,也必须手动将幻像添加到 PATH 中吗?
  • @MaximusS 我不是专家,但我猜 meteorhacks:npm 会将包安装在同一个地方 Meteor.npmRequire('phantomjs');可以找回来。如果您需要您的网站可抓取,请查看here。如果您需要在生产服务器(包括 PhantomJS)上安装所有内容,请使用 MUP 和 Ubuntu 发行版。或者,如果您喜欢冒险,Docker + MUP
【解决方案2】:

大气中的 phantomjs 包装器看起来并不产生任何有效的东西。

但您可以使用 npm meteorite package 轻松添加 npm 包

首先将 npm 包添加到你的项目中

mrt add npm

然后将需要的phantomjs版本添加到packages.json文件中

{
     "phantomjs": "1.9.7-6"
}

然后使用下面的代码来 require phantomjs npm 模块:

var phantomjs = Meteor.require('phantomjs');

【讨论】:

  • 这绝对让我拥有了正确的轨道!我之前用过那个方法,指向phantom而不是phantomjs。非常感谢。
  • 不客气,顺便说一句,我在您的其他评论中读到您将进行一些刮擦。如果您使用 ajax 抓取不加载额外内容的静态网站,请务必查看cheerio。 npmjs.org/package/cheerio
  • ya 用于报废 phantom 使其变得容易,但也更重。 Cheerio 和 request 是最好的灯光组合。
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多