一尘不染

通过page.evaluate传递参数

javascript

我正在使用PhantomJS
page.evaluate()进行抓取。我的问题是我传递到Webkit页面的代码是沙盒化的,因此无法访问我的主要幻象脚本的变量。这使得很难使抓取代码通用。

page.open(url, function() {
  var foo = 42;

  page.evaluate(function() {
    // this code has no access to foo
    console.log(foo);
  });
}

如何将参数推入页面?


阅读 1625

收藏
2020-05-01

共1个答案

一尘不染

我遇到了确切的问题。可以使用一些技巧,因为它page.evaluate也可以接受字符串。

有几种方法可以执行此操作,但是我使用了一个称为的包装器evaluate,该包装器接受其他参数以传递给必须在Webkit端进行评估的函数。您可以这样使用它:

page.open(url, function() {
  var foo = 42;

  evaluate(page, function(foo) {
    // this code has now has access to foo
    console.log(foo);
  }, foo);
});

这是evaluate()函数:

/*
 * This function wraps WebPage.evaluate, and offers the possibility to pass
 * parameters into the webpage function. The PhantomJS issue is here:
 * 
 *   http://code.google.com/p/phantomjs/issues/detail?id=132
 * 
 * This is from comment #43.
 */
function evaluate(page, func) {
    var args = [].slice.call(arguments, 2);
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}";
    return page.evaluate(fn);
}
2020-05-01