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認定クラウドプラクティショナー 改訂第2版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Microsoft TeamsのIncoming Webhooksを使ってAWS Lambda(Python)からFeedlyの記事を自動投稿する
Microsoft Teamsの検証を始めましたので、Slackで自動化している …
-
Mountpoint for Amazon S3を試しました
このブログでは、画像などの配信にS3を使用しています。 WordPressのプラ …
-
Amazon S3オブジェクトロック
S3のオブジェクトロックを確認しました。 オブジェクトロックの有効化 現在、既存 …
-
AWS Organizationsでタグポリシーを設定しようとしました
Organizationsで[タグポリシーを有効にする]ボタンを押下しました。 …
-
試そうとしてたらSavings Plans買っちゃいました
Savings Plansの購入画面を確認していました。 画面遷移も確認しようと …
-
RocketChat(EC2インスタンス)でCPU80%以上を10分間継続したら再起動する
先日、数日間のやり取り用で完全に使い捨てとして使っているRocketChatで、 …
-
X-Ray SDK for Python でライブラリへのパッチ適用
boto3でのAWS呼び出しとrequestsでの外部API呼び出しにパッチ適用 …
-
ヤマムギ vol.7 AWSアカウント作成 & 最初の設定ハンズオン 手順
ヤマムギとは from Mitsuhiro Yamashita 「AWSではじめ …
-
AWS Organizationsからメンバーアカウントを直接「閉じる」ことができるようになりました
これまでは、メンバーアカウントはOrganizations組織から「除外」して独 …
-
API GatewayをトリガーにしたときのLambdaリソースベースポリシー
先日、SwaggerからAPI Gatewayを作ったときに、API Gatew …