はじめに
ガールフレンド(仮)(以下、GFと表記)には、特定のイベントで使用可能なアイテムとして「勇気炭酸」というものが存在する。
このアイテムはイベントごとに名称が異なり、「勇気炭酸グレープ」、「勇気炭酸ライチ」のようなオーソドックスなものから、「勇気炭酸マヨネーズ」、「勇気炭酸チーズ」といった変わり種まで、様々なフレーバーが登場している。
軽く調べた程度ではこの炭酸名をまとめたサイトは見つからなかったため、自分で調べることにした。
(1) 公式ブログに載っている分だけ
GF公式ブログ*1で「勇気炭酸」と検索し、さまざまな勇気炭酸を見つける。
ヒットした記事は全364件であり、(当たり前だが)記事検索には正規表現が使えないため、普通ならここからは人力で確認する必要がある。
しかし面倒なのでBeautifulSoupを使ってスクレイピングし、正規表現で炭酸名のみ取り出す。
検索にヒットした記事のタイトルや概要はdocument.querySelectorAll(".PcEntryListItem_Entry").innerText()
(javascript)で確認できると分かったので、このセレクタを使う。
(注: 以下は「勇気炭酸(ひらがなorカタカナ)」を探すコードであり、「勇気炭酸黒糖」など漢字を含む炭酸はヒットしないことに注意)
pages_len = 37 find_tansan_set = set() for page in range(2, pages_len+1): url = f"https://search.ameba.jp/search/entry/勇気炭酸.html?aid=girlfriend-kari&p={page}" res = requests.get(url) time.sleep(5) soup = BeautifulSoup(res.text, "html.parser") find_tansan_list = [re.findall("勇気炭酸[ぁ-ゔァ-ヴー]+", find.get_text()) for find in soup.find_all("div", {"class": "PcEntryListItem_Entry"})] find_tansan_set |= set(sum(find_tansan_list, [])) print(find_tansan_set)
出力↓
{'勇気炭酸ラムネが', '勇気炭酸ホワイト', '勇気炭酸がついてきます', '勇気炭酸ラムネ', '勇気炭酸グレープ', '勇気炭酸ブルーハワイが', '勇気炭酸イチゴ', '勇気炭酸ユズ', '勇気炭酸ブラック', '勇気炭酸バナナ', '勇気炭酸アップル', '勇気炭酸も', '勇気炭酸オレンジ', '勇気炭酸ブルー', '勇気炭酸グリーン', '勇気炭酸レッド', '勇気炭酸マンゴー', '勇気炭酸ブルーハワイ', '勇気炭酸ミックス', '勇気炭酸ジンジャー', '勇気炭酸ライム', '勇気炭酸アセロラ', '勇気炭酸マスカット', '勇気炭酸コーラ', '勇気炭酸が', '勇気炭酸ピーチ', '勇気炭酸レモン', '勇気炭酸グリーンアップルも', '勇気炭酸ローズ', '勇気炭酸サイダー', '勇気炭酸チェリー', '勇気炭酸メロン', '勇気炭酸ピンク', '勇気炭酸サクラ', '勇気炭酸キャラメル', '勇気炭酸ブラウン', '勇気炭酸パープル', '勇気炭酸グリーンアップル', '勇気炭酸ココナッツ', '勇気炭酸ライチ', '勇気炭酸アサイー', '勇気炭酸ネイビー', '勇気炭酸を', '勇気炭酸キウイ'}
ヒットした炭酸に「勇気炭酸(ひらがな)」という名前のものは存在しなかったため、「勇気炭酸(カタカナ)」のみ表示する。
print(set(sum([re.findall("勇気炭酸[ァ-ヴー]+", word) for word in find_tansan_set], [])))
出力↓
{'勇気炭酸ホワイト', '勇気炭酸グレープ', '勇気炭酸ラムネ', '勇気炭酸イチゴ', '勇気炭酸ブラック', '勇気炭酸ユズ', '勇気炭酸アップル', '勇気炭酸バナナ', '勇気炭酸オレンジ', '勇気炭酸ブルー', '勇気炭酸グリーン', '勇気炭酸レッド', '勇気炭酸キウイ', '勇気炭酸マンゴー', '勇気炭酸ブルーハワイ', '勇気炭酸ミックス', '勇気炭酸ジンジャー', '勇気炭酸ライム', '勇気炭酸マスカット', '勇気炭酸コーラ', '勇気炭酸ピーチ', '勇気炭酸レモン', '勇気炭酸ローズ', '勇気炭酸サイダー', '勇気炭酸チェリー', '勇気炭酸メロン', '勇気炭酸ピンク', '勇気炭酸サクラ', '勇気炭酸キャラメル', '勇気炭酸ブラウン', '勇気炭酸パープル', '勇気炭酸グリーンアップル', '勇気炭酸ココナッツ', '勇気炭酸ライチ', '勇気炭酸アサイー', '勇気炭酸ネイビー', '勇気炭酸アセロラ'}
この方法の問題点
- 上記コードでは、前述した「勇気炭酸黒糖」など、漢字混じりの炭酸を見つけることができない
- (追記)英字ひらカナを除外検索したところ「勇気炭酸小豆」を見つけることができたが、これ以外にも存在するかは不明
- GF公式ブログが勇気炭酸に言及したのは2016年08月10日*2(勇気炭酸グリーンアップル)がおそらく最後で、それ以降の炭酸については不明
(2) 個人サイトから収集
上記問題を解決するため、より長い期間記録を取っているサイトを探した。
幸いなことに、現在に至るまでGFのキュピ(いわゆるガチャ)情報をまとめてくださっているサイトを発見した。
キュピ情報には、キュピを引くことにより得られるアイテムが記載されているため、ここから多くの炭酸名を見つけることができる。
上記と同様に「勇気炭酸」で検索+スクレイピングを行った際のコードと結果を以下に示す。
def flatten(lstlst: list[list[Any]]): return sum(lstlst, []) # 最初に検索結果画面のデータを全部取得 pages_len = 36 res_list = [] for page in range(pages_len): url = f"http://tsukataga.blog54.fc2.com/blog-entry-3566.html?q=勇気炭酸&page={page}" res_list.append(requests.get(url)) time.sleep(10) # サーバに負荷をかけないように10秒待機 # 記事の投稿日と、記事概要に含まれている勇気炭酸名を取得 tansans = [] ; dates = [] for res in res_list: soup = BeautifulSoup(res.text, "html.parser") dates += flatten([_.get_text().split() for _ in soup.select("#titlelist > tr > td:nth-child(2)")]) # 記事投稿日 abstracts = [find.attrs["title"] for find in soup.select("#titlelist > tr > td:nth-child(4) > a")] # 記事概要 tansans += [re.findall("勇気炭酸[^a-zA-Z0-9付」×.]+", abst) for abst in abstracts] # 重複の除外 result = {} for t, d in zip(tansans, dates): if not t: continue # 炭酸名が記事概要になければスキップ result[t[0]] = d # 順序を保持しながら重複を除外 辞書の上書きを利用(最も早い投稿日が記録される) result = list(result.items()) # タプルのリストに戻す # 出力 for t, d in result: print(f"{t} ({d})")
出力↓
勇気炭酸チーズ (2023/01/05) 勇気炭酸練乳 (2022/12/13) 勇気炭酸黒糖 (2022/11/07) 勇気炭酸キャロット (2022/10/08) 勇気炭酸ブドウ (2022/09/02) 勇気炭酸えだ豆 (2022/08/02) 勇気炭酸ハチミツ (2022/07/06) 勇気炭酸ハスカップ (2022/06/06) 勇気炭酸バジル (2022/05/03) 勇気炭酸ハイビスカス (2022/04/10) 勇気炭酸マヨネーズ (2022/03/04) 勇気炭酸コケモモ (2022/02/06) 勇気炭酸ビワ (2022/01/05) 勇気炭酸ナタデココ (2021/12/13) 勇気炭酸ティー (2021/11/07) 勇気炭酸シソ (2021/10/08) 勇気炭酸紫イモ (2021/09/02) 勇気炭酸ケール (2021/08/02) 勇気炭酸ポンカン (2021/07/06) 勇気炭酸アクア (2021/06/06) 勇気炭酸カボス (2021/05/03) 勇気炭酸イチゴミルク (2021/04/10) 勇気炭酸スダチ (2021/03/04) 勇気炭酸カスタード (2021/01/05) 勇気炭酸ミルク (2020/12/13) 勇気炭酸アイスティー (2020/11/07) 勇気炭酸ネクタリン (2020/10/08) 勇気炭酸スモモ (2020/09/02) 勇気炭酸オリーブ (2020/08/02) 勇気炭酸ドリアン (2020/07/06) 勇気炭酸アケビ (2020/06/06) 勇気炭酸ピスタチオ (2020/05/03) 勇気炭酸カリン (2020/03/04) 勇気炭酸グレープフルーツ (2020/01/05) 勇気炭酸マンゴスチン (2019/12/13) 勇気炭酸カフェオレ (2019/11/08) 勇気炭酸クランベリー (2019/10/08) 勇気炭酸パッションフルーツ (2019/09/02) 勇気炭酸スターフルーツ (2019/08/02) 勇気炭酸パンプキン (2019/07/06) 勇気炭酸イオン (2019/06/06) 勇気炭酸アボカド (2019/05/03) 勇気炭酸ベリー (2019/04/13) 勇気炭酸グァバ (2019/03/04) 勇気炭酸梨 (2019/01/05) 勇気炭酸ソイ (2018/12/13) 勇気炭酸チョコ (2018/11/07) 勇気炭酸トマト (2018/10/08) 勇気炭酸ブルーベリー (2018/09/02) 勇気炭酸スウィーティー (2018/08/02) 勇気炭酸プリン (2018/07/06) 勇気炭酸スカイ (2018/06/06) 勇気炭酸抹茶 (2018/05/03) 勇気炭酸梅 (2018/04/13) 勇気炭酸シークワーサー (2018/03/04) 勇気炭酸パパイヤ (2018/01/05) 勇気炭酸ヨーグルト (2017/12/13) 勇気炭酸チャイ (2017/11/07) 勇気炭酸ラズベリー (2017/10/08) 勇気炭酸プルーン (2017/09/02) 勇気炭酸シーソルト (2017/06/06) 勇気炭酸ストロベリー (2017/04/13) 勇気炭酸グリーンアップル (2016/08/02) 勇気炭酸マンゴー (2016/07/02) 勇気炭酸ブルーハワイ (2016/06/03) 勇気炭酸マスカット (2016/05/02) 勇気炭酸サクラ (2016/04/02) 勇気炭酸小豆 (2016/03/02) 勇気炭酸ミックス (2016/02/02) 勇気炭酸アセロラ (2016/01/02) 勇気炭酸ココナッツ (2015/12/06) 勇気炭酸キャラメル (2015/11/03) 勇気炭酸メロン (2015/10/03)
今後の課題
- おそらく漏れがある
- 参考までに、2022年末までのマイヒーローの開始日を示しておく
マイヒーロー開始日。ここを押して展開
// https://gfkari.gamedbs.jp/event からDevTool(javascript)で取得した [ "2023/1/14", "2022/12/14", "2022/11/14", "2022/10/14", "2022/9/14", "2022/8/14", "2022/7/14", "2022/6/14", "2022/5/14", "2022/4/14", "2022/3/14", "2022/2/11", "2022/1/14", "2021/12/14", "2021/11/14", "2021/10/14", "2021/9/13", "2021/8/14", "2021/7/14", "2021/6/14", "2021/5/14", "2021/4/14", "2021/3/14", "2021/2/11", "2021/1/13", "2020/12/14", "2020/11/14", "2020/10/14", "2020/9/13", "2020/8/14", "2020/7/14", "2020/6/13", "2020/5/14", "2020/4/12", "2020/3/14", "2020/2/13", "2020/1/14", "2019/12/14", "2019/11/14", "2019/10/14", "2019/9/14", "2019/8/14", "2019/7/14", "2019/6/14", "2019/5/14", "2019/4/14", "2019/3/14", "2019/2/10", "2019/1/13", "2018/12/14", "2018/11/13", "2018/10/13", "2018/9/14", "2018/8/14", "2018/7/14", "2018/6/14", "2018/5/13", "2018/4/14", "2018/3/14", "2018/2/11", "2018/1/14", "2017/12/14", "2017/11/12", "2017/10/14", "2017/9/13", "2017/8/13", "2017/7/14", "2017/6/13", "2017/5/13", "2017/4/14", "2017/3/12", "2017/2/10", "2017/1/14", "2016/12/13", "2016/11/13", "2016/10/13", "2016/9/13", "2016/8/11", "2016/7/14", "2016/6/14", "2016/5/14", "2016/4/13", "2016/3/13", "2016/2/13", "2016/1/15", "2015/12/14", "2015/11/14", "2015/10/14", "2015/9/13", "2015/8/15" ]
念のため取得に使ったコードも載せる。
res = [] document.querySelectorAll("li[t='raid']").forEach((e)=>{ m = e.innerText.match(/マイヒーロー/) if (m) res.push(m.input.match(/[0-9]+\/[0-9]+\/[0-9]+/g)[1]) }) res
参考文献
- 10分で理解する Beautiful Soup - Qiita
- re --- 正規表現操作 — Python 3.11.2 ドキュメント
- 正規表現: ひらがなとカタカナを正規表現で表す|まくろぐ
[あ-んア-ン]
で全ひらがな・カタカナを指定できると思っていたが、違うことがわかり勉強になった。