PHP Phantomjsを使ってみる

PHPだと、Javascript使ったサイトの情報とかとってこれない(?)ので
Phantomjsとか使うとかなりおもしろいのだ

・PHP Phantomjsのインストール
composer.jsonファイルを下記の内容で作成

// composer.json

{
    "config": {
        "bin-dir": "bin"
    },
    "scripts": {
        "post-install-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ],
        "post-update-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ]
    }
}

bin-dirの中にphantomjsファイルが作成されるよ!

用意したらこちらのコマンドで実行

$ composer require "jonnyw/php-phantomjs:4.*"

■ PHP PhantomJSを使ってみる!
まずはめっちゃ基本
クラスがないよ~みたいに怒られたら

require APP . 'vendor/autoload.php';

こんな感じにautoload.phpを呼んでみよ~

<?php
use JonnyW\PhantomJs\Client;

$client = Client::getInstance();

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

$url = 'file:///path/to/hello_phantomjs.html';
$request->setUrl($url);

$client->send($request, $response);
echo $response->getContent();

次は、いろいろカスタマイズ

<?php
require APP . 'vendor/autoload.php';
use JonnyW\PhantomJs\Client;
use JonnyW\PhantomJs\DependencyInjection\ServiceContainer;
use JonnyW\PhantomJs\Http\CustomRequest;

// php-phantomjsを使う(カスタムJSスクリプトを使用)
$location           = APP.'vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/Resources/procedures';
$serviceContainer   = ServiceContainer::getInstance();
$procedureLoader    = $serviceContainer->get('procedure_loader_factory')->createProcedureLoader($location);

$client = Client::getInstance();
$client->getEngine()->setPath(APP.'bin/phantomjs');                             // phantomjsの場所
$client->getEngine()->addOption('--config=/path/to/config.json');

// カスタムJSスクリプトファイルを使用
$client->setProcedure('get_page_property');  // 自分で作ったファイルを指定
$client->getProcedureLoader()->addLoader($procedureLoader);

$response   = $client->getMessageFactory()->createResponse();
$request    = new CustomRequest();                                              // 独自パラメータ(setUserAgentなど)を使用するのでCustomRequestを使用

if ($pcsp == '0') {
    // PC
    $request->setUserAgent('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36');
    $viewportWidth  = 1280;
    $viewportHeight = 1024;
} else {
    // SP
    $request->setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_5 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/18.1.132077863 Mobile/13G36 Safari/600.1.4');
    $viewportWidth  = 375;
    $viewportHeight = 667;
}

$request->setViewportSize($viewportWidth, $viewportHeight);

$request->setUrl($url);              // URL
$request->setOutputFile($captureFile);                                      // キャプチャファイル

// phantomjs実行
$client->send($request, $response);

echo $response->getContent();

実際にphantomjs用のファイルを作成してるところはこちら
jonnyw/php-phantomjs/src/JonnyW/PhantomJs/Resources/procedures
http_default.proc

今回、こちらをコピーしてオリジナルのprocファイルを同じとこに作成してみた
get_page_property.proc

procファイルに独自の変数を渡したいときとかは、こんな感じのファイルを作成して読んであげる
app/vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/Http
CustomRequest.php

<?php
namespace JonnyW\PhantomJs\Http;

class CustomRequest extends Request
{
    protected $userAgent;

    public function setUserAgent($userAgent)
    {
        $this->userAgent    = $userAgent;
        return $this;
    }

    public function getUserAgent()
    {
        return $this->userAgent;
    }
}

コメント

タイトルとURLをコピーしました