AWS Community Builder(&Hero) Directoryのカード情報を全取得して棒グラフにしました
AWS Community Builderのアドカレがあるのを知り...
何か書いてみようと思いました。個人的には札幌で大型のイベントの運営に携わらせていただいたり、直近配信部として活動をスタートしたり、と色々書かせていただける事はありましたが、イベントについては既に皆様がブログで熱く語り尽くしてくださった事と、CBでいる事のメリットなどもこれまた諸先輩が素晴らしい記事を書いてくださっているので私は小ネタに走る事にしようと思いました。
「そういえばCBって世界にどのくらいどんな人がいるのか知らないなぁ」と思ったのが動機です。
Community Builder Directoryについて
AWSコミュニティビルダー(以下CB)に認定された際、AWS Community Builders Directory(※以下当記事ではCBDと略します)に自身の情報を登録しましょう。という流れになります。
以下のように「japan」でフィルタリングしてみた所、現在74名のカードが存在するようですが、 実際にはあえて登録の手順を踏んでいない方(期限までに気付く事が出来なかった、ここに表示させる事自体にはそれほど関心がない 等)も存在する為、これが全員ではありません。
当然、AWS様には当該Directoryに登録されていないBuilderの情報もお有りになるとは思いますが、そこは残念ながら私風情の手の届く場所ではない為パブリックにされている情報を一生懸命見ていく事にしたいと思います。
という事で、
現在は世界中で総勢2243名が登録しているようですが、実は上画像のように1ページにつき15人しか表示されない事やその他諸々あり、自分を名前で探す事くらいは簡単でも、試しに色々比較してみようなんて思っても正直お世辞にも触り心地がよくないのです。
150ページを手でめくっていくのも非常に効率が悪い。
Selenium×VBAで手元に表示された情報を眺めてみます。(VBAが良いの悪いのの話はまた今度)
VBAの良し悪しと違って
スクレイピングの良し悪しは重要と思います。この辺私も超正確にはわかっていないので、判断基準どこかという部分に触れた記事を見つけ改めて読んでみました。
今回対象としているCBDのURLを以下から探してみましたが、
恐らく「Disallow」の中にそれらしきものがない事を確認+純粋に公開された情報を全部一覧で見たいというのみで他意はありませんので、現在の所問題には該当しないものと思います。(ページに要素として表示されているものを転記しているに近いので何卒ご容赦を..二度目ですが他意はありません)こんな風に取得
やっている事は純粋に人間がテキストをコピーして、次のページをクリックを繰り返しているのと同じです。
本来は次のページをクリックした後、項目が確り表示されたかを判断するまでは短いSleepをループするなどすると正確ですが、そこは大きめの秒数のsleepを一つぽんと置いて横着しています。
こんな風に取得
勿論動くものですが推奨するものではないのでサラッと流していただければ。一覧が欲しいなぁという事であればコメントからおっしゃってください。(ないと思いますが)
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
Private driver As New WebDriver
Private sh As Worksheet
Private lastPageNum, instrNum, lastCardNum As Long
Private url, desc, cardNumText As String
Private headerNames As Variant
Private myBy As New by
Sub main()
Set sh = Workbooks(ThisWorkbook.Name).Worksheets("result")
sh.UsedRange.Clear
Call aggregateProcessing
With sh
.Activate
.Range("A3").Select
End With
Selection.AutoFilter
finTime = Timer
MsgBox "The process has been completed."
End Sub
Sub aggregateProcessing()
url ="[今回のURL]"
'先頭行にヘッダー名を記入
Call fillInHeaderNames
With driver
.Start "chrome"
Application.WindowState = xlMinimized
.Get url
'最後のページ数を取得
lastPageNum = Val(getTexts("m-last-page", 1))
'最後のカード数の元になる情報を取得
cardNumText = getTexts("m-card-numbers", 1)
'加工して最後のカード数を変数に収める
lastCardNum = Val(Mid(cardNumText, InStr(cardNumText, "(") + 1))
j = 4
For Page = 1 To lastPageNum
For i = 1 To 15
'テキストを取得し、resultシートへ転記
sh.Cells(j, 1) = j - 3 '数
sh.Cells(j, 2) = getTexts("m-category", i) '活動拠点
sh.Cells(j, 3) = getTexts("m-headline", i) '名前
desc = getTexts("m-desc", i) '部門+認定初年度
'部門と認定初年度を分割
instrNum = InStr(getTexts("m-desc", i), " since")
sh.Cells(j, 4) = Left(desc, instrNum - 2) '部門
sh.Cells(j, 5) = Mid(desc, instrNum) '認定初年度
sh.Cells(j, 6) = .FindElementByCss("
[カード内のaタグCSSの数値部分にiを挟んだもの]") > div.m-card-container > a").Attribute("href")
j = j + 1
'最後の一人になったらforを抜ける
If j - 4 = lastCardNum Then
Exit For
End If
Next i
'最後のページになったらforを抜ける
If Page = lastPageNum Then
Exit For
End If
' ">"をクリック
.FindElementByCss("[次のページのCSS]").Click
Sleep 1500
Next Page
.Quit
End With
Set driver = Nothing
End Sub
Sub fillInHeaderNames()
'配列
headerNames = Array("num", "area", "name", "category", "since")
'順番にセルに記入
For i = 0 To 4
sh.Cells(3, i + 1) = headerNames(i)
Next i
End Sub
Function getTexts(ByVal className As String, ByVal itemNum As Long)
With driver
Do While getTexts = ""
On Error Resume Next
'テキストを取得
getTexts = .FindElementsByClass(className).Item(itemNum).Text
'取得に失敗したらちょっと待つ
If Err.Number <> 0 Then
Sleep 50
End If
Err.Clear
Loop
End With
End Function
CommunityBuilder
カテゴリーの人数で一致しているか確認
事前に手動でチェックをいれて確認した人数が以下です。
Serverless 386人
Containers 308人
Security & Identity 251人
Cloud Operations 247人
Machine Learning 223人
Dev Tools 211人
Data 209人
Front-End Web & Mobile 149人
Networking & Content Delivery 147人
Storage 86人
Game Tech 18人
Graviton Arm 8人
合計2243人
こちらは実際にカードに記載されている文字列を抜き出したものです。
Serverless 386人
Containers 308人
Security & Identity 251人
Cloud Operations 247人
Machine Learning 223人
Dev Tools 211人
Data 209人
Front-End Web & Mobile 149人
Game Tech 17人
Storage 86
Network Content & Delivery 74人
Networking & Content Delivery 73人
Graviton Arm 8人
GameTech 1人
合計2243人
いくつかの部門(カテゴリ)で表記揺れが発生しているようですが、統合すると数は一致しています。
認定年
単純にAWSの成長に伴って認定される方が増えたという背景と、継続されている方ばかりでなく、認定が外れた方やHEROに認定されてリタイアされた方などもいるでしょうから、傾斜にはその影響もありそうなものです。
国別CB人数
CBD自体には以下のように、大枠のロケーションはチェックする事でフィルターにかける事が出来ますが、
もっと細かく知りたいよ!という場合はこれでは満足いきません。
カードに書いてある活動エリア的な文字列(これは本人が入力した値なので表現も本当バラバラ)を泥臭く集計してみました。
なので努力はしていますが、この先国別に関わる数値は特に正確である事を保証しているものではありませんのでご容赦ください。(これこっちに含まれるねというのに後で気付く事もあるかもしれません。)
ぱっと見日本は人数ランキング6位でしょうか。
上位10国カテゴリー割合
上位10国それぞれのカテゴリーの割合です。
ZENNは横幅狭いので画面拡大しないと見にくいと思います(MACの人は指二本でピンチアウトしてください。)
※UKには若干の表記揺れの影響あり。
※見にくく感じたので背景色変えました。
インドはコンテナやサーバレスが強い方が多いんだなとか、ドイツやオーストラリアは3割もサーバレスのCBだなとかそんな感じでライトに眺めていました。
紐づけているURL先
想像していたよりも圧倒的にlinkedin一強でした。
ちゃんとLinkedin使わなきゃと強く思いました。
ちなみにx(twitter)を登録している74人の中日本人は22人でした。
言う程日本人ばかりがtwitterに熱があるという訳ではないですが、ここで言うリンク先に求められるもののイメージに日本とそれ以外で結構違いがあるのかもしれません
HERO Directoryでも同じ事をしてみる
私はあまり詳しくありませんが、HEROプログラムの方がBuilderプログラムより数年先を走っていたのでしょうか。この辺の背景に詳しい方コメントくださると喜びます。
ビルダーの数はインドが頭ひとつ抜けて一位でしたが、HERO数はUSが圧倒的大差をつけて一位です。
ビルダーには「コミュニティ」という部門はありませんでしたが、HEROは255人中108人がこのカテゴリーです。このあたりの理解が深まるとHEROに選出される方々の普段の活動やアクションについてAWS側がどのように捉えているのかがわかってきたりするのかもしれません。
%ではなく人数表示。
こっちは割合
以上でした
国の集計などは完璧とは言い難いですが、どこの国にどのくらいのBuilder・Heroが分布しているかのランキング的な所をざっくりもイメージ出来やのでよかったです。図やグラフは視覚的で良いなと思いました。
今後も素晴らしい先輩の皆様から学ばせていただきたいと思っています。
有難うございました。
Discussion