2015年11月16日月曜日

PhantomJSとCasperJS

このエントリーをはてなブックマークに追加

世の中にはいろいろ便利なJavaScriptのライブラリがあるものです。今回はコマンドラインから利用できるPhantomJSと、そのPhantomJSを便利に使うことができるようになるCasperJSを使ってみる。

まずはインストールから。npmを使う。
# /usr/local/node/bin/npm install -g phantomjs
/usr/local/src/node-v4.2.2-linux-x64/bin/phantomjs -> /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/bin/phantomjs

> phantomjs@1.9.18 install /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs
> node install.js

Looks like an `npm install -g`; unable to check for already installed version.
Downloading https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
Saving to /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/phantomjs/phantomjs-1.9.8-linux-x86_64.tar.bz2
Receiving...
  [=================================-------] 82% 0.0s
Received 12854K total.
Extracting tar contents (via spawned process)
Removing /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/lib/phantom
Copying extracted folder /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/phantomjs/phantomjs-1.9.8-linux-x86_64.tar.bz2-extract-1447702852021/phantomjs-1.9.8-linux-x86_64 -> /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/lib/phantom
Writing location.js file
Done. Phantomjs binary available at /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs
phantomjs@1.9.18 /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs
├── which@1.0.9
├── progress@1.1.8
├── kew@0.4.0
├── adm-zip@0.4.4
├── request-progress@0.3.1 (throttleit@0.0.2)
├── request@2.42.0 (tunnel-agent@0.4.1, forever-agent@0.5.2, aws-sign2@0.5.0, caseless@0.6.0, oauth-sign@0.4.0, stringstream@0.0.5, json-stringify-safe@5.0.1, tough-cookie@2.2.1, mime-types@1.0.2, qs@1.2.2, node-uuid@1.4.7, http-signature@0.10.1, hawk@1.1.1, form-data@0.1.4, bl@0.9.4)
├── npmconf@2.1.1 (ini@1.3.4, inherits@2.0.1, uid-number@0.0.5, semver@4.3.6, once@1.3.2, mkdirp@0.5.1, nopt@3.0.6, config-chain@1.1.9, osenv@0.1.3)
└── fs-extra@0.23.1 (path-is-absolute@1.0.0, jsonfile@2.2.3, graceful-fs@4.1.2, rimraf@2.4.3)
# /usr/local/node/bin/npm install -g casperjs
|
> phantomjs@1.9.18 install /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs
> node install.js

Looks like an `npm install -g`; unable to check for already installed version.
Downloading https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
Saving to /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs/phantomjs/phantomjs-1.9.8-linux-x86_64.tar.bz2
Receiving...
  [===================================-----] 88% 0.0s
Received 12854K total.
Extracting tar contents (via spawned process)
Removing /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs/lib/phantom
Copying extracted folder /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs/phantomjs/phantomjs-1.9.8-linux-x86_64.tar.bz2-extract-1447702982784/phantomjs-1.9.8-linux-x86_64 -> /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs/lib/phantom
Writing location.js file
Done. Phantomjs binary available at /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/node_modules/phantomjs/lib/phantom/bin/phantomjs
/usr/local/src/node-v4.2.2-linux-x64/bin/casperjs -> /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs/bin/casperjs
casperjs@1.1.0-beta3 /usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/casperjs
└── phantomjs@1.9.18 (which@1.0.9, progress@1.1.8, kew@0.4.0, adm-zip@0.4.4, request-progress@0.3.1, npmconf@2.1.1, request@2.42.0, fs-extra@0.23.1)

サイトのタイトルを取ってくる簡単なサンプルを書いて実行してみる。
// 取得するURLを設定
var TARGET_URL = "http://smile-smile-at-smile.blogspot.jp/";

// CasperJSオブジェクトの生成
var casper = require('casper').create();

// 指定のサイトを開く
casper.start(TARGET_URL, function(){
 // サイトタイトルの表示
 this.echo(casper.getTitle());
});

