3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ホロジュールをスクレイピングしてCLIで表示する

Last updated at Posted at 2020-05-29

ホロライブの配信スケジュールであるホロジュールをスクレイピングして内容を簡易的にCLIで表示するプログラムを作りました。 

ソースコード

GitHub

利用上の注意

このツールは外部ライブラリとしてrequestsを使っています。pipをすでにインストールしている場合
pip install requests で対応できます

また、このツールはホロライブ公式と全く関係がありません。必要以上の実行でサーバーに負担をかけないようにしてください。

###使い方
リポジトリ内のmain.pyを実行することで以下のような内容を表示できます。
alt

また、実行時にオプションをつけることができ、--helpでその内容を確認することができます。例として、

  • --all ホロスターズなどを含む、Bilibili動画以外のすべてのスケジュールを表示
  • --eng メンバーの名前を英語で表示
  • --tomorrow 明日のスケジュールを表示

などが使えます。これらのオプションは同時に設定して実行することができます。

####Notes
製作にあたり、自分が詰まったところをメモします。

まず、スクレイピングで得られたデータの中から、どのようにホロライブメンバーとそれ以外を分けるか悩みました。対応として、

scraping.py
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を使いました。
unicode
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を返してくれます。これによって、名前の文字数なども考慮しつつ、スペースを用いて揃った行で表示させることができました。

#####最後に
すでに何人かにクローンされていて嬉しく感じます。今後もこのリポジトリの改善に努めたいと思います。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?