文章目录
在确定下来选用MusicXML格式的乐谱作为研究对象以后,我们就要构建一个合适的数据集了。
The Choral Public Domain Library (CPDL)
The Choral Public Domain Library (CPDL)创立于1998年,是世界上最大的公共版权电子乐谱库之一,截至本文写作时已收录来自至少3623位作曲家的36481首声乐作品乐谱,其中部分乐谱提供多种格式的下载(MIDI、PDF、MusicXML、Sibelius等)。
CPDL中的英文歌曲共有9664首(截至2020.10),粗略估计了一下大致有一半提供了MusicXML格式。
点击任何一首歌曲的链接,会跳转到二级详情页面。
我们需要关注的主要是上图中红字标注的内容:
首行的标题也就是歌曲名称,括号里为作者。
Music files中列出了该首歌曲有哪些格式提供下载。上图圈出的绿色图标表示这首歌提供了MusicXML格式乐谱。
下方的General Information列出了歌曲的详细信息(标题、词曲作者、主奏乐器等等)。其中体裁(Genre)分为非宗教(Secular)和宗教(Sacred)。我们发现,大多数宗教歌曲的情感表达比较单一,所以在后续的处理中,我们会利用这一标签过滤掉宗教歌曲。
爬取MusicXML乐谱
因为是初次接触爬虫,没有选用Python直接编程,而是用了可视化工具GooSeeker。(偷懒)
CPDL的乐谱库是比较规整的二级页面形式,所以我们要设置两级爬虫,第一级爬虫爬取所有歌曲的二级页面链接,第二级爬虫进入链接并爬取歌曲详情页面的MusicXML文件、标题和体裁等信息。
第一级爬虫:获取歌曲二级页面链接
一级爬虫相对简单,根据GooSeeker的官方教程,新建了名为“CPDL”的爬取规则,抓取两项内容:Link(二级页面链接)和SongTitle(歌曲标题)。根据页面底部的“下一页”标记来实现自动翻页连续抓取。
第二级爬虫:抓取歌曲详情、下载MusicXML乐谱
一级爬虫获取了所有二级页面Link,我们将其作为线索定义规则“CPDL2”,如果歌曲有MusicXML的话就下载,并爬取其Title和Genre信息。
XPath定位所需元素
调试二级爬虫的过程中,遇到了一些问题。除了Title可以根据页面元素的相对位置进行定位之外,Genre和MusicXML出现的位置都不固定,经常出现爬取失败的情况。可视化方法受到局限了,这时需要结合XPath来构建爬虫规则。
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。(XPath_百度百科)
看完了一个B站的教学视频,对XPath有了初步的了解。我们到CPDL的歌曲详情页面试试看。
进入元素检查界面(我使用的Firefox),可以发现绿色的MusicXML图标指向的图片路径为
http://www.cpdl.org/wiki/images/5/58/MusicXML.png
我们要的是这个图标对应的链接所指向的MusicXML文件,XPath语句为
//a/img[@src='http://www2.cpdl.org/wiki/images/5/58/MusicXML.png']/../@href
在GooSeeker中修改规则:
同样地,用XPath语句定位Title和Genre。
//h1/text() ----Title可以直接用位置定位
//b[text()='Genre:']/following-sibling::a[1]/text() ----寻找“Genre:”文本的兄弟结点文本
规则定义完成后,开启DS打数机进行爬取。可在管理后台调度爬虫群实现多线程爬取,加快速度。
初步的数据清洗
筛选非空结果
爬虫得到的所有数据都存放在独立的文件夹中,可以看到一共爬取到5675组数据。
用Excel查看输出结果,发现有不少数据其实是空文件夹。
用筛选功能保留非空的Secular歌曲。
文件批量重命名
此外我们发现,得到的MusicXML乐谱的命名是不规范的,我们需要按照歌曲的标题进行重命名。这里参考的是GooSeeker官方的批量重命名教程,利用Excel的自动填充写批处理。
最后在Windows资源管理器中搜索".mxl",将文件copy到新文件夹中。
最终得到的有效数据量是1214,虽然不算很多但也基本够用了。