Databricks入社以来、ユーザー会JEDAIのステアリングコミッティーメンバーなのです。
かれこれ3年を迎えようとしている中、「メンバー数の変遷を見てみたい」と思った次第です。おかげさまで1400人を超えています。
しかし、connpassではメンバー一覧を参照することはできますが、データとしては取得ができませんでした。
ということで、スクレイピングさせていただきました。
注意
スクレイピングする際には、利用規約などに準拠するように注意してください。
メンバー数の取得
connpassのメンバー一覧ページはページネーションされているのですが、何ページまでかがレスポンスコードで判別できなかったので、メンバー数から計算します。
import requests, datetime, re
from bs4 import BeautifulSoup
user_agent = 'Mozilla/5.0'
url = 'https://jedai.connpass.com/participation/'
r = requests.get(url, headers={"User-Agent": user_agent})
soup = BeautifulSoup(r.text, "html.parser")
num_members = soup.find("h3", "title inline").get_text()
print(num_members)
num_members = re.search(r'\d+', num_members).group()
print(num_members)
他のメンバー(1438人)
1438
ページ数の計算
管理者数含めてないのでザックリと計算。
member_per_page = 100
page_total = int(int(num_members) / member_per_page) + 1
print(page_total)
15
メンバー加入日の抽出
def drug_data(page):
url = 'https://jedai.connpass.com/participation/?page=' + str(page)
print(url)
r = requests.get(url, headers={"User-Agent": user_agent})
soup = BeautifulSoup(r.text, "html.parser")
ret_text_list = []
elems = soup.find_all("td", "join_date")
for element in elems:
join_date_str = element.get_text()
join_date_str = re.sub("\(*.\)", "", join_date_str)
#print(join_date_str)
dte = datetime.datetime.strptime(join_date_str, '%Y/%m/%d')
ret_text_list.append(dte)
return ret_text_list
members = []
count = 1
while(count <= page_total):
ret_text_list = drug_data(count)
for element in ret_text_list:
members.append(element)
count = count + 1
https://jedai.connpass.com/participation/?page=1
https://jedai.connpass.com/participation/?page=2
https://jedai.connpass.com/participation/?page=3
https://jedai.connpass.com/participation/?page=4
https://jedai.connpass.com/participation/?page=5
https://jedai.connpass.com/participation/?page=6
https://jedai.connpass.com/participation/?page=7
https://jedai.connpass.com/participation/?page=8
https://jedai.connpass.com/participation/?page=9
https://jedai.connpass.com/participation/?page=10
https://jedai.connpass.com/participation/?page=11
https://jedai.connpass.com/participation/?page=12
https://jedai.connpass.com/participation/?page=13
https://jedai.connpass.com/participation/?page=14
https://jedai.connpass.com/participation/?page=15
メンバー数の確認
len(members)
合ってました(管理者も含まれています)。
1445
import pandas as pd
df_members = pd.DataFrame(members)
df_members.columns = ['join_date']
df_members = df_members.sort_values("join_date")
display(df_members)
日毎の加入者の集計
累積値を計算するために日毎の合計加入者を計算します。
df_members_groupby_data = df_members.groupby('join_date').size().to_frame('size').reset_index()
display(df_members_groupby_data)
累積メンバー数の計算
累積値を計算します。
df_members_groupby_data['cum_size'] = df_members_groupby_data['size'].cumsum()
display(df_members_groupby_data)
イベントをマッピングすることで、さらに情報を得ることができます。