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
関連記事
-
Amazon Glacierのプロビジョニングされた迅速取り出し容量をなぜか購入しました
過去1年ぐらいのAWSコストをCost Explorerで見てまして、10/10 …
-
このブログをAWS大阪リージョンへ移行しました
大阪リージョン爆誕!! 朝起きて寝ぼけながらリージョンを見てると。 「大阪リージ …
-
Redmineの添付ファイルをS3に同期する
RedmineをAWS上で構築するデザインを考えていて、せっかくなので冗長化しよ …
-
EC2 Dedicated Hosts(専有ホスト)を起動
クォータ引き上げ 新規で作成したアカウントではDedicated Hostsがソ …
-
Microsoft TeamsのOutgoing Webhooksを使ってAWS Lambda(Python), Amazon API Gatewayとbot
Microsoft Teamsの検証その2、Slackで実装しているbotも対応 …
-
EC2 VyOSで/etc/resolv.confを設定しました
EC2でVyOSを起動してSSHで接続して確認していたところ、どうもVyOSから …
-
「JAWS-UG朝会 #18」で主にAWSなブログについて発表をしました
ラジオ体操 いつものラジオ体操から。 今日はラーニングセンターから配信の日でした …
-
Projectタグを強制するSCPでアクションやリソースを限定しないとき成り立つのか
ふと疑問に思ったので試しました。 予想は、拒否されてしまう、です。 [crayo …
-
Amazon EC2のスクリーンショットとは
ドキュメント見てたらAmazon EC2でスクリーンショットって機能があったので …
-
AWS Service Catalogポートフォリオを他のアカウントと共有する
AWS Service Catalogチュートリアルで作成したポートフォリオの他 …