昔、Rubyでクローラー/Webスクレイピングの本を書きました。今でもちょくちょくとスクレイピングのコードを書いたりはするのですが、実行基盤についてはサーバの運用管理が面倒くさいのでAWS Lambdaを使うことが多いです。そうなると、Lambdaは基本的にはRubyが使えないので、言語はPythonかNode.jsを利用することになります。Pythonもいいけど、今後のことを考えるとNode.js力を高めておきたいと考えています。ということで、Node.js縛りでスクレイピングの仕方です。
スクレイピング対象のページの種類
私の中の勝手な定義ですが、スクレイピングには3種類あります。
1. 静的サイト/JavaScript不要なページに関するスクレイピング
2. 対話型サイト/JavaScript不要なページに関するスクレイピング
3. JavaScript前提のページに関するスクレイピング
下に行くほど、スクレイピングしづらくなります。
静的サイト/JavaScript不要なページに関するスクレイピング
これが一番簡単です。HTMLを取得して、そのHTMLの中の特定のデータを抽出するだけです。利用するライブラリとしては、cheerio-httpcliあたりが良いです。
対話型サイト/JavaScript不要なページに関するスクレイピング
対話型サイトとは、入力フォームやチェックボックスを利用してユーザが入力後にサブミットして遷移するサイトです。利用するプロトコルとしては、getではなくpostのイメージです。単純に検索条件を指定するだけであれば、postであってもパラメータを自分で付加して送ればいいのですが、認証等が絡むことが多いです。その際は、ライブラリ側もCookie等に対応してセッションを維持する必要があります。面倒くささのランクが1つあがることになります。
こういった場合に利用するライブラリとしては、Mechanizeが定番になります。Node.jsというかJavaScript版としてmechanize-jsがあります。また、先に紹介したcheerio-cliも0.3.0以降は同様の機能が使えるようになっています。選択の悩みどころですね。
JavaScript前提のページに関するスクレイピング
JavaScript前提のページとは、サーバサイドで画面を生成するのではなく、クライアントサイドから各要素を呼び出して動的にページを生成するタイプです。従来も画像やCSSをクライアントから呼び出してというところはあったのですが、最近は表示するデータ等をクライアントから非同期で呼び出してというパターンが増えてきています。スクレイピングという観点では、大変な場合が多いです。
対処法としては、JavaScriptを解析してデータ部分を直接引っ張る方法と、スクレイピング側にブラウザ相当のものを用意して画面の生成をする方法があります。前者は認証認可含めて大変な場合が多く、後者はブラウザを利用するので通常のスクレイピングより多くのリソースを必要とします。Selenium+Firefoxで実現する場合もあるのですが、出来るだけ軽量に実行できるようにヘッドレスブラウザと呼ばれるCLIベースのものを利用することが多いです。代表格としては、WebKit ベースで作られたPhantomJSがあります。Node.js+Lambdaから使う際は、phantom-lambda-templateというモジュールもあります。これについては、回を改めて解説します。またPhantomJS以外では、Xvfbを利用してChromeやFirefoxなどの実ブラウザをCLIで使うという方法もあります。
まとめ
スクレイピングの分類するだけで、結構な分量となりました。次回以降、それぞれの方法を順に解説してみようと思います。つづきは、こちら。
AWS Lambdaでcheerio-httpcliを実行する
JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
- 作者: クジラ飛行机
- 出版社/メーカー: ソシム
- 発売日: 2015/08/31
- メディア: 単行本
- この商品を含むブログ (2件) を見る
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
- 作者: るびきち
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/03/02
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく
- 作者: NRIネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/04/20
- メディア: 単行本
- この商品を含むブログを見る
シリーズ目次:
Node.jsでスクレイピングするならば
AWS Lambdaでcheerio-httpcliを実行する
See Also:
『Rubyによるクローラー開発技法』を書きました
アプリケーションエンジニア向けのAWS本を書きました
『Amazon Web Services パターン別構築・運用ガイド』を書きました