読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

AWS Lambda+Node.jsのモジュールcheerio-httpcliでWebスクレピングをする

 先日の『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ファイルをアップロードします。
f:id:dkfj:20160419011001p:plain
f:id:dkfj:20160419011007p:plain

 そして、Testで実行です。Eventの初期設定が必要ですが、引数を取らないプログラムになっているので、デフォルトをO.K.で大丈夫です。実行して、エラーが出ていないことを確認しましょう。
f:id:dkfj:20160419011313p:plain

 今回のソースは、ページタイトルと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 クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2016/04/20
  • メディア: 単行本
  • この商品を含むブログを見る


シリーズ目次:
Node.jsでスクレイピングするならば
AWS Lambdaでcheerio-httpcliを実行する

See Also:
『Rubyによるクローラー開発技法』を書きました
アプリケーションエンジニア向けのAWS本を書きました
『Amazon Web Services パターン別構築・運用ガイド』を書きました


参照:
Node.js用のスクレイピングモジュール「cheerio-httpcli」の紹介 - Qiita