AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする
2018/09/04
インターネット上に公開されている情報をDynamoDBにつっこみたいだけなので、VPC内のLambdaからVPN経由で会社のシステムのAPIやデータベースとやりとりするよりも、VPC外のLambdaからwebスクレイピングをしてしまったほうがてっとり早いかなと。
以前まではPhantomJSを使ってましたがどうやら開発が止まるらしいので、今回からChrome Headlessを使ってみようということで少しエラーが出たりしたので備忘録として書いておきます。
目次
とりあえずやってみる
ダウンロードして展開したheadless-chromiumとchromedriverをbinディレクトリを作って格納。
1 2 |
pip install selenium -t . |
でSeleniumをダウンロードして、zipで固めてLambdaを作成して早速実行。
※ アクセスしたページのタイトルをリターンするだけのサンプルコードです。
※ urlは実際には何らかのURが入ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from selenium import webdriver def lambda_handler(event, contxt): options = webdriver.ChromeOptions() options.binary_location = "./bin/headless-chromium" options.add_argument("--headless") driver = webdriver.Chrome( executable_path="./bin/chromedriver", chrome_options=options ) driver.get(url) return driver.title |
最新バージョンのドライバだと下記エラーが発生。
1 2 3 4 5 6 7 8 9 10 11 12 |
File "/var/task/lambda_function.py", line 44, in lambda_handler chrome_options=options File "/var/task/selenium/webdriver/chrome/webdriver.py", line 68, in __init__ self.service.start() File "/var/task/selenium/webdriver/common/service.py", line 76, in start stdin=PIPE) File "/var/lang/lib/python3.6/subprocess.py", line 707, in __init__ restore_signals, start_new_session) File "/var/lang/lib/python3.6/subprocess.py", line 1326, in _execute_child raise child_exception_type(errno_num, err_msg) OSError: [Errno 8] Exec format error |
なので、こちら
AWS Lambda上のheadless chromeをPythonで動かす
を参考にさせていただき、以下からダウンロードして使用。
https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
結果はエラーとなりましたので発生エラーと、解消のために追加したオプションを次に記載します。
エラー対応
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
1 2 |
options.add_argument("--no-sandbox") |
selenium.common.exceptions.WebDriverException: Message: unknown error: unable to discover open pages
1 2 |
options.add_argument("--single-process") |
エラーはこの2つだけでした。
他にもパラメータオプションは色々あるようですが、必要最低限のものだけ設定しておきます。
結果、次のようなコードになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from selenium import webdriver def lambda_handler(event, contxt): options = webdriver.ChromeOptions() options.binary_location = "./bin/headless-chromium" options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--single-process") driver = webdriver.Chrome( executable_path="./bin/chromedriver", chrome_options=options ) driver.get(url) return driver.title |
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWS CLIを使用せずにCodeCommitへhttpsで接続する
AWS CLIやアクセスキーID、シークレットアクセスキーなどを開発環境にセット …
-
-
Amazon ECS Workshop for AWS Summit Online
INTRODUCTION TO AMAZON ECSに手順や必要なリンクがありま …
-
-
EC2 Global Viewで不要なインスタンスを見つけて4つほど終了しました
EC2 Global Viewという機能がリリースされました。 EC2コンソール …
-
-
AWS Cost Explorerの履歴を38ヶ月とリソース別コストを見られるように設定しました
AWS Cost Explorer がより詳細な履歴データの提供を開始 知らなか …
-
-
AWS Firewall Managerを設定して結果を確認
CloudFront対応のポリシーとして作成したかったので、Globalを選択し …
-
-
AWS Organizationsで新規メンバー登録したアカウントを組織から離して解約
2021年現在ではこの方法しかないと認識していますので書き残します。 そのうち新 …
-
-
RDS for MySQL のインスタンスタイプ変更
当ブログのデータベースは、RDS for MySQLです。 個人利用ですし、障害 …
-
-
AD Connectorを作成してシームレスにドメイン参加する
VPN接続先のADで管理されているドメインにEC2 Windowsインスタンスか …
-
-
Amazon Location Service入門ワークショップの前提環境準備
Amazon Location Service入門ワークショップの前提環境を構築 …
-
-
EC2インスタンスが到達不能になって復旧してMackerelで監視し始めた
きっとばりばり使っておられる方ならよくある事なんだろうけど、はじめて体験したので …