2

我有一个自定义的 phantomJS 程序,我用PhantomJS PHP Library调用它。通过他的程序,我想加载内容并提取渲染页面的一些信息。

从命令行调用过程并将“找到的信息”记录到控制台时,提取工作正常。但现在我想在我的 php 脚本中获取这些信息以便进一步处理。

如何从程序返回信息到调用 php-script?

PHP

$location = '/var/www/vhosts/boos/procs';

$serviceContainer = ServiceContainer::getInstance();

$procedureLoader = $serviceContainer->get('procedure_loader_factory')
    ->createProcedureLoader($location);

$client = Client::getInstance();
$client->getEngine()->setPath('/usr/local/share/phantomjs/bin/phantomjs');
$client->getEngine()->addOption('--web-security=false');
$client->setProcedure('extractor');
$client->getProcedureLoader()->addLoader($procedureLoader);

$request  = $client->getMessageFactory()->createRequest();
$request->setUrl('http://website.de');

$response = $client->getMessageFactory()->createResponse();

$client->send($request, $response);
// GIVE ME THE RESPONSE HERE

程序

var page = require('webpage').create();

// settings
page.settings.loadImages = false;
page.settings.localToRemoteUrlAccessEnabled = true;
page.settings.webSecurityEnabled = false;
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 FirePHP/4Chrome';
page.viewportSize = {
  width: 1440,
  height: 900
};

t = Date.now();

page.open('{{ input.getUrl() }}', function(status) {
  if (status == 'success') {
        // Evaluate page
        var links = page.evaluate(function() {
            // GET ALL LINKS FROM DOM 
        }

        // RETURN THE LINKS TO THE PHP SCRIPT

        phantom.exit();

  }
});
4

2 回答 2

0

我想说这是对图书馆的极端使用,它的目的只是

通过 PhantomJS 无头浏览器加载页面并返回页面响应。

模板旨在设置参数,而您正在尝试在那里实现一些逻辑。

如果您真的需要这样做,您可以使用未记录的response对象。您分配给response(js 过程) 的属性将在$response(php) 之后可用$client->send($request, $response);

// procedure js:
response.test = 18;

// php:
echo $response->get('test'); // prints 18

看看它是如何在默认模板中使用的,例如这里

于 2016-03-08T17:01:12.180 回答
0

我最近发布了一个让 PHP 访问浏览器的项目。在这里获取:https ://github.com/merlinthemagic/MTS

就像您当前使用的库一样,它也依赖于 PhantomJS。

下载和设置后,您只需使用以下代码:

$myUrl          = "http://website.de";
$windowObj      = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl);

//set the size of the window
$windowObj->setSize(1440, 900);

//now you can either retrive the DOM and parse it, like this:
$domData    = $windowObj->getDom();

//or you could write a function in javascript and then trigger it, like this:
$script = "function getLinks() {
                var array = [];
                var links = document.links;
                for(var i=0; i<links.length; i++) {
                    array.push(links[i].href);
                }
                return JSON.stringify(array);
            }";
//load the script on the page
$windowObj->loadJS($script);
//call the function
$scriptReturn   = $windowObj->callJSFunction("getLinks");
//convert the Json to an array of links
$linkArr        = json_decode($scriptReturn, true);
于 2016-06-11T15:18:09.577 回答