HTMLの情報を取得したいけど、欲しい情報はjavascript等でレンダリング後の情報というのはよくある話です。
毎回手動で取ってくるのは面倒、そういう時に便利なのがPhantomJSです。
つい最近自分も使ってみたので、誰かの参考になればと思いメモとして残します。
動作環境
Amazon Linux AMI release 2018.03
composer 1.5.1
PhantomJSインストール
$ cd /usr/local/src
$ sudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ sudo tar jxfv phantomjs-2.1.1-linux-x86_64.tar.bz2
$ sudo ln -s /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs
バージョンを確認し表示されればインストール完了
$ phantomjs -v
2.1.1
ソースコード取得
javascriptでスクレイピングするソースを作成します。(例で「http://google.com」のソースを取得)
var page = require("webpage").create();
var system = require("system");
page.open("http://google.com", function(status){
if (status === "success") {
console.log(page.content);
}
phantom.exit();
});
上記のファイルをサーバに設置し、以下のコマンドを実行するとソースコードが表示されます。
phantomjs hello.js
なおHTMLをファイルに保存する場合は単純に
phantomjs hello.js > hello.html
とすればOKです。
画面キャプチャ取得
対象ページの画面キャプチャを撮りたい時は「page.render」を使います。
引数にはキャプチャ画像のファイル名を入力します。
var page = require("webpage").create();
var system = require("system");
page.open("http://google.com", function(status){
if (status === "success") {
page.render('google.png');
}
phantom.exit();
});
実行はソースコードの時と同じですが、日本語フォントがサーバに入っていなければ文字化けします。
取得できない時
通信がうまくいかない時は以下のコマンドを打ってみます。
curl -v [URL]
※[URL]には取得対象サイトのURLを入力。
エラーが出る、またはレスポンスがない場合はSSL Protocolエラーの可能性があるので、「--tlsv1」オプションを追加して実行してみます。
curl -v --tlsv1 [URL]
これでレスポンスが返ってきた場合はPhantomJSコマンドを以下のようにして実行します。
phantomjs --ssl-protocol=tlsv1 [JSファイル]
無事取得できたらhtmlが出力されます。