// このrun()メソッドが呼ばれた時点で
// start()メソッドに登録した処理が実行される
casper.run();

実行したら怒られた。
# casperjs getTitle.js
/usr/local/src/node-v4.2.2-linux-x64/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory

fontconfigをインストール。
# yum install fontconfig

再度、実行してみる。
# casperjs getTitle.js
いつも君は僕のPAYDAYを取り上げるんだ

できたじゃん。

今日の作業

OpenCVの画像検出できた時はすごいうれしかった!あとは黙々とパース処理。。。

node.jsでRSSをパースする

このエントリーをはてなブックマークに追加
この前までクローリングとかやったので、今度はRSSをパースしてみる。

ここでnodeでXMLを読み込む際に便利なxml2jsをインストールしておく
# /usr/local/node/bin/npm install xml2js
xml2js@0.4.15 node_modules/xml2js
├── sax@1.1.4
└── xmlbuilder@4.1.0 (lodash@3.10.1)

今回は地元の大阪の週間天気を取り出すことにした。内容はこちら

取得したRSSをパースして天気の内容を取りだす。
// 大阪の週間天気予報RSS
var RSS = "http://rss.weather.yahoo.co.jp/rss/days/6200.xml";

// モジュールの読み込み
var parseString = require('xml2js').parseString;
var request = require('request');

// RSS取得
request(RSS, function(err, response, body){
 if(!err && response.statusCode == 200){
  analyzeRSS(body);
 }
});

// 関数定義
function analyzeRSS(xml){
 // XMLをJSのオブジェクトに変換
 parseString(xml, function(err, obj){
  // エラー処理
  if(err){
   console.log(err);
   return;
  }
  
  // RSS内のあるrss要素の下のchannel要素のitemをすべて取り出す
  var items = obj.rss.channel[0].item;
  
  // item要素の数だけループさせる
  for(var i in items){
   var item = items[i];
   // item内のtitle要素をコンソールに表示
   console.log(item.title[0]);
  }
 });
}

取得した結果はこちら。

# /usr/local/node/bin/node tenki.js
【 16日(月) 大阪(大阪) 】 晴れ - 22℃/12℃ - Yahoo!天気・災害
【 17日(火) 大阪(大阪) 】 曇後雨 - 22℃/14℃ - Yahoo!天気・災害
【 18日(水) 大阪(大阪) 】 曇時々雨 - 21℃/16℃ - Yahoo!天気・災害
【 19日(木) 大阪(大阪) 】 曇時々雨 - 19℃/13℃ - Yahoo!天気・災害
【 20日(金) 大阪(大阪) 】 曇時々晴 - 19℃/11℃ - Yahoo!天気・災害
【 21日(土) 大阪(大阪) 】 晴時々曇 - 18℃/10℃ - Yahoo!天気・災害
【 22日(日) 大阪(大阪) 】 曇時々晴 - 19℃/11℃ - Yahoo!天気・災害
【 23日(月) 大阪(大阪) 】 曇り - 19℃/13℃ - Yahoo!天気・災害
【 大阪市 】警報・注意報はありません - Yahoo!天気・災害
【 北大阪 】警報・注意報はありません - Yahoo!天気・災害
【 東部大阪 】警報・注意報はありません - Yahoo!天気・災害
【 南河内 】警報・注意報はありません - Yahoo!天気・災害
【 泉州 】警報・注意報はありません - Yahoo!天気・災害

OpenCV Tutorial(4)〜特定画像の検出

このエントリーをはてなブックマークに追加
ドラクエの戦闘画面からカンダタの子分を取り出してみた。

元画像のこれから
これを取り出してみる。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('dq.jpeg')
img_rgb2 = img_rgb.copy()
img_gray = cv2.cvtColor(img_rgb2, cv2.COLOR_BGR2GRAY)
template = cv2.imread('template.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb2, pt, (pt[0] + w, pt[1] + h), (255,0,0), 1)

plt.subplot(121),plt.imshow(img_rgb)
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_rgb2)
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.show()

おぉ、とりだせた。