












今日突然在一个 A 科群里发现群友正在用一个机器人玩猜歌名的游戏(Arcaea 开字母),如下图:

本古董 A 科玩家已经退坑了四年,最近回坑看着这多出来的几百首新曲实在是无能为力(南村群童欺我老无力),于是想着能不能写一个 Python 程序帮助我匹配。(绝不是想要作弊
想要做到匹配曲名,首先当然是需要有一个完整的曲名库作为数据源。我首先想到的方法是爬取 Arcaea Fandom - Songs by Date 页面中的曲名。尝试后发现,该页面的 HTML 组织稍有混乱,难以匹配所有的曲目。
具体来说,该页面中包含了曲目名称的 HTML 元素是这样的:
1 | <a href="/wiki/Memory_Forest" title="Memory Forest">Memory Forest</a> |
于是我尝试用以下代码来匹配它:
1 | a_tags = soup.find_all("a", href=re.compile(r"^/wiki/"), title=True) |
很快我就发现,有些曲目的 HTML 源码并不能被匹配到,例如:
1 | <a href="/wiki/%CE%9C" title="Μ">µ</a> |
实际爬取到的曲目数量仅有 424 首,与实际的 465 首相差甚远。
1 | import re |
可以看到,其中定义了列表 false_titles 和 missing_titles 来手动剔除错误的匹配结果以及添加缺少的结果。
然后我突然想起来,网易云上有个 Arcaea 电台。
不同于一般网站,网易云不知用什么方法使得其音乐列表无法被 requests 库获取,无法使用一般的 bs4 & requests 经典组合爬取。猜测是使用了网页脚本刷新内容。
本人倒是在很久以前写过的一个网易云爬虫,使用的是 cloudmusic 库。该库已经很久没人维护和使用了,而且似乎也不支持电台查询。
于是我便谷歌了一下网易云的爬虫方案,找到了一个使用 selenium 自动化测试框架模拟浏览器的方法:
1 | from random import randint |
其中,电台内每个曲目的 HTML 源码如下所示:
1 | <a href="/program?id=1368523734" title="Memory Forest">Memory Forest</a> |
此处可采用如下方式进行匹配:
1 | song_list = browser.find_elements( |
经简单观察和测试,并未发现多余的结果。
来自群机器人的题目形式如同 ?e?e?i?(Genesis)。
在 ChatGPT 的帮助下快速的完成了如下的代码:
1 | import argparse |
程序启动后进入一个循环中,持续接受用户输入并与文件中的曲名作匹配。
如果用户输入的模式串以 + 结束,则在模式串最后添加一个 .* 来匹配不定长度的曲名。
Batch_Mode
可以看到,代码中存在一个未完成的 batch mode。
我本来是打算将他用于批量匹配曲名的,但是刚开始实现不久我就发现,在 Hyprland 环境下我的 linuxqq-nt-bwrap 无法将其中的内容复制到系统的粘贴板上。但是我却能够将系统粘贴板中的东西粘贴到 qq 里,颇为神奇。。
On this page
Arcaea 曲名匹配器
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。