先日の『Node.jsでスクレイピングするならば』の続きを書きました。全10回くらいのシリーズになる予定で、今回は一番シンプルな静的サイト/JavaScript不要なページに関するスクレイピングの説明です。cheerio-httpcliをAWS Lambdaで動かすところで、cheerio-httpcliの説明というよりlambdaでの動かし方がメインになっています。ちなみにcheerio-httpcliは、cheerioの拡張で、最近活発に開発されています。
なお、AWS Lambdaとはなんぞやとと言う人に簡単に説明すると、Lambdaはサーバ不要のコンピュートエンジンです。ユーザーはプログラムをアップロードするだけで実行可能で、サーバのメンテナンスはAWS側が全てやってくれるという夢のようなインフラです。普通にサーバーを立ち上げるより安く便利なことが多いので、是非知っておくべきサービスです。
cheerio-httpcliの準備とソースの記述
まずはLambdaにアップ用にcheerio-httpcliの準備をします。
プロジェクト用のディレクトリ直下にnode_modulesを作り、そこに関連モジュールをインストールします。
$ mkdir node_modules
$ npm install cheerio-httpcli
次に、ソースを書きます。LambdaのエンジンがNode.js 4.3になってCallBackの利用を推奨されるようになっているので(このソースでは意味無いですが、)その文法に沿って利用しておきましょう。
'use strict'; let client = require('cheerio-httpcli'); exports.handler = (event, context, callback) => { client.fetch('http://www.google.com/search', { q: 'node.js' }, function (err, $, res) { console.log(res.headers); console.log($('title').text()); let list = ''; $('a').each(function (idx) { console.log($(this).attr('href')); list = $(this).attr('href'); }); callback(null, list); }); };
cheerio-httpcliの解説としては、http://www.google.com/searchに引数pに対して、node.jsで検索した結果を取得しています。その習得結果、resからaタグのhref属性を抜き出しています。
"exports.handler = (event, context, callback) "とcallbackの部分がLambada用に記述しているところです。その他の部分は、Googleの検索結果を取得するというソースを拝借しています。
ソースを記述したら、先ほどのモジュールごと圧縮してzipファイルにします。
※コールバック形式とプロミス形式をどう使うかは、また回を改めて説明します。
zip -r simple-scrape.zip simple-scrape.js node_modules/
AWS Lambdaの準備
AWSマネージメントコンソールから、Lambdaファンクションを作成します。GUIなんてという硬派な方は、CLIからでも大丈夫です。Nameは、適当につけてください。今回は、cheerio-httpcli-sampleで作っています。Handlerは、「simple-scrape.handler」です。これは、simple-scrape.js内のhandlerを実行するということです。先ほど、export.handler作りましたよね。デフォルトのindex.handlerは、index.jsのexport.handlerを読み込むという意味です。Roleは、Lambdaの実行権限をつければ大丈夫です。そして、コードはUpload a .ZIP fileを選び、先ほど作ったzipファイルをアップロードします。
そして、Testで実行です。Eventの初期設定が必要ですが、引数を取らないプログラムになっているので、デフォルトをO.K.で大丈夫です。実行して、エラーが出ていないことを確認しましょう。
今回のソースは、ページタイトルとaタグを全て抜きだすというものです。実行結果については、抜き出す対象を絞り込む必要や、そもそもGoogleのbot対策など、いろいろカスタマイズするところがあります。ひとまずLambdaでcheerio-httpcliを実行の確認が出来たのではないでしょうか。次回は、cheerio-httpcliの使い方を、もう少し掘り下げて解説します。
まとめ
- AWS LambdaでサードパーティのNode.jsモジュールを利用したい場合は、直下のnode_modulesにまとめて圧縮する
- cheerio-httpcliは、0.3.0以降はコールバックとプロミスに対応している(未解説)
なお、AWS Lambdaの使い方については、4/20発売の本に詳しく書いています。主にモバイルアプリからの利用の仕方を中心としていますが、Lambdaの設定方法・権限付与などをこれでもかとサンプル込で解説しています。全部で600ページ超の大作です。
Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく
- 作者: NRIネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/04/20
- メディア: 単行本
- この商品を含むブログを見る
シリーズ目次:
Node.jsでスクレイピングするならば
AWS Lambdaでcheerio-httpcliを実行する
See Also:
『Rubyによるクローラー開発技法』を書きました
アプリケーションエンジニア向けのAWS本を書きました
『Amazon Web Services パターン別構築・運用ガイド』を書きました