レンタルサーバーでphp-phantomjsを使えるようにしてみた

XSERVER

普通のレンタルサーバーでphp-phantomjsを使えるようにしてみた話

レンタルサーバー上でWebスクレイピングする時

javascriptを実行させたWebページを取得したい場合、レンタルサーバーだとこれ以外に手段がないんですよね。

なので、いまだに、たまに使うPhantomJS

そのインストール方法の解説です。

composer version2のレンタルサーバーでも使えます。

一応、明記しておきますが、

PhantomJSのサポートは終了しているので、他のheadlessを使ったほうがいいです。

レンタルサーバーにphp-phantomjsをインストールする前提条件

  • レンタルサーバーにsshログインできる
  • レンタルサーバーにftpログインできる

この2つは必須です。

※以下で解説する方法は、mixhostでなくても、レンタルサーバー(エックスサーバーとか)であればいけると思います。

レンタルサーバーにphp-phantomjsをインストールする方法(その1)

まずは、オーソドックスなインストール方法です。

この方法は、sshのみ。ftpは不要です。

普通(?)に「composer install」する方法です。

composer version1であれば、この方法でインストールできるはず。

エックスサーバーは、比較的新しいサーバーであってもcomposer v1なので、この方法でインストールできます。

ちなみに、composerのバージョンの確認方法は、

composer -V

composer version1だったら、こんな感じ、

[hoge@hoge ~]$ composer -V
Composer version 1.10.8 2020-06-24 21:23:30

で表示されます。

composer.jsonファイルを作成して、以下を記載します。

{
    "scripts": {
        "post-install-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ],
        "post-update-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ]
    },
    "require": {
        "jonnyw/php-phantomjs": "4.*"
    }
}

あとは、php-phantomjsをインストールしたいフォルダにcomposer.jsonをレンタルサーバーのFTPでアップロードして、sshログイン・そのフォルダに移動し、

composer install

を実行します。

これでインストール完了です。

レンタルサーバーにphp-phantomjsをインストールする方法(その2)

mixhostの場合、composerはversion2なのですが、その場合(その1)のやり方だとエラーが出てインストールできません。

たぶん、こんな感じのエラーが出ます。

Fatal error: Uncaught TypeError: Argument 3 passed to Composer\Downloader\DownloadManager::download() must implement interface Composer\Package\PackageInterface or be null, boolean given, called in /hogehoge/vendor/jakoch/phantomjs-installer/src/PhantomInstaller/Installer.php on line 192 and defined in phar:///opt/cpanel/composer/bin/composer/src/Composer/Downloader/DownloadManager.php:182
Stack trace:
#0 /hogehoge/vendor/jakoch/phantomjs-installer/src/PhantomInstaller/Installer.php(192): Composer\Downloader\DownloadManager->download(Object(Composer\Package\Package), '/hoge/...', false)
#1 /hogehoge/vendor/jakoch/phantomjs-installer/src/PhantomInstaller/Installer.php(121): PhantomInstaller\Installer->download('/hoge/...', '2.1.1')
#2 /hogehoge/vendor/jakoch/phantomjs-installer/src/PhantomInstaller/Installer.php(94): PhantomInstaller\Installer->__invoke()
#3 phar:///opt/cpanel/composer/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(323): P in phar:///opt/cpanel/composer/bin/composer/src/Composer/Downloader/DownloadManager.php on line 182

composerをv1にダウングレードすればいいのかもしれませんが、レンサバではたぶん無理です。

なので、なんとかcomposer v2でインストールしたいなぁ、と思いたどりついたのが、こちら。

GitHub - Weblanceur/php-phantomjs: Execute PhantomJS commands through PHP
Execute PhantomJS commands through PHP. Contribute to Weblanceur/php-phantomjs development by creating an account on GitHub.

composer version2でphp-phantomjsをインストールするには、このページにあるcomposer.jsonを使います。

{
    "name": "jonnyw/php-phantomjs",
    "description": "A PHP wrapper for loading pages through PhantomJS",
    "keywords": ["PhantomJS", "Testing", "Headless Browser"],
	"type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "Jonny Wenmoth",
            "email": "contact@jonnyw.me",
            "homepage": "http://jonnyw.me/"
        }
    ],
    "minimum-stability": "stable",
    "require": {
        "php": ">=5.4.0",
        "symfony/config": "^5.0",
        "symfony/dependency-injection": "^5.0",
        "symfony/filesystem": "^5.0",
        "symfony/yaml": "^5.0",
        "twig/twig": "^3.0",
        "jakoch/phantomjs-installer": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^4.0",
        "zendframework/zendpdf": "^2.0",
        "smalot/pdfparser": "^0.9"
    },
    "autoload": {
        "psr-0": {
            "JonnyW\\PhantomJs\\": "src"
        },
		"classmap": ["src/"]
    },
    "config": {
        "bin-dir": "bin"
    },
    "scripts": {
        "post-install-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ],
        "post-update-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ]
    }
}

このcomposer.jsonをアップロードして、同じフォルダに「src」フォルダを作成しておき、composer installします。

composer install完了後、srcフォルダに「JonnyW」フォルダを丸ごとアップロードすれば、無事php-phantomjsが使えるようになります。

「JonnyW」は上記githubからダウンロードできます。

レンタルサーバーでphp-phantomjsを使えるように方法(その3)

(その2)でもダメな場合、最後の手段です。

それは、composer version1のサーバー上で、(その1)の方法でphp-phantomjsをインストールし、そのフォルダごと、composer version2のレンタルサーバー側にコピー(FTPなど)する方法です。

このやり方の場合、コピー後にphantomjsの実行ファイルのみ実行権限をつける(chmod 755)必要があります。

php-phantomjsでページを取得してもjavascrptが実行されてなかった場合の対処方法

javascriptを実行する前にページ取得を完了してしまってる可能性もありますので、delayを使うと解決する、かもしれません。

$delay = 5; // 5 seconds
$request->setDelay($delay);

PHP PHANTOMJS USAGE#delay-page-render

コメント

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