Пример работы с phantomjs на php

24.10.2021

Во время парсинга сайта обычного чтения файла или 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 install

но...

Первая проблема:

Composer выдал Fatal error: Uncaught TypeError: Argument 3 passed to Composer\Downloader\Download Manager::download().

Решение, которое мне помогло, откатить composer второй версии до первой:

 
composer self-update --1

после установи не забудьте вернуть вторую версию:

 
composer self-update --2

Вторая проблема:

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

После этого все заработало без проблем.


Категории: PHP, Linux
Яндекс.Метрика