Во время парсинга сайта обычного чтения файла или CURL'а может не хватить. Например, если нужно дождаться выполнения JavaScript кода на старице.
Для таких целей нам поможет phantomjs - это "безголовый браузер" (Headless Browser), по сути, это консольный браузер без экрана.
Библиотеку для работы с phantomjs в php выбрал от jonnnnyw: php-phantomjs
Проблемы при установке
По идее все должно быть просто, если в системе установлен composer , то от нас требуется только создать файл composer.json, с содержимым:
{
"require": {
"jonnyw/php-phantomjs": "4.*"
},
"config": {
"bin-dir": "bin"
},
"scripts": {
"post-install-cmd": [
"PhantomInstaller\\Installer::installPhantomJS"
],
"post-update-cmd": [
"PhantomInstaller\\Installer::installPhantomJS"
]
}
}
а затем выполнить:
но...
Первая проблема:
Composer выдал Fatal error: Uncaught TypeError: Argument 3 passed to Composer\Downloader\Download Manager::download().
Решение, которое мне помогло, откатить composer второй версии до первой:
после установи не забудьте вернуть вторую версию:
Вторая проблема:
php код выдавал пустой ответ от phantomjs.
Код:
<?php
require_once ('vendor/autoload.php');
use JonnyW\PhantomJs\Client;
$client = Client::getInstance();
//$client->getEngine()->setPath('bin/phantomjs');
/**
* @see JonnyW\PhantomJs\Http\Request
**/
$request = $client->getMessageFactory()->createRequest('https://oddler.ru/', 'GET');
$request->setTimeout(10000);
/**
* @see JonnyW\PhantomJs\Http\Response
**/
$response = $client->getMessageFactory()->createResponse();
// Send the request
$client->send($request, $response);
// if($response->getStatus() === 200) {
// Dump the requested page content
echo $response->getContent();
// }
echo$response->getStatus(). '<pre>';
print_r($response);
echo '</pre>';
Проблему удалось найти, когда в консоли выполнил ./phantomjs --version и получил ошибку:
./phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
Решение: установить в систему bzip2 и fontconfig:
yum -y install bzip2 fontconfig
После этого все заработало без проблем.