普通のレンタルサーバーでphp-phantomjsを使えるようにしてみた話
レンタルサーバー上でWebスクレイピングする時
javascriptを実行させたWebページを取得したい場合、レンタルサーバーだとこれ以外に手段がないんですよね。
なので、いまだに、たまに使うPhantomJS。
そのインストール方法の解説です。
composer version2のレンタルサーバーでも使えます。
一応、明記しておきますが、
PhantomJSのサポートは終了しているので、他のheadlessを使ったほうがいいです。
>【おすすめはどっち?】エックスサーバーとmixhostの違い・注意点・優れたところを比較
目次
レンタルサーバーに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でインストールしたいなぁ、と思いたどりついたのが、こちら。
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);
コメント