サーバーサイドでクローンを使っていくつかのサイトを定期的にスクレイピングしているのだけど、新たに追加するサイトがAngularJSで書かれているようで、file_get_contents関数などではHTMLを取得できないことがわかった。さてどうするか。
ヘッドレスブラウザのPhantomJSを使えば、JavaScriptでレンダリングされた結果のHTMLをサーバーサイドでも取得できそうだ。PHP PhantomJSというPHPのインタフェースも公開されているようなので、LaravelのCommandとして実装してみる。
PhantomJSのセットアップ
PhantomJS | PhantomJS
http://phantomjs.org/
Linux 64-bitをダウンロードして bin ディレクトリに格納。
1 2 3 |
$ curl -L -O https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 $ tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 $ cp -p phantomjs-2.1.1-linux-x86_64/bin/phantomjs bin/phantomjs |
動作確認
1 2 |
$ bin/phantomjs phantomjs> ←プロンプトが表示されればOK |
PHP PhantomJS
GitHub – jonnnnyw/php-phantomjs: Execute PhantomJS commands through PHP
1 |
$ composer require "jonnyw/php-phantomjs:4.*" |
コーディング
以下のサイトのサンプルを拝借してテスト。
PHP PhantomJS を使ってPHPでヘッドレスブラウジング | QUARTETCOM TECH BLOG
http://tech.quartetcom.co.jp/2016/04/07/php-phantomjs/
1 2 3 4 5 6 7 8 9 10 11 |
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(); |
動いた。