Dova_S音乐网站爬虫
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,都可以复制对应的查询语句至爬虫内,爬虫将会识别并跳转至对应标签进行下载。
下载完成后将显示下载成功与失败数量,文件的下载速度取决于不同地区的网速。
建议下载完成后至对应页面核对,确定歌曲收录无误。
列表版
列表版相比下载版唯一不同的是,不会对歌曲进行下载,而是输出爬取到的音乐下载链接和音乐文件名到2个文本文件内。
用户可自行选择通过IDM、迅雷、Aria2等这类第三方下载器批量下载,并自行批量重命名。
下载链接
版权属于:Container_Z
本文链接:https://container-z.cn/archives/personal-software-project-dovas-music-website-crawler.html
转载时须注明出处及本声明