爬取QQ音樂指定歌曲

一、QQ音樂網站分析

1、歌曲信息接口分析
通過QQ音樂搜索指定歌手或歌曲,對頁面數據資源進行分析
在這裏插入圖片描述
在這裏插入圖片描述
按下f12開發者工具,點擊network,找尋頁面數據接口
在這裏插入圖片描述
將該接口地址複製到postman工具下進行請求,查看獲取到的數據
在這裏插入圖片描述
嘗試刪除一些參數,看看是否還是可以請求到指定的數據
只留下一下三個參數:
在這裏插入圖片描述
發現還是可以請求到指定數據
在這裏插入圖片描述
優化之後的接口:
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w=李榮浩

2、歌曲播放資源分析
點擊播放歌曲,打開開發者工具中的media,找到播放的鏈接
在這裏插入圖片描述
複製此鏈接到瀏覽器輸入欄
在這裏插入圖片描述
這就是我們最終需要的數據資源,我們需要拿到每個歌曲的播放地址,就可以實現歌曲的下載了

分析該鏈接地址
http://111.202.98.149/amobile.music.tc.qq.com/C400002TRY4a3zfxC8.m4a?guid=703417739&vkey=7B7DC7DDC36BCC5F0B4277260D53FE3D376C742CFB9B1206D29F6E1D137B7B3EDC5FB46C5DC244F53D372DFA85D31B9E542950C98826E44B&uin=741&fromtag=66

主要參數:

  • guid 固定參數
  • vkey 變化的
  • uin 固定參數,一般就是QQ號碼
  • fromtag 對結果沒影響,即使沒有也可以

還有就是C400與.m4a之間的一串字符也是變化的,經過查找發現爲media_mid
在這裏插入圖片描述
該js文件下有該鏈接的拼接的規則
在這裏插入圖片描述
在這裏插入圖片描述
經過驗證,可以將之前獲取的http://111.202.98.149/amobile.music.tc.qq.com替換爲http://dl.stream.qqmusic.qq.com/然後再進行拼接,這個js裏面顯示的爲C100,但是經過驗證,直接用C100是訪問不了的,應該經過處理,真正訪問還是以C400進行的。後面拼接StrMediaMid值或者Songmid值,然後.m4a?fromtage…

但是後來就發現這個思路還是不對,因爲該鏈接中還有其他參數,上面這個分析只能證明C400後面拼接的字符爲StrMediaMid值或者Songmid值,但是還有vkey值並沒有解決。所以就有下面這個接口作爲最終拼接的結果。

3、播放鏈接拼接的後綴url接口
在這裏插入圖片描述
對該url進行解碼:
在這裏插入圖片描述
在這裏插入圖片描述
https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey13880444756036847&g_tk=5381&loginUin=1094013271&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”:“5900616959”,“calltype”:0,“userip”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:“5900616959”,“songmid”:[“000sU9jC3bN2dY”],“songtype”:[0],“uin”:“1094013271”,“loginflag”:1,“platform”:“20”}},“comm”:{“uin”:1094013271,“format”:“json”,“ct”:24,“cv”:0}}

只需要留着後面的data參數字典即可,然後只需要更改songmid即可拿到不同歌曲的vkey值,這個接口有一個參數purl,是直接拼接好的,只需要拼接在域名地址後面即可正常的訪問歌曲播放鏈接

二、請求接口,解析數據

1、請求歌曲信息接口,並提取songmid和media_mid以及歌曲名稱

