如何将函数传递给Node Horseman的`evaluate`函数?

时间:2016-06-19 20:05:39

标签: javascript node.js web-scraping web-crawler

使用Node Horseman,我们可以在Node内部使用PhantomJS。如果我们想在页面的上下文中执行一段JS代码,我们按如下方式执行:

var Horseman = require('node-horseman');
var horseman = new Horseman();

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            // Js Code goes here
        })
        .close();

现在,假设我们想从外面传递一些东西""评估功能。例如,如果我执行以下操作

var Horseman = require('node-horseman');
var horseman = new Horseman();

function someFunction() {}

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            someFunction();
        })
        .close();

当我在评估中调用someFunction时,找不到它。

另一个例子,假设我做了以下

var Horseman = require('node-horseman');
var url = require('url');
var horseman = new Horseman();

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            // try to use url somehow here
        })
        .close();

它也没有识别那里的url对象。我确实理解了这个问题,代码是在页面的上下文中运行的。但是有没有办法从外部传递这些东西,以便我们可以在评估中使用它们?

2 个答案:

答案 0 :(得分:0)

你对在页面上下文中运行的代码是正确的。您可以将其视为打开浏览器的控制台并将其中的所有内容粘贴到评估功能中。

如果将 someFunction()粘贴到控制台中,JS运行时将抛出错误: someFunction未定义。那是因为它从未在页面的上下文中定义。

实际上有一种从外部传递函数的解决方法,但只有当函数不依赖于节点上下文中的其他函数和全局对象时,它才会起作用。

以下是一个例子:

function someFunction() {
    return document.title;
}

horseman.open('http://google.com')
    .evaluate(function (someFunction) {
        eval('var sf = ' + someFunction);
        return sf();
    }, someFunction.toString())
    .log() //Will print out "Google"
    .close();

url实际上是一个node.js模块。您可以尝试将其替换为任何类似的客户端JS库,然后使用以下命令之一注入它:

horseman
    .injectJs(file)

horseman
    .includeJs(url)

答案 1 :(得分:0)

解决:

.evaluate(fn, [arg1, arg2,...])