qq音乐爬取音频

分析方法有道云笔记:
http://note.youdao.com/noteshare?id=e9d8f4e67a615a653c22df20c2187cc0

代码 :


from multiprocessing import Pool
import requests

class Qq:
    def __init__(self):
        self.base_url = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?'
        self.header = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Origin': 'https://y.qq.com',
            'Referer': 'https://y.qq.com/n/yqq/playsquare/7256830841.html',
            'Sec-Fetch-Mode': 'cors',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
        }
        self.param = {
            'type': '1',
            'json': '1',
            'utf8': '1',
            'onlysong': '0',
            'new_format': '1',
            'disstid': '7256830841',
            'g_tk': '680346545',
            'loginUin': '',
            'hostUin': '0',
            'format': 'json',
            'inCharset': 'utf8',
            'outCharset': 'utf-8',
            'notice': '0',
            'platform': 'yqq.json',
            'needNewCode': '0',
        }
        self.parse_mid()

    def parse_mid(self):
        response = requests.get(self.base_url, params=self.param, headers=self.header)
        #返回的是json格式的字符串
        str_json = response.json()
        mid_list = []
        for mids in str_json['cdlist'][0]['songlist']:
            mid = mids['mid']
            name = mids['name']
            mid_list.append((mid,name))
        # print(mid_list)
        p = Pool(4)
        #map函数自带打散功能,就相当于帮我们遍历了这里mid_list是元组列表过去下一个函数就只是个元组
        p.map(self.parse_purl,mid_list)


    def parse_purl(self,mid_info):
        mid = mid_info[0]
        name = mid_info[1]
        url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?'
        headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Origin': 'https://y.qq.com',
            'Referer': 'https://y.qq.com/portal/player.html',
            'Sec-Fetch-Mode': 'cors',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
        }

        param = {
            'g_tk': '680346545',
            'loginUin': '1154344105',
            'hostUin': '0',
            'format': 'json',
            'inCharset': 'utf8',
            'outCharset': 'utf-8',
            'notice': '0',
            'platform': 'yqq.json',
            'needNewCode': '0',
            'data': '{"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"742841678","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"742841678","songmid":["'+ mid +'"],"songtype":[0],"uin":"1154344105","loginflag":1,"platform":"20"}},"comm":{"uin":1154344105,"format":"json","ct":24,"cv":0}}',
        }
        response = requests.get(url,params=param,headers=headers)
        # print(response.text)
        str_json = response.json()
        # print(str_json)
        purl = str_json['req_0']['data']['midurlinfo'][0]['purl']
        print(name,purl)
        self.load(purl,name)

    def load(self,purl,name):
        url = 'http://isure.stream.qqmusic.qq.com/' + purl
        if purl:

            print(name,url)
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
            }
            response = requests.get(url,headers=headers)
            #文件存储路径和名字
            filename = 'D:\\qq_music2\\{}.{}'.format(name,'m4a')
            try:
                #读取音频需要二进制
                with open(filename,'wb') as k:
                    #获取返回的内容
                    k.write(response.content)
                    print('下载成功')
            except:
                print('下载失败')


if __name__ == '__main__':
    q = Qq()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值