LoginSignup
13
16

More than 5 years have passed since last update.

AWS Lambda の Node.js で axios と cheerio で HTML解析(スクレイピング)

Last updated at Posted at 2018-07-02

あるテストサーバーから OneTimeToken を取得しようとしたら、レスポンスが HTML しかなかったので、AWS Lambda の Node.js で axioscheerio で、HTML解析(スクレイピング)して JSON をレスポンスさせるようにした話。

Node.js ソースコード

app.js
const axios = require('axios');
const cheerio = require('cheerio');
const url = '{TARGET_PAGE}';

exports.lambda_handler = (event, context, callback) => {
    axios(url)
        .then(({ data }) => {
            const content = getContent(data);
            callback(null, {
                statusCode: 200,
                body: JSON.stringify({ content: content })
            });
        })
        .catch(callback);

};

function getContent(html) {
    const $ = cheerio.load(html);
    const content = $('{TARGET_SELECTOR}').text();
    console.log('Content: ', content);
    return content;
}

ね、簡単でしょ?


開発手順
  1. AWS SAM CLI でプロジェクト作成

    $ sam init --runtime nodejs8.10 --name onetimetoken
    
    ディレクトリ構成
    onetimetoken
    ├── hello_world                 <-- Source code for a lambda function
    │   ├── app.js                  <-- Lambda function code
    │   ├── package.json            <-- NodeJS dependencies
    └── template.yaml               <-- SAM template
    
  2. axios と cheerio をインストール

    $ cd onetimetoke/hello_world
    $ npm install --save axios
    $ npm install --save cheerio
    $ cd ..
    
  3. app.js を上記のコードに書き換える

  4. ローカルでサーバーを起動

    $ sam local start-api
    
    2018-07-02 14:14:25 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
    2018-07-02 14:14:25 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
    2018-07-02 14:14:25  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
    
  5. ブラウザ等で http://127.0.0.1:3000/hello を GET で開くとスクレイピング結果の JSON が取得できます。

  6. AWS へデプロイ

    1. AWS S3 BUCKET作成

      aws s3 mb s3://BUCKET_NAME
      
    2. パッケージ (AWS S3 へコードをアップロード)

      sam package \
          --template-file template.yaml \
          --output-template-file packaged.yaml \
          --s3-bucket REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME
      
    3. デプロイ (AWS Lambdaへデプロイ)

      sam deploy \
          --template-file packaged.yaml \
          --stack-name onetimetoken \
          --capabilities CAPABILITY_IAM
      

※当初ヘッドレスブラウザで実装してましたが、AWS Lambda では実行できなかったので、HTMLパーサを使うようにしました。

参照
13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16