LoginSignup
30
34

More than 3 years have passed since last update.

AWS-Lambda + Python + CronでWEBスクレイピングを定期的に実行する

Last updated at Posted at 2020-05-06

AWS-Lambda + Python + CronでWEBスクレイピングを定期的に実行する

はじめに

Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。

目的

この記事を最後まで読むと、次のことができるようになります。

No. 概要 キーワード
1 コーディング Python
2 WEBスクレイピング Selenium,chromedriver,headless-chromium
3 Lambda設定 Lambda

実行環境

環境 Ver.
macOS Catalina 10.15.3
Python 3.7.3
selenium 3.141.0

ソースコード

実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。

GitHub

関連する記事

AWS-Lambdaの特徴

本サービスは従量課金制となります。ご留意ください。

全体の流れ

  1. Pythonコードを書く
  2. Lambdaへアップロードするためのzipを作成する
  3. Lambda関数を作成する
  4. Lambda関数へzipをアップロードする
  5. (補足)Layersを使ってアップロードする
  6. Lambda関数の環境変数を設定する
  7. (補足)Layersを使った場合の環境変数を設定する
  8. 定期的に実行するためCronを設定する

1. Pythonコードを書く

コーディング

app/lambda_function.py
"""app/lambda_function.py
"""
import os

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


def lambda_handler(event, context):
    """lambda_handler
    """
    print('event: {}'.format(event))
    print('context: {}'.format(context))

    headless_chromium = os.getenv('HEADLESS_CHROMIUM', '')
    chromedriver = os.getenv('CHROMEDRIVER', '')

    options = Options()
    options.binary_location = headless_chromium
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--single-process')
    options.add_argument('--disable-dev-shm-usage')

    driver = webdriver.Chrome(executable_path=chromedriver, options=options)
    driver.get('https://info.finance.yahoo.co.jp/fx/')
    usd_jpy = driver.find_element(By.ID, 'USDJPY_top_bid').text
    driver.close()
    driver.quit()

    return {
        'status_code': 200,
        'usd_jpy': usd_jpy
    }


if __name__ == '__main__':
    print(lambda_handler(event=None, context=None))

Lambdaで動作させる場合は、Options()の設定が必要となります。

2. Lambdaへアップロードするためのzipを作成する

スクリプト作成

  • 環境に合わせてchromedriverheadless-chromiumのバージョン/パスを変更する必要があります。
  • 2020/5時点で動作確認済み。
make_upload.sh
rm upload.zip
rm -r upload/
rm -r download/

mkdir -p download/bin
curl -L https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip -o download/chromedriver.zip
curl -L https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-55/stable-headless-chromium-amazonlinux-2017-03.zip -o download/headless-chromium.zip
unzip download/chromedriver.zip -d download/bin
unzip download/headless-chromium.zip -d download/bin

mkdir upload
cp -r download/bin upload/bin
cp app/lambda_function.py upload/
pip install -r app/requirements.txt -t upload/
cd upload/
zip -r ../upload.zip --exclude=__pycache__/* .
cd ../

rm -r upload/
rm -r download/

upload.zip作成

command_line.sh
sh make_upload.sh

3. Lambda関数を作成する

前提条件

  • AWSアカウント作成済み
  • Lambda関数のロール作成済み

Lambda関数作成

  1. AWSにログインする
  2. サービスからLambdaを開く
  3. サブメニューの関数を選択して関数の作成をクリックする
  4. 一から作成を選択して、関数名ランタイム実行ロールを入力して関数の作成をクリックする

4. Lambda関数へzipをアップロードする

10MBを超えたためS3経由でアップロードしました。

アップロード

  1. Lambda関数の関数コードセクションを表示する
  2. .zipファイルをアップロードを選択する
  3. アップロードからupload.zipを選択して保存をクリックする

zipサイズが10MBを超える場合のアップロード

  1. S3にupload.zipをアップロードする
  2. Lambda関数の関数コードセクションを表示する
  3. Amazon S3からファイルをアップロードを選択する
  4. Amazon S3のリンクURLを入力して保存をクリックする

5. (補足)Layersを使ってアップロードする

アップロードの流れ

  1. upload.zipからbinを切り離してbin単体でzipを作成する
  2. Layersbinを登録する
  3. Lambda関数にLayersを追加する
  4. .zipファイルをアップロードを選択してupload.zipをアップロードする

5-1. upload.zipからbinを切り離してbin単体でzipを作成する

bin.sh
bin.zip
├── chromedriver
└── headless-chromium

5-2. Layersbinを登録する

  1. サブメニューのレイヤーを選択してレイヤーの作成をクリックする
  2. 任意の名前を入力する
  3. アップロードをクリックして、bin.zipを選択する
  4. 互換性のあるランタイム - オプションを選択して作成をクリックする

5-3. Lambda関数にLayersを追加する

  1. Lambda関数のDesignerセクションの中心に表示されるLayersを選択する
  2. 下段に表示されるレイヤーのレイヤーの追加をクリックする
  3. Layersに登録したbin.zipの名前を選択して追加をクリックする

5-4. .zipファイルをアップロードを選択してupload.zipをアップロードする

6. Lambda関数の環境変数を設定する

環境変数設定

  1. Lambda関数の環境変数セクションを表示する
キー
CHROMEDRIVER /var/task/bin/chromedriver
HEADLESS_CHROMIUM /var/task/bin/headless-chromium

7. (補足)Layersを使った場合の環境変数を設定する

Layers環境変数設定

  1. Lambda関数の環境変数セクションを表示する
キー
CHROMEDRIVER /opt/bin/chromedriver
HEADLESS_CHROMIUM /opt/bin/headless-chromium

8. 定期的に実行するためCronを設定する

Cron作成

  1. Lambda関数のDesignerセクションを表示してトリガーを追加をクリックする
  2. トリガーの設定で、CloudWatch Events/EventBridgeを選択する
  3. ルールで、新規ルールの作成を選択する
  4. ルール名で、任意のルール名を入力する
  5. ルールタイプで、スケジュール式を選択する
  6. スケジュール式で、cron(0 17 ? * MON-FRI *)を入力して追加をクリックする

Cron式の例

頻度
毎日午前 10:15 (UTC) cron(15 10 * * ? *)
毎週月曜日から金曜日まで午後 6:00 cron(0 18 ? * MON-FRI *)
毎月 1 日の午前 8:00 cron(0 8 1 * ? *)
平日の 10 分ごと cron(0/10 * ? * MON-FRI *)
月曜日から金曜日まで午前 8:00 から午後 5:55 まで 5 分ごと cron(0/5 8-17 ? * MON-FRI *)
毎月最初の月曜日の午前 9 時 cron(0 9 ? * 2#1 *)
30
34
11

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
30
34