Container.Zero - Python
type: channel
link: https://blog.container-z.art/tag/Python/
items: 【个人软件项目】Dova_S音乐网站爬虫

【个人软件项目】Dova_S音乐网站爬虫
type: item
date: 2020-03-10T19:10:00+08:00
description: 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]+…