python⾳乐爬⾍_Python爬⾍实践——4.好听⾳乐⽹轻⾳乐资
单恋曲
第三章的requests库阶段性demo,爬取好听⾳乐⽹的榜上歌曲。
此⽹站没有js混淆,⾳乐资源链接有规律,适合爬⾍新⼿上⼿。
⾸先观察⾸页和⾳乐榜的url链接关系,我们先⼿动模拟下载,chrome f12获取response,可探查到url规律如下:
1.
热播榜url为:
新曲榜url为:
由此可知hot、new、recommend、latest、gedan分别为各榜⼆级⽹址
2.再分析hot榜单内页码⽹址规律
男人信什么 歌词3.接着下载链接规律
其后我在运⾏爬⾍的时候发现部分资源会401,到对应的sid页⾯,f12排查,发现下载地址并不唯⼀,按mp3和m4a⽂件类型分别有两个地址:
smap成员实际运⾏爬⾍的时候,我们会发现经常有歌曲⽆法200正常下载,或者401或者抛出异常我⾃⼰分析的话,这有两种原因,
1.mp3格式url⽹址⽆效,需切换m4a⽹址下载
2.请求时间间隔太短,应设置1-2s,以防因为延迟和服务器原因⽆法正常爬取。
此demo主要考察python和程序设计基本功,requests库的应⽤较少,由此也发现异常处理、⽹址拼接、f12⼯具的使⽤、性能和代码质量考核等因素在爬⾍设计时是⾮常重要的,由此也看出⼀个设计优异的爬⾍框架对实际业务来说是⾮常重要的,连续爬取、防封、分布式爬取,提⾼性能门槛也是必须的业务要求,爬⾍随便⼏个demo写完看似很简单,但是简单的事如何做的有质量也是不简单的。
具体代码如下:
#SweetLightSpider
import re #python 的正则库
import requests #python 的requests库
好想爱这个世界啊歌词
importtimeimport random #随机选择
from requests import exceptions #requests 内置exception
classSweetLightMusicSpider:def __init__(self, page):
self.page=page#随机获取⾳乐榜单的⽹页信息text数据,取得songID准备为后续url拼接,获得songName获得歌曲名
def __getSong(self):
songID=[]
songName=[]
keyword= ["hot", "new", "recommend", "latest", "gedan"]
rankform=random.choice(keyword)print(rankform)for i inrange(0, self.page):
url= "www.htqyy/top/musicList/"+str(rankform)+"?pageIndex="+str(i)+"&pageSize=20"
#获得带有⾳乐id和name的信息的html⽂本
html =(url)
#正则匹配筛选信息
pat1 = r'title="(.*?)" sid'pat2= r'sid="(.*?)"'id_list=re.findall(pat2, strr)
title_list=re.findall(pat1, strr)#获得songID/Name数组
何润东演过的电视剧
song_list= SweetLightMusicSpider.__getSong(self)for x inrange(0, len(song_list[0])):
song_url= "f2.htqyy/play7/"+str(song_list[0][x])+"/"+"mp3"+"/12"song_name= song_list[1][x]
(song_url)print(response.status_code)
tif response.status_code == 200:print("正在下载第{0}⾸, 歌曲名为:《{1}》".format(x+1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data)print("第{0}⾸: 《{1}》 已下载完毕".format(x+1, song_name))elif response.status_code == 401:
time.sleep(2)print("重定向资源中")
song_url2= "f2.htqyy/play7/"+str(song_list[0]
[x])+"/"+"m4a"+"/12"(song_url2)print(response2.status_code)try:assert response2.status_code == 200
exceptexceptions.HTTPError as e:print(e)continue
else:
tprint("正在下载第{0}⾸, 歌曲名为:《{1}》".format(x + 1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data2)print("第{0}⾸: 《{1}》 已下载完毕".format(x + 1, song_name))
time.sleep(1)defmusic_Spider(self):
青春期中的插曲SweetLightMusicSpider.__songdownload(self)if __name__ == '__main__':
i= SweetLightMusicSpider(10)
i.music_Spider()
设置两个请求间隔为1s,重定向url为2s,调试如下,基本杜绝了
1.⽆法获取到的歌曲
2.下载错误为⼗⼏KB⽆法打开的歌曲  这两个运⾏异常bug
最后牺牲了部分爬取效率获得了爬取质量的提⾼:
最后检查E盘的⾳乐下载情况,没有下载错误,⽂件⼤⼩均在1-3mb,不存在⾳乐⽆法打开的情况
随便打开⼀⾸⽹易云播放器验证下:
没有问题,bingo。因为是轻⾳乐⽹站嘛,faded的纯乐器版。。。。。。i am faded  >_<