Node.js で Web スクレイピング

突然ですが、社内のシステム(Web アプリ)が非常に使いにくいです。社外から見えるのはいいけどスマホ用のデザインがないとか、API がないから自動化しにくいとか。

些細なことですが日々ストレスは溜まっていき、先日うっかり自分で作ってしまえばいいのでは?と思い立ってしまいました。ひとまず、Webアプリからデータを抜き出す部分について書き出しておこうと思います。

まず、どうやってデータを取得するのかですが、いわゆる Web スクレイピングという手法を使います。大層な名前がついていますが、単純に HTTP の GET や POST を投げて、返ってきた HTML を解析するだけです。

今回はなぜか Node.js を使います。(最近の私の流行りなので)
node.js と npm は入っている前提ですすめます。

使ったもの一覧

Node.js 6.9.4
cheerio 0.22.0
request 2.76.0

request は HTTP 通信をする時に、 cheerio はサーバーからとってきた HTML を jquery のようにアクセスできるようにするために使います。

導入

適当なフォルダを作り、そこで以下のコマンドをたたく

ログイン画面の突破

社内システムなのでやっぱり認証があります。ふつうに ID とパスワードを入力する欄とログインボタンがあるタイプです。ログインすると Cookie にセッション ID が保存されます。攻撃に耐えられるのかと非常に不安になるような見た目をしています。

まずは実際にログインページをブラウザで開き、開発者ツールを使いどこにどんな情報を送っているか調べます。それを元に以下のコードを書き換えてください。

他のページを見る

セッションID が jar に保存されるので、その jar を使えばログイン後にしか見えないページも取得し放題です。

返ってきた内容を元に、欲しいデータを取得します。大体、このデータが入っている場所はこの id が付いているとか、N番目の table タグのX列目とかで決まっているはずです。実際のページをブラウザで見つつ、どのようなセレクタを使えば欲しい情報を取得できるか考えます。

Cookie を保管したい場合

一時的にセッションID を DB とかに保存したい場合は jar を一度 JSON にするといいです。request のドキュメントにはない方法なので、のちのち使えなくなるかもしれませんが・・・。