callback({
    "code": 0,
    "data": {
        "keyword": "李榮浩",
        "priority": 0,
        "qc": [],
        "semantic": {
            "curnum": 0,
            "curpage": 1,
            "list": [],
            "totalnum": 0
        },
        "song": {
            "curnum": 10,
            "curpage": 1,
            "list": [
                {
                    "albumid": 4801194,
                    "albummid": "004QnEHc3zjC7J",
                    "albumname": "耳朵",
                    "albumname_hilight": "耳朵",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 7,
                    "chinesesinger": 0,
                    "docid": "5480908422984286978",
                    "grp": [],
                    "interval": 279,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "002TRY4a3zfxC8",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 3360238371,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 86935,
                        "tryend": 119757,
                        "trysize": 0
                    },
                    "pubtime": 1539705600,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4470267,
                    "size320": 11174951,
                    "sizeape": 0,
                    "sizeflac": 31202312,
                    "sizeogg": 6303035,
                    "songid": 218224537,
                    "songmid": "004DXFlC0nsTCZ",
                    "songname": "年少有爲",
                    "songname_hilight": "年少有爲",
                    "strMediaMid": "002TRY4a3zfxC8",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "y0027sobcrh"
                },
                {
                    "albumid": 1276189,
                    "albummid": "001fi1zG0EjU2u",
                    "albumname": "有理想",
                    "albumname_hilight": "有理想",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 7,
                    "chinesesinger": 0,
                    "docid": "2871525826680312030",
                    "grp": [],
                    "interval": 312,
                    "isonly": 1,
                    "lyric": "《何以笙簫默》電影片尾曲",
                    "lyric_hilight": "《何以笙簫默》電影片尾曲",
                    "media_mid": "002l3MPE1qoTk9",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 2725380024,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1453392000,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 5009016,
                    "size320": 12522251,
                    "sizeape": 0,
                    "sizeflac": 35731519,
                    "sizeogg": 6986156,
                    "songid": 102367085,
                    "songmid": "000edAg12jLBrN",
                    "songname": "不將就",
                    "songname_hilight": "不將就",
                    "strMediaMid": "002l3MPE1qoTk9",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "a001738g7ov"
                },
                {
                    "albumid": 435269,
                    "albummid": "004AhJHV3slLjN",
                    "albumname": "模特",
                    "albumname_hilight": "模特",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 2,
                    "chinesesinger": 0,
                    "docid": "8279061032672769869",
                    "grp": [],
                    "interval": 306,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "001A5fWh0Mkc4D",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 3024286708,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1379347200,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4901179,
                    "size320": 12252663,
                    "sizeape": 0,
                    "sizeflac": 35388063,
                    "sizeogg": 7222207,
                    "songid": 5016169,
                    "songmid": "002FRBul05dgjC",
                    "songname": "模特",
                    "songname_hilight": "模特",
                    "strMediaMid": "001A5fWh0Mkc4D",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "n0031d236tz"
                },
                {
                    "albumid": 422762,
                    "albummid": "001LP8hk0a6pOp",
                    "albumname": "小黃",
                    "albumname_hilight": "小黃",
                    "alertid": 11,
                    "belongCD": 0,
                    "cdIdx": 1,
                    "chinesesinger": 0,
                    "docid": "2091987920690858858",
                    "grp": [],
                    "interval": 318,
                    "isonly": 0,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "004GCHEm08YZpW",
                    "msgid": 0,
                    "newStatus": 2,
                    "nt": 2447288168,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 0,
                        "payinfo": 0,
                        "payplay": 0,
                        "paytrackmouth": 0,
                        "paytrackprice": 0
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1283961600,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 5101799,
                    "size320": 12754214,
                    "sizeape": 0,
                    "sizeflac": 0,
                    "sizeogg": 6681078,
                    "songid": 102069682,
                    "songmid": "000sU9jC3bN2dY",
                    "songname": "老街",
                    "songname_hilight": "老街",
                    "strMediaMid": "004GCHEm08YZpW",
                    "stream": 1,
                    "switch": 606007,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": ""
                },
                {
                    "albumid": 435269,
                    "albummid": "004AhJHV3slLjN",
                    "albumname": "模特",
                    "albumname_hilight": "模特",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 1,
                    "chinesesinger": 0,
                    "docid": "1269178546751535043",
                    "grp": [],
                    "interval": 273,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "004CN4BA1FB6rC",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 1447943207,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1379347200,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4376222,
                    "size320": 10940271,
                    "sizeape": 0,
                    "sizeflac": 30671792,
                    "sizeogg": 6958416,
                    "songid": 5016168,
                    "songmid": "000rMFLS0ZnngN",
                    "songname": "李白",
                    "songname_hilight": "<em>李</em>白",
                    "strMediaMid": "004CN4BA1FB6rC",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "k0027se8wtv"
                },
                {
                    "albumid": 3018400,
                    "albummid": "003PTZBu0IXqg2",
                    "albumname": "嗯",
                    "albumname_hilight": "嗯",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 8,
                    "chinesesinger": 0,
                    "docid": "14117649544002956417",
                    "grp": [],
                    "interval": 294,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "003mfhdv3xm3jF",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 495105184,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1510848000,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4712259,
                    "size320": 11780367,
                    "sizeape": 0,
                    "sizeflac": 31727539,
                    "sizeogg": 6586203,
                    "songid": 209340068,
                    "songmid": "000ByvB6495lpZ",
                    "songname": "戒菸",
                    "songname_hilight": "戒菸",
                    "strMediaMid": "003mfhdv3xm3jF",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "p0025rbpwso"
                },
                {
                    "albumid": 805873,
                    "albummid": "001FOctH2oGoAx",
                    "albumname": "李榮浩",
                    "albumname_hilight": "<em>李榮浩</em>",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 1,
                    "chinesesinger": 0,
                    "docid": "10343688124534745464",
                    "grp": [],
                    "interval": 261,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "001j9q6k3nN0tD",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 630893275,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1417104000,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4181877,
                    "size320": 10454400,
                    "sizeape": 0,
                    "sizeflac": 27681238,
                    "sizeogg": 5796103,
                    "songid": 9106121,
                    "songmid": "000f6ltd2wJ5cP",
                    "songname": "喜劇之王",
                    "songname_hilight": "喜劇之王",
                    "strMediaMid": "001j9q6k3nN0tD",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "i00158trdpn"
                },
                {
                    "albumid": 4801194,
                    "albummid": "004QnEHc3zjC7J",
                    "albumname": "耳朵",
                    "albumname_hilight": "耳朵",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 6,
                    "chinesesinger": 0,
                    "docid": "4008237768922141803",
                    "grp": [],
                    "interval": 241,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "001dPKD40OUxFz",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 2904443209,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 46199,
                        "tryend": 78479,
                        "trysize": 0
                    },
                    "pubtime": 1539705600,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 3861297,
                    "size320": 9652957,
                    "sizeape": 0,
                    "sizeflac": 0,
                    "sizeogg": 5211680,
                    "songid": 218224536,
                    "songmid": "001dPKD40OUxFz",
                    "songname": "耳朵",
                    "songname_hilight": "耳朵",
                    "strMediaMid": "001dPKD40OUxFz",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "x00279avaof"
                },
                {
                    "albumid": 1276189,
                    "albummid": "001fi1zG0EjU2u",
                    "albumname": "有理想",
                    "albumname_hilight": "有理想",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 4,
                    "chinesesinger": 0,
                    "docid": "13990893781114472264",
                    "grp": [],
                    "interval": 284,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "000LbvRN0WK7Rl",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 3643846322,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1453392000,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 4548845,
                    "size320": 11371820,
                    "sizeape": 0,
                    "sizeflac": 32763885,
                    "sizeogg": 6439443,
                    "songid": 105526949,
                    "songmid": "001xBUtF3rgn7O",
                    "songname": "爸爸媽媽",
                    "songname_hilight": "爸爸媽媽",
                    "strMediaMid": "000LbvRN0WK7Rl",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "s0019nmbrrx"
                },
                {
                    "albumid": 461367,
                    "albummid": "0029sjwR42NOu9",
                    "albumname": "作曲家",
                    "albumname_hilight": "作曲家",
                    "alertid": 23,
                    "belongCD": 0,
                    "cdIdx": 1,
                    "chinesesinger": 0,
                    "docid": "1069283592772426233",
                    "grp": [],
                    "interval": 227,
                    "isonly": 1,
                    "lyric": "",
                    "lyric_hilight": "",
                    "media_mid": "001xPNn04SwIzn",
                    "msgid": 16,
                    "newStatus": 2,
                    "nt": 698035760,
                    "pay": {
                        "payalbum": 0,
                        "payalbumprice": 0,
                        "paydownload": 1,
                        "payinfo": 1,
                        "payplay": 0,
                        "paytrackmouth": 1,
                        "paytrackprice": 200
                    },
                    "preview": {
                        "trybegin": 0,
                        "tryend": 0,
                        "trysize": 0
                    },
                    "pubtime": 1395590400,
                    "pure": 0,
                    "singer": [
                        {
                            "id": 60505,
                            "mid": "000aHmbL2aPXWH",
                            "name": "李榮浩",
                            "name_hilight": "<em>李榮浩</em>"
                        }
                    ],
                    "size128": 3642290,
                    "size320": 9105435,
                    "sizeape": 0,
                    "sizeflac": 25385287,
                    "sizeogg": 5427882,
                    "songid": 5243873,
                    "songmid": "0012HIms0X4Yoc",
                    "songname": "作曲家",
                    "songname_hilight": "作曲家",
                    "strMediaMid": "001xPNn04SwIzn",
                    "stream": 1,
                    "switch": 636675,
                    "t": 1,
                    "tag": 11,
                    "type": 0,
                    "ver": 0,
                    "vid": "b0015ppqqip"
                }
            ],
            "totalnum": 565
        },
        "tab": 0,
        "taglist": [],
        "totaltime": 0,
        "zhida": {
            "chinesesinger": 0,
            "type": 0
        }
    },
    "message": "",
    "notice": "",
    "subcode": 0,
    "time": 1569222049,
    "tips": ""
})

