每日爬虫:爬百度千千音乐

文章目录

    • 前言:
    • 总结:

前言:

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、代码写的过于繁琐,版本二得优化一下

你可能感兴趣的:(爬虫学习笔记)