0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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に入れる時が方便になります)

- headless chrome と chromedriver を取得

- ここで注意すべきのは、新しいバージョンのheadless-chromiumを使っても、対応するchromedriverでないとエラー発生します。私が使っていたのは、以下の2つ
- https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-37  
`stable-headless-chromium-64.0.3282.167-amazonlinux-2017-03.zip
`
- https://chromedriver.storage.googleapis.com/index.html?path=2.37/
`chromedriver_linux64.zip`

- 次に、それらを解凍して以下のように権限調整(`chmod 777`)して、最終的に以下のようにchromeフォルダーに格納し、1つのZIPファイルに圧縮します。

chrome.zip
chrome
├── chromedriver
└── headless-chromium



- Ubuntu にselenium package のZIPファイルを作成する。



```shell
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?