23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CasperJSで複数ページのタイトル、METAディスクリプション・キーワードをまとめたCSVを出力する

Last updated at Posted at 2015-03-16

はじめに

PhantomJS(CasperJS)を使って、サイトの情報をCSVにまとめて出力する簡単なJavaScriptを書いてみました。
ひとまずタイトル、ディスクリプション、キーワードとしましたが、スクリプトを少し変えるだけでその他要素も簡単に習得可能かと思います。

PhantomJSとは・・・コマンドで使えるヘッドレスブラウザ(Webブラウザで表示されるデータの取得・操作などができる)
CasperJSとは・・・PhantomJSをより簡単に使うモジュールをまとめたもの

スクリプト実行環境の用意

必要となる2つのパッケージをインストール

  • PhantomJS: 例)$ sudo npm install -g phantomjs@1.9.7-15
  • CasperJS: 例)$ sudo npm install -g casperjs

※PhantomJSの1.9.8がインストールされるとCasperJS実行時にエラーが出たため、1.9.7を指定しています
※この場合Node.jsはインストール済みとします

JSONファイルを用意し、取得したいページのURLを列挙していく

src.json
[
  "http://www.yahoo.co.jp/",
  "http://www.google.co.jp/",
  "http://www.livedoor.com/"
]

実行するJavaScriptファイルを作成

※jQueryを使用しているため、並びにjQuery.jsファイルを配置しています

var fs   = require('fs');
var json = require('./files/src.json');  // URLを配列形式で記載したJSONファイルを読み込む

/* データを格納する多次元配列を作成する */
/* 子配列には、title, descriptionなど各データを格納するための空スペース '' を4つ作成 */
/*
  data[i][0] = url
  data[i][1] = title
  data[i][2] = meta description
  data[i][3] = meta keyword
*/
var data = (function() {
    var arr = [];
    var i, j;
    var l = json.length;
    for (i = 0; i < l; i++) {
        arr[i] = [];
        for(j = 0; j < 4; j++) {
            arr[i][j] = '';
        }
    }
    return arr;
})();


/* casperの定義 */
/* jQueryを実行できるように(ファイルはこのJSの並びに配置) */
var casper = require('casper').create({clientScripts: ['./jquery.js']});

/** 
 * casperをループ実行
 * @param {array}  json: 各URLが設定された配列
 * @param {object} self: Casperオブジェクト
 * @param {string} link: 処理している現在のURL
 */
casper.start().each(json, function(self, link, i) {
    self
        /* 指定ページを開く */
        .thenOpen(link, function () {

            /* URLとタイトルの取得 */
            var url   = this.getCurrentUrl(); // この場合はlinkと同じ
            var title = this.getTitle();

            /* metaタグの取得 */
            var metaDes = this.evaluate(function() {
                return $('meta[name=description]').attr('content');
            });
            var metaKey = this.evaluate(function() {
                return $('meta[name=keywords]').attr('content');
            });

            /* dataの子配列に取得したページ情報を追加 */
            /* カンマ区切りが入ってきても大丈夫なように項目には "" を付けてエスケープ */
            /* データが存在しない時(null)は "" は付けない */
            data[i][0] = '"' + url + '"';
            data[i][1] = (title   !== null) ? '"' + title   + '"' : '';
            data[i][2] = (metaDes !== null) ? '"' + metaDes + '"' : '';
            data[i][3] = (metaKey !== null) ? '"' + metaKey + '"' : '';

            this.echo('Loading... ' + title);
        })

        /* 読み込んだらCSVに書き込む */
        .then(function() {
            /* ファイルはutf-8なのに注意 */
            fs.write('./files/output.csv', data.join('\n'));
        })
    ;
});

casper.run();

ファイル構成

以下のような構成になりました

root/─┬─jquery.js
      ├─output.js(実行するスクリプト)
      │
      └─files/─┬─src.json(読み込むURLソース)
               └─output.csv (自動出力)

実行する

$ cd root/
$ casperjs output.js

~Fin~

おわりに

出力されたcsvはutf-8なので、場合によっては変換作業が必要となるかもしれません。
また取得したいURL群を動的に生成したり、jQueryで特定の記事を指定するなど色々と応用できるかと思います。

23
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?