ヤマムギ

growing hard days.

*

Selenium, Headless ChromeとAWS Lambdaで夜な夜なスクレイピング

   

このようなアーキテクチャで、Alexaスキルの開発を進めていまして、元となる情報をwebとあるwebサイトから収集しています。
今はプロトタイプなのでスクレイピングしていますが、もしかするとデータを直接取得することになるかもしれません。
スクレイピングのままでよければこのままでもいいかなあとも思っています。

スクレイピングしているのは上記の3つのLambdaです。
なぜ3つのLambda関数に分けているかというと、並列で処理したほうが早いケースだからです。

それでは、このへんでどのような対象をスクレイピングしているかを見ていきます。

スクレイピング対象データ

こちらのサイトにある、IT/ビジネストレーニングの開催情報をすべて取得したいと思います。

1,000以上のコースを扱っているそうです。
豊富ですね。
すごいですね。
IT系やビジネストレーニングを受講するのであれば、なんでも揃ってそうですね。

構成を見てみると、階層が3つに別れているのがわかりました。
階層ごとにおLambda関数を作ります。

1階層目 カテゴリ階層

トップカテゴリはこの場合、「Amazon Web Service(AWS)」となります。
ここを展開すると小カテゴリに分かれています。

受講を検討している人の役割に応じてコースが選べそうですね。
素敵ですね。

必要なタグなどの情報は、Chromeのデベロッパーツールで見ていきますが、展開していなくてもソースには含まれているので、展開を自動化する必要はありません。
BeautifulSoupのfindでタグを見つけて情報を取得していきます。

※AWS LambdaでChrome Headlessブラウザを使ってスクレイピングしている部分の詳細は「AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする」をご参照ください。

それぞれの小カテゴリのURLを取得して、SQSへメッセージとして送信します。
最初のLambda関数はこの小カテゴリのURLと付属情報をSQSへ送信する処理で終了です。

2階層目 コース階層

小カテゴリのURLにアクセスすると上記のようなページです。
一つのコースでもいろいろ種類があるのですね。
いろんなニーズに対応することができそうですね。

これをまたBeautifulSoupのfindでタグを見つけて情報を取得していきます。

Amazon SQSをトリガーにAWS Lambdaで処理をしています。
AWS Lambdaの実行数は特に制限していません。
ですので、ほぼ小カテゴリすべてが並列にこのコース階層を分析していることになります。
効率的です。

コース階層用にLambda関数は一つだけを作りますが、カテゴリ階層からSQSに送信されたメッセージの数に応じて、コース階層のLambdaが並列でコースページにアクセスして情報を取得します。

取得した情報は、また次のSQSへメッセージとして送信します。
ちなみに本題とは直接関係はないですが、取得した情報をもう一つのSQSへ送信しています。
そうすることでAmazon Cloud Searchへも全文検索用の情報を作成します。

3階層目 開催情報階層

コース階層URLにアクセスすると上記のようなページです・
開催日程、場所と状況などが表示されています。

Architecting on AWSは2ヶ月分ほど満席になっていますね。
すごいですね。

ここもAmazon SQSをトリガーにAWS Lambdaで処理をしています。
ですので、さらなる数のLambdaが実行されます。
イメージにすると次のような感じです。

そしてここで取得した情報をDynamoDBに挿入します。
これによってAlexaに問い合わせがあったときに返答する情報を最新化できました。

コードの詳細は記載しませんが、「AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする」のコードとBeautifulSoupのfindを使うぐらいです。

順列でループをまわしていると膨大な時間がかかるスクレイピング処理も、AWS Lambdaを使って並列に処理をすることで数分で情報取得が完了しています。

あと、懸念としては、特定時間のページアクセスやサーバー負荷ですね。
対象サイトは実は自分の所属企業の公開ページですので、そのうち確認してみます。

おまけ

今回の構成を開発している最中にAWSのアイコンが更新されました。
なので新アイコンでも構成図を作ってみました。
大勢の方からわかりにくいとのご指摘をいただいたので、当面はアーキテクチャは旧アイコン、サービス説明などは新アイコンという使い分けにしようかなと思います。
(re:Inventでもそのような使い分けが多かったように思います)

新アイコンにするとこんな感じです。

あと、Chromeのドライバをzipで固めているのでファイルが重いです。
新機能のLambda Layerを使えばこのへんは解決するかもですのでそれは試して別の記事で報告したいと思います。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

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

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

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

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

 - AWS , ,

ad

ad

  関連記事

Amazon S3バケットでMFA Deleteを有効にする

バージョニングが有効なバケットでバージョン削除でMFA Deleteを有効にして …

CloudFormationドリフト検出

CloudFormationスタックのドリフト検出を確認しました。 CloudF …

Cloud9でSAMローカルテスト

せっかくテストするので、Amazon CloudSearchからAmazon E …

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました!

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました。 久 …

CodeGuru ProfilerでLambda関数(Python 3.9)のパフォーマンスを確認した

CodeGuru ProfilerでPython 3.9のLambda関数の推奨 …

Amazon SageMaker Canvas Immersion Dayワークショップのエンドツーエンド機械学習の記録

Amazon SageMaker Canvas Immersion Dayという …

AWSアカウントの解約

アカウント作成メニュー確認のために作成したAWSアカウントを解約しました。 使っ …

Amazon FSx for Lustreのユーザーガイド入門演習

ファイルシステムの作成 FSx for Lustreを選択しました。 容量やスル …

AWS X-Ray SDK for PythonをOrganizations組織内にLambda Layersで共有しました

ローカルでパッケージ作成 インストールコマンドはこちらAWS X-Ray SDK …

slackのbotをAWS Lambda(Python)+API Gatewayで構築

slackで投稿した内容に応じて返信したり調べ物したりしてくれるbotですが、こ …