🔖

AWS Community Builder(&Hero) Directoryのカード情報を全取得して棒グラフにしました

2023/12/23に公開

AWS Community Builderのアドカレがあるのを知り...

https://qiita.com/advent-calendar/2023/aws-community-builders

何か書いてみようと思いました。個人的には札幌で大型のイベントの運営に携わらせていただいたり、直近配信部として活動をスタートしたり、と色々書かせていただける事はありましたが、イベントについては既に皆様がブログで熱く語り尽くしてくださった事と、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を以下から探してみましたが、
https://aws.amazon.com/jp/robots.txt
恐らく「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