アドベントカレンダーの未登録日に誕生日を迎えるアイドルの担当Pに呼びかけるためのスクリプト
随分と日が過ぎてから書いていますが、
この記事は、アイドルマスター Advent Calendar 2020 の1日目の記事です。
アイドルマスター Advent Calendar 2020
https://adventar.org/calendars/4976
アドベントもあと1週間を切ってしまいましたが、
アドベントカレンダーには、まだまだ記事の未登録日が残っています。
私は12月16日の記事を書きましたが、
この日の記事を書いた理由は、担当アイドル「小日向美穂」の誕生日だからです。
同じ理由で記事を書くプロデューサーさんも居る可能性があるので、
未登録日に誕生日を迎えるアイドルの担当Pに呼びかけようと思います。
そこで、このエントリでは、
未登録日と対応アイドルをリストアップするスクリプトを書くことにします。
対象期間に誕生日を迎えるアイドルの抽出
対象期間、12月1日〜25日に誕生日を迎えるアイドルのリストを抽出します。
アイドルマスターのアイドルのプロフィールは、
im@sparqlと言うSPARQLエンドポイントから取得出来るので、
以下のコードで取得出来ます。
im@sparql
https://sparql.crssnky.xyz/imas/
from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd
import json
def get_idols_in_december():
"""
12月生まれのアイドル一覧を返却
"""
endpoint='https://sparql.crssnky.xyz/spql/imas/query'
query = """
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#>
SELECT ?name ?birth
WHERE {
?s a imas:Idol;
rdfs:label ?name;
schema:birthDate ?birth.
FILTER (?birth >= "--12-01"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>)
FILTER (?birth <= "--12-31"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>)
}
ORDER BY ?birth
"""
sparql = SPARQLWrapper(endpoint)
sparql.setReturnFormat(JSON)
sparql.setQuery(query)
results = sparql.query().convert()
lst = []
keys = results['head']['vars']
for x in results['results']['bindings']:
lst.append(dict([(k, x[k]['value']) if k in x else (k, "") for k in keys]))
return pd.read_json(json.dumps(lst), orient='records')
if __name__ == "__main__":
# 12月誕生日アイドル一覧
birth = get_idols_in_december()
print("12月誕生日アイドル一覧")
print(birth)
実行結果は、以下のようになります。
12月誕生日アイドル一覧
name birth
0 本田未央 --12-01
1 喜多見柚 --12-02
2 野々原茜 --12-03
3 黛冬優子 --12-04
4 水野翠 --12-05
5 十時愛梨 --12-08
6 卯月巻緒 --12-12
7 塩見周子 --12-12
8 サイネリア --12-14
9 中谷育 --12-16
10 大和亜季 --12-16
11 小日向美穂 --12-16
12 横山千佳 --12-18
13 大河タケル --12-21
14 イヴ・サンタクロース --12-24
15 信玄誠司 --12-24
16 萩原雪歩 --12-24
17 大崎甘奈 --12-25
18 大崎甜花 --12-25
19 望月聖 --12-25
20 柊志乃 --12-25
21 松原早耶 --12-28
22 斉藤洋子 --12-29
23 真鍋いつき --12-29
24 高山紗代子 --12-29
アドベントカレンダー未登録日の抽出
次に、アドベントカレンダーの未登録日を抽出します。
ここでは、ADVENTARの「アイドルマスター Advent Calendar 2020」のページを
スクレイピングして取得することにします。
以下のコードで取得出来ます。
from bs4 import BeautifulSoup
import pandas as pd
import requests
import datetime
def get_empty_advent_dts():
"""
アドベントカレンダーの未登録日一覧を返却
"""
dtlist_advent = ["12/{}".format(d) for d in range(1,26)]
url = "https://adventar.org/calendars/4976"
headers = {"User-Agent": "python requests"}
resp = requests.get(url, timeout=10, headers=headers)
raw_text = resp.text
soup = BeautifulSoup(raw_text, "html5lib")
ul = soup.find("ul", class_="EntryList")
lilist = ul.find_all("li")
for li in lilist:
dtlist_advent.remove(li.find("div", class_="date").text)
dtlist = ["--{:02}-{:02}".format(int(x.split('/')[0]), int(x.split('/')[1])) for x in dtlist_advent]
return pd.DataFrame({"dt": dtlist})
if __name__ == "__main__":
# 未登録日一覧
empty_dts = get_empty_advent_dts()
print("未登録日一覧")
print(empty_dts)
実行結果は、以下のようになります。
未登録日一覧
dt
0 --12-05
1 --12-07
2 --12-09
3 --12-10
4 --12-11
5 --12-13
6 --12-17
7 --12-18
8 --12-25
結果の出力
必要な情報は揃ったので、これらを日付でjoinすることで、
未登録日と対応アイドルをリストアップする事が出来ます。
PandasのDataFrameの形にしておいたので、
mergeメソッドで簡単に求める事が出来ます。
次のようになります。
if __name__ == "__main__":
# 未登録日一覧
empty_dts = get_empty_advent_dts()
print("未登録日一覧")
print(empty_dts)
# 12月誕生日アイドル一覧
birth = get_idols_in_december()
print("12月誕生日アイドル一覧")
print(birth)
# 未登録日と誕生日アイドルの対応
result = empty_dts.merge(birth, left_on='dt', right_on='birth', how='left')[['dt','name']]
print("未登録日と対応誕生日アイドル")
print(result)
実行結果は、以下のようになります。
未登録日と対応誕生日アイドル
dt name
0 --12-05 水野翠
1 --12-07 NaN
2 --12-09 NaN
3 --12-10 NaN
4 --12-11 NaN
5 --12-13 NaN
6 --12-17 NaN
7 --12-18 横山千佳
8 --12-25 大崎甘奈
9 --12-25 大崎甜花
10 --12-25 望月聖
11 --12-25 柊志乃
ということで、こちらのアイドルの担当プロデューサーさんのみなさま、
アドベントカレンダーの登録をよろしくお願いします!