Dova_S音乐网站爬虫

フリーBGM(音楽素材)無料ダウンロード|DOVA-SYNDROME

DOVA-SYNDROME站点

DOVA-SYNDROME是一个免版权音乐站点,内含大量免版权音乐,截止至文章发布时已收录9690首曲目。
作为独立创作者来讲,免版权音乐带来的商业价值是非常可观的,可以免登陆在网站选择任意一首曲目下载并应用于商业,但由于网站是海外站点,下载和试听对国内用户并不太友好。

如何实现该站点爬虫

与大多数爬虫相同,都调用了BeautifulSoup和requests库,为了更良好的适应网站结构,首先要对网站结构进行观察。
DOVA-SYNDROME进行过几次改版,很明显目前站点搭载了伪静态,观察控制台后发现,点击获取标签导航连接的时候,会提交Get请求,携带SQL查询。之后观察所跳转的页面源码,有每个曲目的单独链接,进入链接之后观察发现歌曲含代各种类型播放器,通过Post至H5播放器页面下可以观察到源码下包含Mp3文件链接。于是一切都清晰明了了,只需要模拟这个流程,去掉冗余操作。

以下代码仅记录关键部分

使用session实例化会话链接,并设立各种用于头文件的字段

se=requests.session()
class Dova_s_bgm():
    def __init__(self):
        self.tag_url="https://dova-s.jp/_contents/settingSound/"+self.input_url
        self.target_url = 'https://dova-s.jp/bgm/index.html?page='
        self.main_url = 'https://dova-s.jp'
        self.headers = {
            'Referer': 'https://dova-s.jp/',
            'Accept-Language':'zh-CN,zh;q=0.8,ja;q=0.6,en-US;q=0.4,en;q=0.2',
            'Connection':'keep-alive',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'
        }

建立会话链接方法,建立Post至H5页面方法,建立无响应重载方法方法,建立抓取网页标题以及地址方法。

    def login(self):
        se.post(self.tag_url,headers=self.headers)

    def get_form(self,jump_to_url):
        data={
            'playerSelect': 2
            }
        try:
            se.post(jump_to_url, data=data, headers=self.headers)
        except:
            print('被网站拒绝访问,再次尝试中')
            self.get_form(jump_to_url)

    def get_html(self, url, timeout):
        try:
            return se.get(url, headers=self.headers, timeout=timeout)
        except:
            print('获取网页出错,5秒后将会重新获取')
            time.sleep(5)
            return self.get_html(url, timeout)

    def get_bgm(self, html, page_num):
        li_soup = BeautifulSoup(html, 'lxml')  # 传入第page_num页的html
        li_list = li_soup.find_all('dl', attrs={'class', 'item'})   # 找到dl所在位置
        for li in li_list:
            href = li.find('a')['href']  # 直接提取第一个href
            jump_to_url = self.main_url + href  # 跳转到目标的url
            self.get_form(jump_to_url)
            jump_to_html = self.get_html(jump_to_url, 3).text  # 获取音频网页的html

            try:
                bgm_soup = BeautifulSoup(jump_to_html, 'lxml')
                bgm_info = bgm_soup.find(id="HTML5").find_all(name='script')
                bgm_info = re.findall( r'[a-zA-z]+://[^\s]*.mp3', str(bgm_info), re.M|re.I)
                id_info = bgm_soup.find('div', attrs={'class', 'contents'}).find('div', attrs={'class', 'titleArea'}).find(name='p').getText()
                src = bgm_info[0] # 提取到的音频地址
                title = id_info# 提取到的标题
            except: 
                 print('该音频资源404,可能网站上已经下架,程序将跳过此音频下载')

之后先调用login方法建立会话链接,通过循环,设置一段页码区间,以页码作为循环标量,执行get_html(self.target_url + str(当前页码), 超时参数),获取返回的歌曲页面html,再将其调入get_bgm()执行即可(get_bgm内将获得对应地址)。

    def work(self):
        self.login()
        for page_num in range(开始页码, 结束页码):  # 设置页数
            now_html = self.get_html(self.target_url + str(page_num), 3)  # 获取歌曲列表页Html
            self.get_bgm(now_html.text, page_num)  # 获取地址

dova_s_bgm = Dova_s_bgm()
dova_s_bgm.work()

如何使用Dova_S爬虫

使用方式很简单,目前写了两个爬虫版本。

下载版


下载版页面

我在上面已提供了多种常用歌曲风格的标签索引,只需要复制对应歌曲情绪标签后的SQL注入查询语句,粘贴至下面回车。
例如:想下载该站点下带有绝望情绪的歌曲,复制run.html?tags=m26,粘贴在底部回车确认即可。

之后只需要输入开始下载的页码,和结束页码,以及下载歌曲存储的地址,即可开始自动下载。

以上
后续需要的填写项目

同时,对于SQL的查询预设,除了上面我默认提供的外,只要在站点内任意页面下,打开浏览器的检察元素发现有run.html?tags=xxx格式的tag,都可以复制对应的查询语句至爬虫内,爬虫将会识别并跳转至对应标签进行下载。

下载完成后将显示下载成功与失败数量,文件的下载速度取决于不同地区的网速。
建议下载完成后至对应页面核对,确定歌曲收录无误。
下载内容与Dova_S页面内容

列表版


列表版相比下载版唯一不同的是,不会对歌曲进行下载,而是输出爬取到的音乐下载链接和音乐文件名到2个文本文件内。
用户可自行选择通过IDM、迅雷、Aria2等这类第三方下载器批量下载,并自行批量重命名。
列表文件

下载链接

【 此处内容需要评论回复,待审核通过后刷新页面方可显示。】

Last modification:July 23rd, 2023 at 07:02 pm
如果觉得我的文章对你有用,请随意赞赏