端くれプログラマの備忘録 PHP [PHP] PhantomJSを使ってJavaScriptでレンダリングされるページをスクレイピングする

[PHP] PhantomJSを使ってJavaScriptでレンダリングされるページをスクレイピングする

サーバーサイドでクローンを使っていくつかのサイトを定期的にスクレイピングしているのだけど、新たに追加するサイトがAngularJSで書かれているようで、file_get_contents関数などではHTMLを取得できないことがわかった。さてどうするか。

ヘッドレスブラウザのPhantomJSを使えば、JavaScriptでレンダリングされた結果のHTMLをサーバーサイドでも取得できそうだ。PHP PhantomJSというPHPのインタフェースも公開されているようなので、LaravelのCommandとして実装してみる。

PhantomJSのセットアップ

PhantomJS | PhantomJS
http://phantomjs.org/

Linux 64-bitをダウンロードして bin ディレクトリに格納。

$ 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

動作確認

$ bin/phantomjs
phantomjs> ←プロンプトが表示されればOK

PHP PhantomJS

GitHub – jonnnnyw/php-phantomjs: Execute PhantomJS commands through PHP
$ composer require "jonnyw/php-phantomjs:4.*"

コーディング

以下のサイトのサンプルを拝借してテスト。

PHP PhantomJS を使ってPHPでヘッドレスブラウジング | QUARTETCOM TECH BLOG
http://tech.quartetcom.co.jp/2016/04/07/php-phantomjs/

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();

動いた。