CasperJSを使ってスクレイピングをする機会があったのでこちらもメモっておきます。
まずは、phantomJS とそのラッパーであるCasperJSをインストールします。
1.インストール
sudo npm install -g phantomjs
sudo npm install -g casperjs
phantomjs --version
2.1.1
casperjs --version
1.1.4
2. 必要なライブラリをimport
今回は下記4つ
var util = require('util');
var fs = require('fs');
var system = require('system');
var casper = require('casper').create({ verbose: true, logLevel: "debug"});
3. イベントハンドラを設定する
クリックイベントとナビゲーションイベントをハンドリングしてログ出力
casper.on('click', function() {
// クリックで発生したナビゲーションリクエストのURL
this.echo(debug_tag + 'on click event: request url:\n\t' + this.requestUrl);
this.then(function(response) {
// クリック後に行きついたページのURL
console.log('on click event -> then: current url:\n\t' + this.getCurrentUrl());
});
});
casper.on('navigation.requested', function(url) {
// 動作確認用のログ出力
this.echo(debug_tag + 'navigation.requested url:\n\t' + url);
});
4. 処理の開始
casper.runを実行するとcasper.start内の処理が実行されます。
casper.evaluate内でダウンロードしたページの評価を行えるので特定のAタグをぬきだしています。
util.inspectでオブジェクトを見やすくデバック出力する事が可能です。
var tag = "[murotani]";
var url_search = 'xxxxxxxx'
var links;
// リンクを一括取得
casper.start(url, function() {
links = casper.evaluate(function(){
var q = document.querySelectorAll('.area-abc>div>ul>li>a');
return Array.prototype.map.call(q, function(e){
return {'name': e.innerHTML, 'url': e.href};
});
});
casper.echo(tag + util.inspect(links, false, null));
});
casper.run();
//URLをデバック表示
console.log(util.inspect(links,false,null));
5. 処理の追加
先程のURLの配列をループで回して1ページづつ取得します。
ここで注意しないといけないのが、casper.eachを使う事。
通常のFORループだと非同期で動作してしまうので使えません。
casper.thenOpenでURLを開きます。
casper.thenで後続処理を次々に記載する事が可能です。
casper.waitForで特定タグの出現を待つ事ができるのでAJAXのページなどに対応できます。
waitFor内のthenに処理を追加していきましょう。
casper.then(function(){
// URLをループで一つづつ開く
//for(var idx1 in links) {
casper.start().each(links,function(self,link){
var URL = link.url;
console.log(tag + URL);
casper.thenOpen(URL, function () {
casper.waitFor(function check() {
return this.evaluate(function () {
return document.querySelectorAll('.sch-panel-word-input').length > 0;
});
}, function then() {
// ここに後続処理を記載
}, function timeout() {
}, 3000);
});
});
casper.run();
});
6. クエリセレクタ
JQueryと同様のセレクタの書式で問題なさそう。
- 単一取得の場合
document.querySelector - 複数取得の場合
document.querySelectorAll
フォーム入力には、fillSelectorsが使えるみたいだ。