代碼提取數據:

import json
import requests


headers = {
    'Origin': 'https://y.qq.com',
    'Referer': 'https://y.qq.com/portal/search.html',
    'Sec-Fetch-Mode': 'cors',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}

def get_music_info():
    name = input('請輸入歌手或歌曲:')
    page = input('請輸入頁碼:')
    num = input('請輸入當前頁碼需要返回的數據條數:')
    url = f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p={page}&n={num}&w={name}'
    response = requests.get(url,headers=headers).text
    # 將其切分爲json字符串形式
    music_json = response[9:-1]
    # json轉字典
    music_data = json.loads(music_json)
    # print(music_data)
    music_list = music_data['data']['song']['list']
    for music in music_list:
        music_name = music['songname']
        singer_name = music['singer'][0]['name']
        songmid = music['songmid']
        media_mid = music['media_mid']
        print(music_name,singer_name,songmid,media_mid)


if __name__ == '__main__':
    get_music_info()

在這裏插入圖片描述

2、請求vkey接口,獲取到完整的purl,進行完整播放url拼接
在這裏插入圖片描述

import json
import requests


headers = {
    'Origin': 'https://y.qq.com',
    'Referer': 'https://y.qq.com/portal/search.html',
    'Sec-Fetch-Mode': 'cors',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}

