これまでのクローリングでは、fsライブラリを使って、事前にローカルにあるjsを読み込んでstringとして保持してそのままevalしていたのですが、evalをするという後ろめたさと、string分のメモリの無駄使いが少しだけ気に入らなかったのですが、casperjsでちゃんとその辺を考慮して機能があったので、使い方と、機能の調査を行なって見ました。
便利にクローリング作業を行いたい人の参考になれば幸いです。
ソースコード
事前にローカルにソースコードを用意します。※雑なコードですみません。とりあえず確認のためのソースです。
hoge = "hogehoge";
続いてspookyjsの実ソースコードです。
;(function(){
var Spooky = require('spooky');
var $$ = function(){
spooky = new Spooky({
child: {
transport : 'stdio'
},
casper: {
clientScripts: [
"hoge.js"
],
logLevel: "info",
verbose : true,
waitTimeout : 1000
}
} , function(err){
if (err) {
e = new Error('Failed to initialize SpookyJS');
e.details = err;
throw e;
}
$$.prototype.spooky_start(spooky);
});
$$.prototype.setEmit(spooky);
};
$$.prototype.setEmit = function(spooky){
// message
spooky.on('message', function (res){
console.log("message : " + res);
});
};
$$.prototype.spooky_start = function(spooky){
spooky.start();
var url = "http://myntinc.com/";
spooky.thenOpen(url);
spooky.then(function(){
var res = this.evaluate(function(){
return hoge;
});
this.emit("message" , res);
});
spooky.run();
spooky.then(function(){this.exit();});
};
new $$;
})();
ソース内の "casper: { clientScripts: ["hoge.js"]," 箇所がローカルjavascriptファイルを読み込んでいる箇所なんですが、これを実行すると以下の様になります。
# node innerSource.js
> message : hogehoge
jQueryが入っていないサイトで、強制的に埋め込む様な場合に便利ですね。
色々調査
普通にscriptタグを作ってHTMLに追記されているのかと思ったのですが、実態はソースコードには反映されていないようですね。
this.evaluate(function(){...});
という中に以下を記述するとよくわかります。
var res = this.evaluate(function(){
var scripts = document.getElementsByTagName("script");
var lists = [];
for(var i=0; i<scripts.length; i++){
if(!scripts[i].src){continue;}
lists.push(scripts[i].src);
}
return lists.join("\n");
});
this.emit("message" , res);
このプログラムを実行すると以下の様な返り値がありました。
$ node innerSource.js
message : https://www.google-analytics.com/analytics.js
http://myntinc.com/js/ajax.js
http://myntinc.com/vendor/jquery/jquery-3.2.1.min.js
http://myntinc.com/vendor/bootstrap-3.3.7-dist/js/bootstrap.min.js
http://myntinc.com/js/common.js
http://mynt.work/butler/asp.js
送り込んだjsが含まれていないので、クローラー内部で別途に実行しているのがわかります。
さらに、このソースファイルの送り込みは、内部データでしか対応しておらず、
"hoge.js"を"http://hoge.com/hoge.js"と、公開サーバーに設置して読み込むという事はどうやらできないようです。
一歩踏み込んだ使い方
GoogleChromeブラウザを使っている人は、「機能拡張」プラグインで便利なアドオンオプション機能を搭載して作業効率化を行なったりしていることと思いますが、ブラウザでの便利機能はjavascriptで構成されている事が最近では多いです。
機能拡張のようなローカルjavascriptを作っておく事で、通常クローリングでブラウザ表示した内容を取得する際に、データを整形させるライブラリの様な機能拡張や、任意処理をするライブラリを整えておくだけでspookyjsの中でコーディングする内容が簡易にする事ができるので、この領域の構築をして効率アップしてみるのも面白いかもしれませんね。
0 件のコメント:
コメントを投稿