qq音乐爬取分析

仅供个人学习研究使用

import requests



class QQMiusc:
    def __init__(self):
        # 获取歌曲列表MID参数
        self.song_id_url = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?'
        self.song_id_headers = {
            'origin': 'https://y.qq.com',
            'referer': 'https://y.qq.com/',
            'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \
              AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
        }
        self.song_id_params = {
            'type': '1',
            'json': '1',
            'utf8': '1',
            'onlysong': '0',
            'new_format': '1',
            'disstid': '1855128183',
            'g_tk_new_20200303': '704222412',
            'g_tk': 'xxxxxx',
            'loginUin': 'xxxxx',  # uin参数此处为个人登录信息
            'hostUin': '0',
            'format': 'json',
            'inCharset': 'utf8',
            'outCharset': 'utf - 8',
            'notice': '0',
            'platform': 'yqq.json',
            'needNewCode': '0',
        }

        # 获取歌曲下载链接
        self.song_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg'
        self.song_url_headers = {
            'origin': 'https://y.qq.com',
            'referer': 'https://y.qq.com/',
            'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \
                      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
        }

        # 下载歌曲参数
        self.download_headers = {
            'referer': 'https://y.qq.com/',
            'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \
                      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
        }

    def get_song_id(self):
        response = requests.get(self.song_id_url, headers=self.song_id_headers,
                                params=self.song_id_params)
        song_list = response.json()['cdlist'][0]['songlist']
        result =[]
        for each in song_list:
            name = each['name']
            mid = each['mid']
            result.append((name, mid))
        return result

    def get_song_url(self, song_id_list):
        result = []
        for song in song_id_list:
            song_url_params = {
                '-': 'getplaysongvkey9184990317001633',
                'g_tk': '704222412',
                'sign': 'zzaf7jfoyaca4jfrgz121abdc2d7c85c413eb2447570a56eb0',
                'loginUin': 'xxxxxxx',
                '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":"5667010700","calltype":0,"userip":""}},"req_0":\
                {"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":\
                {"guid":"5667010700","songmid":["' + song[1] + '"],\
                "songtype":[0],"uin":"xxxxxxx","loginflag":1,"platform":"20"}},\
                "comm":{"uin":xxxxxxx,"format":"json","ct":24,"cv":0}}'
            }
            response = requests.get(self.song_url, headers=self.song_url_headers, params=song_url_params)
            result.append((song[0],response.json()["req_0"]["data"]["midurlinfo"][0]["purl"]))
        return result

    def download(self,song_urls):
        try:
            base_url = 'https://isure.stream.qqmusic.qq.com/'
            for song in song_urls:
                print(f'正在爬{song[0]}')
                song_content = requests.get(base_url + song[1], headers=self.download_headers).content
                with open('./images/' + song[0] + '.m4a', 'wb') as f:
                    f.write(song_content)
        except Exception as e:
            print(e)

    def run(self):
        song_id_list = self.get_song_id()
        song_urls = self.get_song_url(song_id_list)
        self.download(song_urls)

if __name__ == '__main__':
    QQMiusc().run()
posted @ 2021-01-05 22:11  旁人怎会懂  阅读(392)  评论(0)    收藏  举报