前言:
1、爬取网站:千千音乐
2、说明:该网站属于商业网址,本案例仅用于学习测试,不用于其他用途。
3、技术路线:requests+re+os
4、代码
'''
百度音乐
version:01
author:金鞍少年
Date:2020-03-02
'''
import requests
import os
import re
class taiheMusic():
def __init__(self):
self.key = input('请输入您喜欢的明星:>>').strip()
self.item = {}
self.item['key'] = self.key
self.url = 'http://music.taihe.com/search?' # 网站url
self.path = r'./千千音乐/' + self.key +'/' # 保存路径
self.headers = {
"Referer": "http://music.taihe.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
}
# 获取HTMl
def getPageHTMl(self):
re = requests.get(url=self.url, headers=self.headers, params=self.item)
if re.status_code == 200:
re.encoding = re.apparent_encoding # 以网站编码为准
return re.text
# 获取歌曲名和 songid
def getContentHTMl(self,HtmlText):
MuiscName = re.findall('data-action="play" title="播放(.*?)"', HtmlText)
songid = re.findall(' href="/song/(\d+)', HtmlText)
for i in range(len(MuiscName)):
yield MuiscName[i], songid[i]
# 获取歌曲的下载链接
def songJsonUrl(self, name, songid):
urls = 'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC' \
'&format=jsonp&' \
'&songid='+str(songid)+'&' \
'from=web&_=1583128150041'
res = requests.get(urls, headers=self.headers).json()
if res:
mp3 = res['bitrate']['show_link']
yield name, mp3
# 下载MP3
def downloadMp3(self, name, mp3):
if not os.path.exists(self.path):
os.makedirs(self.path) # 递归创建文件夹
dmp3 = requests.get(mp3)
with open(self.path + '%s.mp3' % name, 'wb') as f:
f.write(dmp3 .content)
print('下载 %s成功' % name)
# 核心逻辑
def fun(self):
HtmlText = self.getPageHTMl()
for name, songid in self.getContentHTMl(HtmlText):
for name, mp3 in self.songJsonUrl(name,songid):
self.downloadMp3(name,mp3)
if __name__=='__main__':
Mp3 = taiheMusic()
Mp3.fun()
总结:
1、目前仅能实现输入歌手姓名下载歌手列表首页歌曲,没能实现分页功能。
2、获取到的页面内容有很多转义,使用正则表达式往往不能完全匹配。
3、代码写的过于繁琐,版本二得优化一下