ヤマムギ

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を使えばこのへんは解決するかもですのでそれは試して別の記事で報告したいと思います。


最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

 - AWS , ,

ad

ad

  関連記事

「JAWS-UG in AWS Cloud Roadshow 2017 大阪」で運営をしました

AWS Cloud Roadshow 2017 大阪のナイトイベントで、「JAW …

Cloud9 Python3でpipも3にする

このブログは、2019/10/20に書いた、 Cloud9のAMIがCloud9 …

「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってきました

「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってき …

AWS EC2 インスタンスステータスのチェックで失敗して起動しなくなり復旧

EC2のインスタンスに接続出来なくなったので、AMIから作成してElastic …

ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする

「Pandocサーバーのコンテナイメージを作成する」で作成したイメージをAWS …

Amazon Aurora Serverless 課金確認

Amazon Aurora Serverlessを使い始めてみましたの記事で書い …

TwilioからのリクエストをAPI Gateway+LambdaでTwimlを返して処理する

Twilioで着信した時のリクエスト先としてTwimlをWebサーバやS3で用意 …

EC2 Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(手順整理版)

ブログサイト(WordPress)をレンタルWebサーバーからAWSに移設する事 …

WordPressをAmazon CloudFrontで配信してついでにACM(AWS Certificate Manager)を使って常時SSL化する

当サイトの500と502の発生状況がドイヒーであるとの苦情をいただきまして、Am …

AWS Lambdaで Unable to import module エラーが発生したときは

そもそも、Pycharmのナビゲーションペインでディレクトリごとドラッグ&amp …