node.ioでスクレイピング
参考
node.jsでスクレイピング(cheerio版)
↑こちらの方が簡単かも
Scraping the web with Node.io
http://www.coderholic.com/scraping-the-web-with-node-io/
上記、ブログ記事を読んで興味深かったのでnode.ioをちょっと使ってみました。公式のドキュメントは以下。
node.io
https://github.com/chriso/node.io/wiki
インストールはnpmで。
1 |
$ npm install node.io |
とりあえず、試しに”はてブ”から「いま話題」キーワードリンクを取得してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var nodeio = require('node.io'); exports.job = new nodeio.Job({ input:false, run:function(){ var self = this, url = "http://b.hatena.ne.jp/hotentry"; this.getHtml(url, function(err, $){ if(err){ self.exit(err); }else{ $('.top_keyword a').each(function(a){ self.emit(a.text); }); } }) } }) |
上記コードを、hatena.jsとして保存。実行してみる。
1 |
$ node.io hatena.js |
getHtmlの戻り値がdomエレメントなので、jQueryのセレクタに似た感じでデータを取り出せるのが便利。
うまく行ったので、もうすこしスクレイピングっぽいことを。
下記ページから、放射線量を取得してpostgresqlにインサートするスクリプトを書いてみる
node.js+postgresqlについてはこちら
群馬県:原子力発電所事故に係る本県での放射線量等について
http://www.pref.gunma.jp/05/e0900020.html
以下テスト用テーブルの内容
・めんどくさいのでtest_db、gunma_tbは先に作ってる
・測定者、測定地点、測定日時、測定値を取得
・gunma_tbのカラムは ID,GAUGER, SPOT, DATE, VALUE
・先のページが測定値を全角数字で書いてやがるので、カラムの型は、IDがシリアルなのを除いてすべてテキスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var GAUGER_CELL=5,SPOT_CELL=6,DATE_CELL=7,VALUE_CELL=8 var nodeio = require('node.io'); exports.job = new nodeio.Job({ input:false, run:function(){ var output = []; var self = this, url = "http://www.pref.gunma.jp/05/e0900020.html"; this.getHtml(url, function(err, $){ if(err){ self.exit(err); }else{ output = [ $('td')[GAUGER_CELL].children[0].raw, $('td')[SPOT_CELL].children[0].raw, $('td')[DATE_CELL].children[0].raw, $('td')[VALUE_CELL].children[0].raw ] var pg = require('pg'); var conString = "tcp://<アカウント>:<パスワード>@localhost/test_db"; var client = new pg.Client(conString); client.connect(); client.query("INSERT INTO gunma_tb(GAUGER, SPOT, DATE, VALUE) values($1, $2, $3, $4)", output,function(err,result){ client.end(); }); } }) } }) |
node.ioはスクレイピング以外にも、標準入出力やファイルの読み書きなどが簡単に扱えるので、ちょっとしたコマンドラインアプリをnode.jsで書くのに便利そう。