我有一个自定义的phantomJS程序,我用PhantomJS PHP Library打电话。在他的程序中,我想加载内容并提取渲染页面的一些信息。
从命令行调用过程并记录"找到的信息" exectration工作正常。到控制台。但是现在我想在我的php脚本中获取这些信息以便进一步处理。
如何将过程中的信息返回到调用php脚本?
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();
}
});
答案 0 :(得分:0)
我说这是对图书馆的极端使用,目的只是
通过PhantomJS无头浏览器加载页面并返回页面响应。
模板设计为设置参数,同时您尝试在那里实现某些逻辑。
如果你真的需要这样做,你可以使用未记录的response
对象。分配给response
(js过程)的属性将在$response
后的$client->send($request, $response);
(php)中提供:
// procedure js:
response.test = 18;
// php:
echo $response->get('test'); // prints 18
了解它在默认模板中的使用方式,例如: here
答案 1 :(得分: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);