Dova_S音乐网站爬虫 DOVA-SYNDROME站点 DOVA-SYNDROME是一个免版权音乐站点，内含大量免版权音乐，截止至文章发布时已收录9690首曲目。 作为独立创作者来讲，免版权音乐带来的商业价值是非常可观的，可以免登陆在网站选择任意一首曲目下载并应用于商业，但由于网站是海外站点，下载和试听对国内用户并不太友好。 [button color="info" icon="" url="https:\/\/dova-s.jp/" type=""]前往DOVA-SYNDROME[/button] 如何实现该站点爬虫 与大多数爬虫相同，都调用了BeautifulSoup和requests库，为了更良好的适应网站结构，首先要对网站结构进行观察。 DOVA-SYNDROME进行过几次改版，很明显目前站点搭载了伪静态，观察控制台后发现，点击获取标签导航连接的时候，会提交Get请求，携带SQL查询。之后观察所跳转的页面源码，有每个曲目的单独链接，进入链接之后观察发现歌曲含代各种类型播放器，通过Post至H5播放器页面下可以观察到源码下包含Mp3文件链接。于是一切都清晰明了了，只需要模拟这个流程，去掉冗余操作。 i> 以下代码仅记录关键部分 使用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爬虫 i> 使用方式很简单，目前写了两个爬虫版本。 下载版 @> 下载版提供的功能便是批量爬取音频资源并下载。 我在上面已提供了多种常用歌曲风格的标签索引，只需要复制对应歌曲情绪标签后的SQL注入查询语句，粘贴至下面回车。 例如：想下载该站点下带有绝望情绪的歌曲，复制run.html?tags=m26，粘贴在底部回车确认即可。 之后只需要输入开始下载的页码，和结束页码，以及下载歌曲存储的地址，即可开始自动下载。 以上 同时，对于SQL的查询预设，除了上面我默认提供的外，只要在站点内任意页面下，打开浏览器的检察元素发现有run.html?tags=xxx格式的tag，都可以复制对应的查询语句至爬虫内，爬虫将会识别并跳转至对应标签进行下载。 下载完成后将显示下载成功与失败数量，文件的下载速度取决于不同地区的网速。 建议下载完成后至对应页面核对，确定歌曲收录无误。 列表版 @> 列表版提供的功能是批量爬取并输出音频URL+曲名。 列表版相比下载版唯一不同的是，不会对歌曲进行下载，而是输出爬取到的音乐下载链接和音乐文件名到2个文本文件内。 用户可自行选择通过IDM、迅雷、Aria2等这类第三方下载器批量下载，并自行批量重命名。 下载链接