Python实现QQ音乐爬取下载最新可用
很久沒有跟新博客了,最近心血來潮,寫一篇爬取qq音樂的博文,我們這里用到的是現在最熱門的語言Python。
接下來我們來梳理整個爬取流程。
#mermaid-svg-rajrmFal98Gput5V .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-rajrmFal98Gput5V .label text{fill:#333}#mermaid-svg-rajrmFal98Gput5V .node rect,#mermaid-svg-rajrmFal98Gput5V .node circle,#mermaid-svg-rajrmFal98Gput5V .node ellipse,#mermaid-svg-rajrmFal98Gput5V .node polygon,#mermaid-svg-rajrmFal98Gput5V .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rajrmFal98Gput5V .node .label{text-align:center;fill:#333}#mermaid-svg-rajrmFal98Gput5V .node.clickable{cursor:pointer}#mermaid-svg-rajrmFal98Gput5V .arrowheadPath{fill:#333}#mermaid-svg-rajrmFal98Gput5V .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-rajrmFal98Gput5V .flowchart-link{stroke:#333;fill:none}#mermaid-svg-rajrmFal98Gput5V .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-rajrmFal98Gput5V .edgeLabel rect{opacity:0.9}#mermaid-svg-rajrmFal98Gput5V .edgeLabel span{color:#333}#mermaid-svg-rajrmFal98Gput5V .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-rajrmFal98Gput5V .cluster text{fill:#333}#mermaid-svg-rajrmFal98Gput5V div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-rajrmFal98Gput5V .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rajrmFal98Gput5V text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-rajrmFal98Gput5V .actor-line{stroke:grey}#mermaid-svg-rajrmFal98Gput5V .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-rajrmFal98Gput5V .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-rajrmFal98Gput5V #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-rajrmFal98Gput5V .sequenceNumber{fill:#fff}#mermaid-svg-rajrmFal98Gput5V #sequencenumber{fill:#333}#mermaid-svg-rajrmFal98Gput5V #crosshead path{fill:#333;stroke:#333}#mermaid-svg-rajrmFal98Gput5V .messageText{fill:#333;stroke:#333}#mermaid-svg-rajrmFal98Gput5V .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rajrmFal98Gput5V .labelText,#mermaid-svg-rajrmFal98Gput5V .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-rajrmFal98Gput5V .loopText,#mermaid-svg-rajrmFal98Gput5V .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-rajrmFal98Gput5V .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-rajrmFal98Gput5V .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rajrmFal98Gput5V .noteText,#mermaid-svg-rajrmFal98Gput5V .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-rajrmFal98Gput5V .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-rajrmFal98Gput5V .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-rajrmFal98Gput5V .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-rajrmFal98Gput5V .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .section{stroke:none;opacity:0.2}#mermaid-svg-rajrmFal98Gput5V .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-rajrmFal98Gput5V .section2{fill:#fff400}#mermaid-svg-rajrmFal98Gput5V .section1,#mermaid-svg-rajrmFal98Gput5V .section3{fill:#fff;opacity:0.2}#mermaid-svg-rajrmFal98Gput5V .sectionTitle0{fill:#333}#mermaid-svg-rajrmFal98Gput5V .sectionTitle1{fill:#333}#mermaid-svg-rajrmFal98Gput5V .sectionTitle2{fill:#333}#mermaid-svg-rajrmFal98Gput5V .sectionTitle3{fill:#333}#mermaid-svg-rajrmFal98Gput5V .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-rajrmFal98Gput5V .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .grid path{stroke-width:0}#mermaid-svg-rajrmFal98Gput5V .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-rajrmFal98Gput5V .task{stroke-width:2}#mermaid-svg-rajrmFal98Gput5V .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .taskText:not([font-size]){font-size:11px}#mermaid-svg-rajrmFal98Gput5V .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-rajrmFal98Gput5V .task.clickable{cursor:pointer}#mermaid-svg-rajrmFal98Gput5V .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rajrmFal98Gput5V .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rajrmFal98Gput5V .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rajrmFal98Gput5V .taskText0,#mermaid-svg-rajrmFal98Gput5V .taskText1,#mermaid-svg-rajrmFal98Gput5V .taskText2,#mermaid-svg-rajrmFal98Gput5V .taskText3{fill:#fff}#mermaid-svg-rajrmFal98Gput5V .task0,#mermaid-svg-rajrmFal98Gput5V .task1,#mermaid-svg-rajrmFal98Gput5V .task2,#mermaid-svg-rajrmFal98Gput5V .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-rajrmFal98Gput5V .taskTextOutside0,#mermaid-svg-rajrmFal98Gput5V .taskTextOutside2{fill:#000}#mermaid-svg-rajrmFal98Gput5V .taskTextOutside1,#mermaid-svg-rajrmFal98Gput5V .taskTextOutside3{fill:#000}#mermaid-svg-rajrmFal98Gput5V .active0,#mermaid-svg-rajrmFal98Gput5V .active1,#mermaid-svg-rajrmFal98Gput5V .active2,#mermaid-svg-rajrmFal98Gput5V .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-rajrmFal98Gput5V .activeText0,#mermaid-svg-rajrmFal98Gput5V .activeText1,#mermaid-svg-rajrmFal98Gput5V .activeText2,#mermaid-svg-rajrmFal98Gput5V .activeText3{fill:#000 !important}#mermaid-svg-rajrmFal98Gput5V .done0,#mermaid-svg-rajrmFal98Gput5V .done1,#mermaid-svg-rajrmFal98Gput5V .done2,#mermaid-svg-rajrmFal98Gput5V .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-rajrmFal98Gput5V .doneText0,#mermaid-svg-rajrmFal98Gput5V .doneText1,#mermaid-svg-rajrmFal98Gput5V .doneText2,#mermaid-svg-rajrmFal98Gput5V .doneText3{fill:#000 !important}#mermaid-svg-rajrmFal98Gput5V .crit0,#mermaid-svg-rajrmFal98Gput5V .crit1,#mermaid-svg-rajrmFal98Gput5V .crit2,#mermaid-svg-rajrmFal98Gput5V .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-rajrmFal98Gput5V .activeCrit0,#mermaid-svg-rajrmFal98Gput5V .activeCrit1,#mermaid-svg-rajrmFal98Gput5V .activeCrit2,#mermaid-svg-rajrmFal98Gput5V .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-rajrmFal98Gput5V .doneCrit0,#mermaid-svg-rajrmFal98Gput5V .doneCrit1,#mermaid-svg-rajrmFal98Gput5V .doneCrit2,#mermaid-svg-rajrmFal98Gput5V .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-rajrmFal98Gput5V .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-rajrmFal98Gput5V .milestoneText{font-style:italic}#mermaid-svg-rajrmFal98Gput5V .doneCritText0,#mermaid-svg-rajrmFal98Gput5V .doneCritText1,#mermaid-svg-rajrmFal98Gput5V .doneCritText2,#mermaid-svg-rajrmFal98Gput5V .doneCritText3{fill:#000 !important}#mermaid-svg-rajrmFal98Gput5V .activeCritText0,#mermaid-svg-rajrmFal98Gput5V .activeCritText1,#mermaid-svg-rajrmFal98Gput5V .activeCritText2,#mermaid-svg-rajrmFal98Gput5V .activeCritText3{fill:#000 !important}#mermaid-svg-rajrmFal98Gput5V .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-rajrmFal98Gput5V g.classGroup text .title{font-weight:bolder}#mermaid-svg-rajrmFal98Gput5V g.clickable{cursor:pointer}#mermaid-svg-rajrmFal98Gput5V g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rajrmFal98Gput5V g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-rajrmFal98Gput5V .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-rajrmFal98Gput5V .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rajrmFal98Gput5V .dashed-line{stroke-dasharray:3}#mermaid-svg-rajrmFal98Gput5V #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V .commit-id,#mermaid-svg-rajrmFal98Gput5V .commit-msg,#mermaid-svg-rajrmFal98Gput5V .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-rajrmFal98Gput5V g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-rajrmFal98Gput5V g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-rajrmFal98Gput5V g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rajrmFal98Gput5V g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rajrmFal98Gput5V .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rajrmFal98Gput5V .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-rajrmFal98Gput5V .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-rajrmFal98Gput5V .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rajrmFal98Gput5V .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-rajrmFal98Gput5V .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-rajrmFal98Gput5V .edgeLabel text{fill:#333}#mermaid-svg-rajrmFal98Gput5V .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rajrmFal98Gput5V .node circle.state-start{fill:black;stroke:black}#mermaid-svg-rajrmFal98Gput5V .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-rajrmFal98Gput5V #statediagram-barbEnd{fill:#9370db}#mermaid-svg-rajrmFal98Gput5V .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rajrmFal98Gput5V .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-rajrmFal98Gput5V .statediagram-state .divider{stroke:#9370db}#mermaid-svg-rajrmFal98Gput5V .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-rajrmFal98Gput5V .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-rajrmFal98Gput5V .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-rajrmFal98Gput5V .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-rajrmFal98Gput5V .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-rajrmFal98Gput5V .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-rajrmFal98Gput5V .note-edge{stroke-dasharray:5}#mermaid-svg-rajrmFal98Gput5V .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-rajrmFal98Gput5V .error-icon{fill:#522}#mermaid-svg-rajrmFal98Gput5V .error-text{fill:#522;stroke:#522}#mermaid-svg-rajrmFal98Gput5V .edge-thickness-normal{stroke-width:2px}#mermaid-svg-rajrmFal98Gput5V .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-rajrmFal98Gput5V .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-rajrmFal98Gput5V .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rajrmFal98Gput5V .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rajrmFal98Gput5V .marker{fill:#333}#mermaid-svg-rajrmFal98Gput5V .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-rajrmFal98Gput5V {color: rgba(0, 0, 0, 0.75);font: ;}找到音樂文件的下載鏈接分析下載鏈接中的參數在網頁請求的響應中尋找參數的位置獲得參數拼接了解下載音樂我們首先打開網頁,搜索歌手薛之謙,得到對應的歌單,任意點擊一首歌進入player頁面,然后點擊播放打開媒體,這個時候就彈到了另外一個界面,而我們的音樂文件的鏈接就是從這里獲得,進去瀏覽器開發者模式,進行下步操作:
通過選擇媒體過濾點多余信息,這里我門就得到了音樂文件的下載地址:http://isure.stream.qqmusic.qq.com/C400003Y1nX31eQZCg.m4a?guid=2683420628&vkey=C45BCF7E486CC35AF60C2B478411DE1D52DD9518908C8519E563DB5B53984C56E22C331D4E192743A513D8387BFBB2DAFE0369D6C370945E&uin=0&fromtag=66
接下來就是分析鏈接的參數。
這里我們得到文件名C400的后綴和vkey參數是變化的,其他的都是固定的。值得注意的是,有些地方的資源的爬取鏈接中有很多無用參數,我們可以將鏈接覅只到瀏覽器挨個驗證,得到uinhe fromtag這兩個參數是無用的,可以任意取值,guid這個參數固定卻不能變。
于是我們接下來得到那兩個可變參數就可以了,于是我再次尋找在此界面輸入參數vkey,找到了對應的請求:https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey5909770877130106&g_tk=5381&jsonpCallback=getplaysongvkey5909770877130106&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data={“req”:{“module”:“CDN.SrfCdnDispatchServer”,“method”:“GetCdnDispatch”,“param”:{“guid”:“2683420628”,“calltype”:0,“userip”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:“2683420628”,“songmid”:[“001ndJe947wlaP”],“songtype”:[0],“uin”:“1484232187”,“loginflag”:1,“platform”:“20”}},“comm”:{“uin”:1484232187,“format”:“json”,“ct”:24,“cv”:0}}
然后我們在播放另外一首歌曲,我們再來分析該請求的鏈接參數,這里只需要的到songmid這個參數就可可以了,于是我們要去找這個參數。
功夫不負有心人,在歌單界面找到了對應的json數據,獲取鏈接如下:
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=62731321716932536&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=薛之謙&g_tk_new_20200303=5381&g_tk=5381&jsonpCallback=MusicJsonCallback6388440119570588&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0
很明顯這里的參數w就是我們要輸入搜索的,到這里我們就分析完畢,開始寫代碼了,下面給出代碼塊:
import requests import time import json import random url_music_info = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?" \"ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=70661252997214154&" \"t=0&aggr=1&cr=1&catZhida=1&lossless=0&" \"flag_qc=0" \"&p=1&" \"n=4" \"&w={}" \"&g_tk_new_20200303=352421221&" \"g_tk=352421221&jsonpCallback=''&" \"loginUin=0&hostUin=0&" \"format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0" # 上面的n參數表示一次性獲取的歌曲數目可以手動更改 param_vkey= {"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"2683420628","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"2683420628","songmid":["0040bgkV4BzIEi"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}url_vkey_get = "https://u.y.qq.com/cgi-bin/musicu.fcg?callback=“”&g_tk=352421221&jsonpCallback=getplaysongvkey7281977218930408&loginUin=1484232187&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data=" #音樂下載網址 url_music_downlaod = "http://isure.stream.qqmusic.qq.com/{}" search_name = input('請輸入你喜歡的歌手名字:') headers = [{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1)'' AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/86.0.4240.111 Safari/537.36'},{'User-Agent': "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"},{'User-Agent': "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"},{'User-Agent': "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)"},{'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)"},{'User-Agent': "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6"},{'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1"},{'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0"},{'User-Agent': "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"}]# 獲取歌單數據 music_info_json = requests.get(url_music_info.format(search_name),headers=random.choice(headers),timeout=5).text#去掉字符串多余的字符得到json數據 music_info_json = music_info_json.replace(music_info_json[0:9], '') music_info_json = music_info_json.replace(music_info_json[-1], '') #打印json數據 # print(music_info_json) # 轉化字典 music_dict = json.loads(music_info_json) #獲取字典中歌單列表 music_list = music_dict["data"]["song"]["list"] # 獲取列表中的歌曲id,名字,下載路徑以字典形式存入下列表 music_info_List = [] for i in range(0,len(music_list)):time.sleep(random.randint(1, 3))print('正在解析地址{}....'.format(music_list[i]["name"]))# 定義存單個歌曲參數的字典single_music = {}song_id = music_list[i]['mid']# 將獲取的id放入請求參數中來獲取下載鏈接param_vkey['req_0']['param']['songmid'] = [song_id]# 一定要將我們分析定義出來的字典序列化后加入到鏈接參數中才會得到服務器正確響應,vkey_text是字典vkey_text = requests.get(url_vkey_get+json.dumps(param_vkey),headers=random.choice(headers),timeout=5).text#注意下面download_purl_list是列表download_purl_list = json.loads(vkey_text)['req_0']['data']['midurlinfo']single_music['download_purl'] = download_purl_list[0]['purl']single_music["name"] = music_list[i]["name"]music_info_List.append(single_music)# #打印歌曲信息 print(music_info_List) for i in music_info_List:#拼接下載鏈接download_url = url_music_downlaod.format(i["download_purl"])print("正在下載歌曲{}...".format(i["name"])+'下載地址為')print(download_url)with open(("./images/" + '{}'+'.m4a').format(i["name"]), "wb") as f:f.write(requests.get(download_url,headers=random.choice(headers),timeout=5).content)print("{}下載完畢。".format(i["name"]))print()time.sleep(random.randint(1,3))運行代碼,點擊控制臺的鏈接,得到音樂文件:
這里特別注意,以上代碼只能爬取免費音樂,由于本人沒有會員,就沒有研究付費音樂。
總結
以上是生活随笔為你收集整理的Python实现QQ音乐爬取下载最新可用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fc安卓模拟器_安卓电视卡丑慢!装上它们
- 下一篇: 史上接近最完整的选择屏幕开发知识(针对初