LoginSignup
0
0

More than 3 years have passed since last update.

Seleniumとheadless chromeをAWS lambdaに入れてみました。(Win10環境下の注意点等)

Last updated at Posted at 2020-10-09

Python でWeb Scraper を作る時に、対象ターゲットのがclient-side javascript で取得している際、単純にurlopenではほしい情報を取得できないことが多いです。そのため、SeleniumかAPI(もしあれば)で取得することが多いと思います。

一方で、定期的に、かつ経済的に何かを実行したい時には、on-demand のAWS lambdaとCloudEvent を使用するのが良いでしょう。

では、スタート

手順

環境構築

Windows環境下でAmazon LinuxをOSにしたAWS lambdaを使うには、Ubuntu on Windows 10 かその他remote linux server の支援が必要です。今回はより経済的な方法として、Ubuntu on Windows 10 を選択。

具体的なインストール方法は以下参照すると良いでしょう。

Windows 10でLinuxを使う

次に、Pythonを入れておきます。

sudo apt-get update
sudo apt-get install python3.6

環境が整えたら、次にUbuntu 下で以下の操作を行う。

※Windowsで圧縮しても後にLambdaでエラー発生するので要注意。

  • 分かりやすい場所に移動する、以下は例
 # Cディスクに移動する
  cd /mnt/c/  
  mkdir /path/to/folder
  cd /path/to/folder

それで、File Explorerですぐに生成してファイルを見つけるでしょう。(あとでS3に入れる時が方便になります)

  chrome.zip
  chrome
  ├── chromedriver
  └── headless-chromium
  • Ubuntu にselenium package のZIPファイルを作成する。
  mkdir python-selenium
  cd python-selenium

  python3 -m pip install --system --target ./ selenium
  zip -r python-selenium.zip ../python-selenium
  • chrome.zip&python-selenium.zipをS3に入れて、Object URLをメモしておき、Layer作成しましょう。

  • 最後サンプルを動いてみます。

  from selenium import webdriver
  from selenium.webdriver.chrome.options import Options

  def lambda_handler(event, context):
      options = Options()

      # 自分の対応するファイルパスを入れる
      options.binary_location = '/opt/chrome/headless-chromium'
      options.add_argument('--headless')
      options.add_argument('--no-sandbox')
      options.add_argument('--single-process')
      options.add_argument('--disable-dev-shm-usage')

      # 自分の対応するファイルパスを入れる
      browser = webdriver.Chrome('/opt/chrome/chromedriver', chrome_options=options)
      browser.get('https://www.google.com')
      title = browser.title
      browser.close()
      browser.quit()

      return {"title": title}

ここで注意するのは、Basic setting of lambda function(基礎設定)のところを、Exampleを動くにはメモリ消耗が256MB以上、Durationがおよそ10秒しました(512MB, timeout:20s設定の場合)、事前に調整して状況を見た方が良いでしょう。

Q&A

もしかすると疑問ある方いるかもしれないので、いくつ自分がやる時に戸惑っていたことを書きます。

Q:なぜchrome フォルダーに入れて圧縮する

A:特に必要ないが、Lambdaにlayerを追加する際に、zipファイルにあるものを、/optフォルダーにくっつきます。例えば、/opt/chrome/chromedriver & /opt/chrome/headless-chromium

Q:図示のように、Windows持っているzip化の使用はダメですか。

image-20201008223558454.png

A:実際にそれをLayerにアップロードすると、Message: 'chromedriver' executable may have wrong permissionsというエラーメッセージが出されるので、調べたところ、どうも権限がうまくつけないらしい。そのため、Ubuntu下でファイルの権限調整し、圧縮しましょう。

参考

おわりに

何かエラーを発生しても慌てずに、lambda test実行後のエラーレポートを確認すると良いでしょう。意外に問題点がはっきりと書いてある。

0
0
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
0
0