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
関連記事
-
-
Amazon SageMaker AIのクイックセットアップ
Amazon SageMaker AI のクイックセットアップを使用するに記載の …
-
-
Developers Summit 2018 「AWSのフルマネージドな環境でCI/CDをやってみよう!AWS Cloud9からAWS Fargateへの継続的デプロイをご紹介」を聞きました
※写真は展示のAmazon Echoです。 以下は、思ったことや気になったことを …
-
-
Amazon Augmented AI (Amazon A2I) のチュートリアル
Amazon Augmented AI (Amazon A2I)を使ったことがあ …
-
-
JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを作る側からの物申す〜に参加、運営、登壇しました
先日、JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを …
-
-
Route53でドメインを新規取得してDNSレコードを設定する
Elastic IPをAWSで発行しているのですから、DNSの設定も同じようにマ …
-
-
AWS認定ソリューションアーキテクトアソシエイトのサンプル問題
AWS認定ソリューションアーキテクトアソシエイトのサンプル問題の解説を会社のブロ …
-
-
Application Load Balancer スティッキーセッションでどれぐらい偏るかを偶然見ました
Amazon Linux2のPHPを7.2から7.3へアップデートしましたでアッ …
-
-
AWS APIリクエストにPostmanで署名を作成する
新年明けましておめでとうございます! 署名バージョン4 「AWSはマネジメントコ …
-
-
AWS Organizationsからメンバーアカウントを直接「閉じる」ことができるようになりました
これまでは、メンバーアカウントはOrganizations組織から「除外」して独 …
-
-
CloudFront用のAWS管理プレフィックスリストを使用しました
このブログでは、CloudFrontのカスタムヘッダーとALBのルーティングを組 …

