ホロライブの配信スケジュールであるホロジュールをスクレイピングして内容を簡易的にCLIで表示するプログラムを作りました。
ソースコード
利用上の注意
このツールは外部ライブラリとしてrequestsを使っています。pipをすでにインストールしている場合
pip install requests で対応できます
また、このツールはホロライブ公式と全く関係がありません。必要以上の実行でサーバーに負担をかけないようにしてください。
###使い方
リポジトリ内のmain.pyを実行することで以下のような内容を表示できます。
また、実行時にオプションをつけることができ、--helpでその内容を確認することができます。例として、
- --all ホロスターズなどを含む、Bilibili動画以外のすべてのスケジュールを表示
- --eng メンバーの名前を英語で表示
- --tomorrow 明日のスケジュールを表示
などが使えます。これらのオプションは同時に設定して実行することができます。
####Notes
製作にあたり、自分が詰まったところをメモします。
まず、スクレイピングで得られたデータの中から、どのようにホロライブメンバーとそれ以外を分けるか悩みました。対応として、
def delete_exception(time_list, stream_members_list, stream_url_list, is_all):
EXCEPTION_LIST = {'Yogiri', 'Civia', 'SpadeEcho', 'Doris', 'Artia', 'Rosalyn'}
if not is_all:
#Slice to get only non-hololive members (e.g. holostars hololive-ID)
EXCEPTION_LIST = EXCEPTION_LIST | set(get_member_list()[29:])
for i in range(len(time_list)):
if stream_members_list[i] in EXCEPTION_LIST:
time_list[i] = None
stream_members_list[i] = None
stream_url_list[i] = None
time_list = [i for i in time_list if not i is None]
stream_members_list = [i for i in stream_members_list if not i is None]
stream_url_list = [i for i in stream_url_list if not i is None]
return time_list, stream_members_list, stream_url_list
ホロライブのYoutube配信のメンバーと、Bilibili配信のメンバーの集合を予め用意しておき、
オプションなどから、除外するメンバーの集合を作り、それに属するスクレイピングした要素をNoneに置き換え、最後にまとめて内包表記で削除するようにしました。
ちなみに、リストでも同じように実装できますが、要素の番号がいらない場合、リストよりも集合を使ったほうが何倍も早いです。
もう一つ困ったこととして、名前が英語のメンバーと日本語のメンバーがいることで、半角全角の違いから列をきれいに揃えて表示できないという問題がありました。これを解決するために、標準ライブラリのunicodedataを使いました。
if unicodedata.east_asian_width(stream_members_list[i][0]) == 'W':
m_space = ' ' * ( (-2 * len(stream_members_list[i]) + 18))
else:
m_space = ' ' * ( (-1 * len(stream_members_list[i]) ) + 18)
unicodedataのeast_asian_widthは引数の文字(Charであるため一文字)が全角日本語の文字の場合Wを返してくれます。これによって、名前の文字数なども考慮しつつ、スペースを用いて揃った行で表示させることができました。
#####最後に
すでに何人かにクローンされていて嬉しく感じます。今後もこのリポジトリの改善に努めたいと思います。