ヤマムギ

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認定クラウドプラクティショナー 改訂第2版」という本を書きました。

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

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

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

 - AWS , ,

ad

ad

  関連記事

EKS「現在の IAM プリンシパルは、このクラスター上の Kubernetes オブジェクトにアクセスできません」

マネジメントコンソールでクラスターのオブジェクトを見ようと、リソースの名前空間や …

AWS Systems Manager Run CommandでEC2 Linuxのユーザーとカレントディレクトリを確認

AWS Systems Manager Run CommandからEC2 Lin …

「ポケットスタディ AWS認定 デベロッパーアソシエイト」を執筆しました

2021年3月6日に、「ポケットスタディ AWS認定 デベロッパーアソシエイト」 …

WordPressの年ごとのブログ投稿数を調べるSQL

毎年年末に使いそうなのでメモです。 [crayon-662371aaac9be6 …

「X-Tech JAWS 【第2回】~9割のX-Techと1割の優しさで切り拓く未来~」に行ってきました

「X-Tech JAWS 【第2回】~9割のX-Techと1割の優しさで切り拓く …

Rocket.ChatのOutGoingWebhookからのAPI GatewayからのDynamoDB

少し前に、Rocket.ChatからOut Going Webhookを設定して …

Application Load Balancer スティッキーセッションでどれぐらい偏るかを偶然見ました

Amazon Linux2のPHPを7.2から7.3へアップデートしましたでアッ …

ブラウザからJavaScript SDKを使ってAmazon S3 への写真のアップロードチュートリアルをやってみました

ブラウザから Amazon S3 への写真のアップロードをやってみました。 HT …

AWS AmplifyでTodoアプリを作るハンズオンをやってみました

【お手軽ハンズオンで AWS を学ぶ】AWS Amplify で Todo アプ …

AWS Cost Anomaly Detectionでコストモニターを作成しました

[ご利用開始にあたって]を押下しました。 このあと画面を説明してくれるツアーがあ …