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認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。
「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
関連記事
-
-
新しいVPCウィザード(2022年)がすんごく便利になってました
VPCウィザードがすんごく便利になってました。 ウィザードの左ペインで設定を選択 …
-
-
Amazon InspectorによるLambda関数の脆弱性検出結果を確認しました
AWS re:Invent 2022期間内に発表されましたAmazon Insp …
-
-
Amazon ECSサービスでAWS App Meshを使用
AWS App MeshユーザーガイドのAWS App Mesh とAmazon …
-
-
Rocket.ChatにAWS Lambda(Python)から投稿する
Rocket.ChatにAPIで投稿するテスト(Postman)をやってみて、使 …
-
-
AWS コスト最適化ハブを有効にしました
新しいコスト最適化ハブは、推奨アクションを一元化してコストを節約します 2023 …
-
-
Amazon Cognito User Poolsのデモをしてみました
AWS Summit 2016 Tokyoのアップデートおっかけ会をJAWS-U …
-
-
Amazon API Gatewayでモックを作る
超シンプルなAPI Gatewayのサンプルがほしかったので、ユーザーガイドの手 …
-
-
Aurora Serverless Data APIを有効にしてQuery Editorを使ってみました
Aurora ServerlessのMySQLでData APIを有効にして作成 …
-
-
サイトのHTTPステータスを5分おきにチェックして200以外ならSlackに通知する
すいません。ここ最近出費が重なりまして、某監視サービスのプランを有料プランからF …
-
-
EC2ハードウェア専有インスタンス(Dedicated Instances)を起動して請求書を確認してみました
EC2ハードウェア専有インスタンスのサイトには、次の料金と表記されています。 * …

