CasperJSでWEBサイトスクライピングを実装

WEBサイトスクライピングをやろうと思えば、PHPのPHP Simple HTML DOM Parser、phpQueryやJavaのjsoupのようなライブラリを使って簡単に実装できるのですが、Javascriptで表示内容を出力するサイトの場合は仕方ありません。

Javascriptが実行された後のHTMLを取得するには、PhantomJSのようなヘッドレスブラウザを使うことになります。

PhantomJSはWebKitベースのGUIを持たないヘッドレスブラウザで、JavaScriptのAPI を通じて、そのブラウザを自由自在にあやつることが出来ます。
また、そのPhantomJSをもっと簡単に使えるようにしてくれるのがCasperJSです。

下記のJavascript/CasperJSソースでは、任意のWEBページからその表示状態(Javascript/Ajaxの実行結果)のHTMLを取得して、ローカルのファイルに出力します。

使い方

$ casperjs Crawler.js <URL> <出力ファイル名>

<body>の中身からJavascript、CSS、コメント、不要な属性などをクリアして短縮されたHTMLを出力する。

Crawler.jsソース

var casper = require('casper').create({
    clientScripts: [
        'jquery-3.2.1.min.js'
    ],
    pageSettings: {
        loadImages: false
    }
});

if(!casper.cli.has(0)) {

    casper.exit();
}

var url = casper.cli.get(0);
var output = casper.cli.has(1) ? casper.cli.get(1) : 'page.html';

casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');

casper.start(url, function() {
    var content = this.evaluate(function() {

        $("script").remove();
        $("noscript").remove();
        $("style").remove();
        $("form").remove();
        $("iframe").remove();

        $("body").find("*").each(function() {
            var element = $(this);
            $.each(element[0].attributes, function() {

                if(this.name != "id" &&
                    this.name != "class" &&
                    this.name != "href" &&
                    this.name != "src") {

                    element.removeAttr(this.name);
                }
            });
        });

        var html = $("body").html()
            .replace(/\<\!\-\-.*\-\-\>/g, "")
            .replace(/\r?\n/g, "")
            .replace(/\s+/g, " ");

        return html;
    });
    var fs = require('fs');
    fs.write(output, content, 'w');
    this.echo(content);

    this.exit();
});

casper.run();