def get_music_info():
    music_info_list = []
    name = input('請輸入歌手或歌曲:')
    page = input('請輸入頁碼:')
    num = input('請輸入當前頁碼需要返回的數據條數:')
    url = f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p={page}&n={num}&w={name}'
    response = requests.get(url,headers=headers).text
    # 將其切分爲json字符串形式
    music_json = response[9:-1]
    # json轉字典
    music_data = json.loads(music_json)
    # print(music_data)
    music_list = music_data['data']['song']['list']
    for music in music_list:
        music_name = music['songname']
        singer_name = music['singer'][0]['name']
        songmid = music['songmid']
        media_mid = music['media_mid']
        music_info_list.append((music_name,singer_name,songmid,media_mid))
        # print(music_name,singer_name,songmid,media_mid)
    return music_info_list

def get_purl(music_info_list):
    # 提取songid
    for music in music_info_list:
        music_name = music[0]
        singer_name = music[1]
        songmid = music[2]
        # media_mid = music[3]
        # 這裏uid 可以不傳
        url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"703417739","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"703417739","songmid":["%s"],"songtype":[0],"uin":"","loginflag":1,"platform":"20"}},"comm":{"uin":"","format":"json","ct":24,"cv":0}}'%songmid
        response = requests.get(url,headers=headers).json()
        purl = response['req_0']['data']['midurlinfo'][0]['purl']
        full_media_url = 'http://dl.stream.qqmusic.qq.com/' + purl
        print(music_name,singer_name,full_media_url)

if __name__ == '__main__':
    music_info_list = get_music_info()
    get_purl(music_info_list)

在這裏插入圖片描述
隨便點擊一個拼接好的鏈接:可以播放
在這裏插入圖片描述

三、保存搜索的歌曲

import os
import json
import requests


headers = {
    'Origin': 'https://y.qq.com',
    'Referer': 'https://y.qq.com/portal/search.html',
    'Sec-Fetch-Mode': 'cors',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}

def get_music_info():
    music_info_list = []
    name = input('請輸入歌手或歌曲:')
    page = input('請輸入頁碼:')
    num = input('請輸入當前頁碼需要返回的數據條數:')
    url = f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p={page}&n={num}&w={name}'
    response = requests.get(url,headers=headers).text
    # 將其切分爲json字符串形式
    music_json = response[9:-1]
    # json轉字典
    music_data = json.loads(music_json)
    # print(music_data)
    music_list = music_data['data']['song']['list']
    for music in music_list:
        music_name = music['songname']
        singer_name = music['singer'][0]['name']
        songmid = music['songmid']
        media_mid = music['media_mid']
        music_info_list.append((music_name,singer_name,songmid,media_mid))
        # print(music_name,singer_name,songmid,media_mid)
    return music_info_list

def get_purl(music_info_list):
    music_data = []
    # 提取songid
    for music in music_info_list:
        music_name = music[0]
        singer_name = music[1]
        songmid = music[2]
        # media_mid = music[3]
        # 這裏uid 可以不傳
        url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"703417739","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"703417739","songmid":["%s"],"songtype":[0],"uin":"","loginflag":1,"platform":"20"}},"comm":{"uin":"","format":"json","ct":24,"cv":0}}'%songmid
        response = requests.get(url,headers=headers).json()
        purl = response['req_0']['data']['midurlinfo'][0]['purl']
        full_media_url = 'http://dl.stream.qqmusic.qq.com/' + purl
        # print(music_name,singer_name,full_media_url)
        music_data.append(
            {
                'music_name': music_name,
                'singer_name': singer_name,
                'full_media_url': full_media_url
            }
        )
    return music_data

def save_music_mp3(music_data):
    if not os.path.exists('歌曲下載'):
        os.mkdir('歌曲下載')
    for music in music_data:
        music_name = music['music_name']
        singer_name = music['singer_name']
        full_url = music['full_media_url']
        music_response = requests.get(full_url,headers=headers).content
        with open('歌曲下載/%s-%s.mp3'%(music_name,singer_name),'wb')as fp:
            fp.write(music_response)
            print('[%s]保存成功!'%music_name)



if __name__ == '__main__':
    music_info_list = get_music_info()
    music_data = get_purl(music_info_list)
    save_music_mp3(music_data)

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章