Lambdaでスクレイピングを定期実行してDynamoDBに貯めるアプリケーションを作っています。
早速ググるとたくさん記事が出てくる。ありがたい。
こちらの記事を参考にさせていただいてトライしていたが、2日くらいハマってしまったポイントがあったのでメモ。
- chromedriver 2.43 https://chromedriver.storage.googleapis.com/index.html?path=2.43/
こちらのchromedriver_linux64.zip
-
serverless chrome v1.0.0-55 https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-55
stable-headless-chromium-69.0.3497.81-amazonlinux-2017-03.zip
-
selenium 3.14
lambdaレイヤーはPython3.6
当然lambdaのランタイムも3.6
ハマりポイント
何度もバージョンを確認したが、lambda上で以下のエラー
Chrome failed to start: exited abnormally\n (unknown error: DevToolsActivePort file doesn't exist)
以下の記事など、オプションにいくつか追加することで直るという意見が多い。
https://stackoverflow.com/questions/50642308/webdriverexception-unknown-error-devtoolsactiveport-file-doesnt-exist-while-t
記事ではjavaコードだが、Pythonに直して、
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--no-sandbox")
しかし
別のエラーが発生
unknown error: unable to discover open window in chrome
結局、上記のいくつかに加え、この記事の
options.add_argument("--single-process")
を足すことで解決した。
https://stackoverflow.com/questions/60229291/aws-lambda-ruby-crawler-selenium-chrome-driver-unknown-error-unable-to-discov
options.add_argument("--headless")
に加えて、最終的にトラブルシューティングとして追加したオプション設定はこちら
options.add_argument("--single-process")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--no-sandbox")
ハマりポイント もう一個
lambdaにレイヤーをアップロードする際、
headless-chromeというdirにheadless-chromeとchromedriverおいてzip化したのだが、7zipでやるとexecutable may have wrong permission みたいなエラーで動かず。
色々見てると、windowsのzipだと、デプロイパッケージがうまく動かないらしいので、wslのubuntuでzip化したら。この問題は解決した。
備考
スクレイピングの方法について、Cloud Funtion + Typescript Puppeteerとも迷ったが、
- 書かなければいけないスクレイピングの件数が非常に多く、スクレイピングコードを快適に書けることを重視したい
- Ajaxを使ったサイトからも正しく情報を取得したい
- AWS勉強したい
ということで、個人的に単純明快に扱えると感じたSeleniumをlambda上で動かすことにしました。