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入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
API GatewayをトリガーにしたときのLambdaリソースベースポリシー
先日、SwaggerからAPI Gatewayを作ったときに、API Gatew …
-
CloudFormationスタックポリシーでスタック更新を防止する
CloudFormationのスタックにスタックポリシーを設定することによって、 …
-
iPad ProのWorking CopyでAWS CodeCommitのリポジトリを使う
iPad Proを導入しましたので、原稿執筆や校正でフル活用しようと思いまして。 …
-
AWS LambdaのSQSへの自前ポーリングをやめてSQSイベントソーストリガーに変更した
以前は、LambdaがSQSからメッセージを受信するには、キューをポーリングして …
-
Rocket.ChatからOut Going Webhookを設定してみる
API GatewayとLambda とりあえず、どんなデータが飛んでくるのか見 …
-
AWS Elastic Beanstalkによって作成されたS3バケットはDeleteBucketが拒否されていた
ちょっとした検証をしたあとに、Elastic Beanstalkのアプリケーショ …
-
RDS + VPC + Lambda + API Gateway + CloudFront + WAF + ACMでAPIを構築する
RDSのMySQLの情報を与えられたリクエストをキーにしてjsonで返すAPIを …
-
TwilioからのリクエストをAPI Gateway+LambdaでTwimlを返して処理する
Twilioで着信した時のリクエスト先としてTwimlをWebサーバやS3で用意 …
-
S3バケットにWebフォントをアップロードしてCORSを設定する
Webフォントファイルは、モジワク研究さんのマメロンを使用させていただきました。 …
-
AWS Organizationsで新規メンバー登録したアカウントを組織から離して解約
2021年現在ではこの方法しかないと認識していますので書き残します。 そのうち新 …