スクレイピング
PhantomJS

PhantomJSでスクレイピングしてみる

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」のソースを取得)

hello.js
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」を使います。
引数にはキャプチャ画像のファイル名を入力します。

hello_image.js
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が出力されます。