文章目录[隐藏]
第一次创作,请多指教
环境:Python3.8,开发工具:Pycharm
第三方库:requests
详细
进入酷我音乐的网站到搜索界面
输入歌名进去打开开发者工具会发现这个包
它里面包含了这一页的音乐数据,我们需要的是这个参数
然后开始写代码吧,先找到所需的音乐数据
<code class="prism language-python has-numbering"><span class="token keyword"><a href="https://www.gaodaima.com/tag/import" title="查看更多关于import的文章" target="_blank">import</a> requests <span class="token keyword">import json <span class="token keyword">import os <span class="token keyword">def <span class="token function">music_download<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">: kw <span class="token operator">= <span class="token builtin">input<span class="token punctuation">(<span class="token string">"请输入音乐名称:"<span class="token punctuation">) <span class="token comment"># 请求头 headers <span class="token operator">= <span class="token punctuation">{xian <span class="token string">"User-Agent"<span class="token punctuation">:<span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63"<span class="token punctuation">, <span class="token string">"Cookie"<span class="token punctuation">:<span class="token string">"_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P"<span class="token punctuation">, <span class="token string">"Referer"<span class="token punctuation">: <span class="token string">"http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6"<span class="token punctuation">, <span class="token string">"csrf"<span class="token punctuation">: <span class="token string">"HYZQI4KPK3P"<span class="token punctuation">, <span class="token punctuation">} <span class="token comment"># 参数列表 params <span class="token operator">= <span class="token punctuation">{ <span class="token string">"key"<span class="token punctuation">: kw<span class="token punctuation">, <span class="token comment"># 页数 <span class="token string">"pn"<span class="token punctuation">: <span class="token string">"1"<span class="token punctuation">, <span class="token comment"># 音乐数 <span class="token string">"rn"<span class="token punctuation">: <span class="token string">"10"<span class="token punctuation">, <span class="token string">"httpsStatus"<span class="token punctuation">: <span class="token string">"1"<span class="token punctuation">, <span class="token string">"reqId"<span class="token punctuation">: <span class="token string">"cc337fa0-e856-11ea-8e2d-ab61b365fb50"<span class="token punctuation">, <span class="token punctuation">} <span class="token comment"># 创建列表,后面下载需要 music_list <span class="token operator">= <span class="token punctuation">[<span class="token punctuation">] url <span class="token operator">= <span class="token string">"http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?" res <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= url<span class="token punctuation">,headers <span class="token operator">= headers<span class="token punctuation">,params <span class="token operator">= params<span class="token punctuation">) res<span class="token punctuation">.encoding <span class="token operator">= <span class="token string">"utf-8" text <span class="token operator">= res<span class="token punctuation">.text <span class="token comment"># 转成json数据 json_list <span class="token operator">= json<span class="token punctuation">.loads<span class="token punctuation">(text<span class="token punctuation">) <span class="token comment"># 发现data中list是存主要数据的地方 datapack <span class="token operator">= json_list<span class="token punctuation">[<span class="token string">"data"<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"list"<span class="token punctuation">] </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
www#gaodaima.com来源gao*daima.com搞@代#码网搞代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
接下来是重要的地方
先随便试听一首音乐,找到他的json数据
我们发现这个json数据里含有.mp3的链接,这就是音乐文件
复制他的url,进去看是一个接口
他的url有规律,之前我们提取的rid参数就起了作用,把它复制到链接里,这里看代码吧
<code class="prism language-python has-numbering"><span class="token comment"># 遍历拿到所需要的数据,音乐名称,歌手,id... <span class="token keyword">for i <span class="token keyword">in datapack<span class="token punctuation">: <span class="token comment"># 音乐名 music_name <span class="token operator">= i<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">] <span class="token comment"># 歌手 music_singer <span class="token operator">= i<span class="token punctuation">[<span class="token string">"artist"<span class="token punctuation">] <span class="token comment"># 待会需要的id先拿到 rid <span class="token operator">= i<span class="token punctuation">[<span class="token string">"rid"<span class="token punctuation">] <span class="token comment"># 随便试听拿到一个音乐的接口,这是的rid就用得上了 api_music <span class="token operator">= <span class="token string">"http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" <span class="token string">"&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" <span class="token string">"&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5"<span class="token punctuation">.<span class="token builtin">format<span class="token punctuation">(rid<span class="token punctuation">) api_res <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= api_music<span class="token punctuation">) <span class="token comment"># 打印发现真实的url确实在里面 <span class="token comment"># print(api_res.text) music_url <span class="token operator">= json<span class="token punctuation">.loads<span class="token punctuation">(api_res<span class="token punctuation">.text<span class="token punctuation">)<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">] <span class="token comment"># 大功告成,试试效果 <span class="token keyword">print<span class="token punctuation">(music_name<span class="token punctuation">) <span class="token keyword">print<span class="token punctuation">(music_singer<span class="token punctuation">) <span class="token keyword">print<span class="token punctuation">(music_url<span class="token punctuation">) </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
顺便写了个方便下载的功能
<code class="prism language-python has-numbering"> <span class="token comment"># 在此之前先创建列表 music_list <span class="token operator">= <span class="token punctuation">[<span class="token punctuation">] </span></span></span></span></code>
- 1
- 2
<code class="prism language-python has-numbering">函数体内建一个字典方便保存歌名与音乐数据 <span class="token comment"># 把数据存到字典方便下载时查找 music_dict <span class="token operator">= <span class="token punctuation">{<span class="token punctuation">} music_dict<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">] <span class="token operator">= music_name music_dict<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">] <span class="token operator">= music_url music_dict<span class="token punctuation">[<span class="token string">"singer"<span class="token punctuation">] <span class="token operator">= music_singer music_list<span class="token punctuation">.append<span class="token punctuation">(music_dict<span class="token punctuation">) <span class="token comment"># 看看真实数据数量 <span class="token keyword">print<span class="token punctuation">(<span class="token builtin">len<span class="token punctuation">(music_list<span class="token punctuation">)<span class="token punctuation">) </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
遍历之前的列表数据进行判断,利用索引找到指定的url
<code class="prism language-python has-numbering"><span class="token comment"># 下载 xiazai <span class="token operator">= <span class="token builtin">input<span class="token punctuation">(<span class="token string">"输入要下载的音乐名称:"<span class="token punctuation">) <span class="token comment"># 下载位置 root <span class="token operator">= <span class="token string">"E://下载的music//" <span class="token comment"># 每个字典里有name和url <span class="token keyword">for i <span class="token keyword">in <span class="token builtin">range<span class="token punctuation">(<span class="token builtin">len<span class="token punctuation">(music_list<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">: <span class="token keyword">try<span class="token punctuation">: <span class="token keyword">if xiazai <span class="token operator">== music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">]<span class="token punctuation">: <span class="token comment"># 创建文件夹 <span class="token keyword">if <span class="token operator">not os<span class="token punctuation">.path<span class="token punctuation">.exists<span class="token punctuation">(root<span class="token punctuation">)<span class="token punctuation">: os<span class="token punctuation">.mkdir<span class="token punctuation">(root<span class="token punctuation">) <span class="token comment"># 拿到字典中对应的音乐url数据 music_content <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">]<span class="token punctuation">)<span class="token punctuation">.content <span class="token keyword">with <span class="token builtin">open<span class="token punctuation">(root <span class="token operator">+ <span class="token string">"{}.mp3"<span class="token punctuation">.<span class="token builtin">format<span class="token punctuation">(music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">]<span class="token punctuation">)<span class="token punctuation">,<span class="token string">"wb"<span class="token punctuation">) <span class="token keyword">as f<span class="token punctuation">: f<span class="token punctuation">.write<span class="token punctuation">(music_content<span class="token punctuation">) <span class="token keyword">print<span class="token punctuation">(<span class="token string">"下载成功"<span class="token punctuation">) <span class="token keyword">except<span class="token punctuation">: <span class="token keyword">print<span class="token punctuation">(<span class="token string">"下载失败"<span class="token punctuation">) </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
然后就可以愉快的下载付费音乐啦
完整代码
<code class="prism language-python has-numbering"><span class="token keyword">import requests <span class="token keyword">import json <span class="token keyword">import os <span class="token keyword">def <span class="token function">music_download<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">: kw <span class="token operator">= <span class="token builtin">input<span class="token punctuation">(<span class="token string">"请输入音乐名称:"<span class="token punctuation">) <span class="token comment"># 请求头 headers <span class="token operator">= <span class="token punctuation">{ <span class="token string">"User-Agent"<span class="token punctuation">:<span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63"<span class="token punctuation">, <span class="token string">"Cookie"<span class="token punctuation">:<span class="token string">"_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P"<span class="token punctuation">, <span class="token string">"Referer"<span class="token punctuation">: <span class="token string">"http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6"<span class="token punctuation">, <span class="token string">"csrf"<span class="token punctuation">: <span class="token string">"HYZQI4KPK3P"<span class="token punctuation">, <span class="token punctuation">} <span class="token comment"># 参数列表 params <span class="token operator">= <span class="token punctuation">{ <span class="token string">"key"<span class="token punctuation">: kw<span class="token punctuation">, <span class="token comment"># 页数 <span class="token string">"pn"<span class="token punctuation">: <span class="token string">"1"<span class="token punctuation">, <span class="token comment"># 音乐数 <span class="token string">"rn"<span class="token punctuation">: <span class="token string">"10"<span class="token punctuation">, <span class="token string">"httpsStatus"<span class="token punctuation">: <span class="token string">"1"<span class="token punctuation">, <span class="token string">"reqId"<span class="token punctuation">: <span class="token string">"cc337fa0-e856-11ea-8e2d-ab61b365fb50"<span class="token punctuation">, <span class="token punctuation">} <span class="token comment"># 创建列表,后面下载需要 music_list <span class="token operator">= <span class="token punctuation">[<span class="token punctuation">] url <span class="token operator">= <span class="token string">"http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?" res <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= url<span class="token punctuation">,headers <span class="token operator">= headers<span class="token punctuation">,params <span class="token operator">= params<span class="token punctuation">) res<span class="token punctuation">.encoding <span class="token operator">= <span class="token string">"utf-8" text <span class="token operator">= res<span class="token punctuation">.text <span class="token comment"># 转成json数据 json_list <span class="token operator">= json<span class="token punctuation">.loads<span class="token punctuation">(text<span class="token punctuation">) <span class="token comment"># 发现data中list是存主要数据的地方 datapack <span class="token operator">= json_list<span class="token punctuation">[<span class="token string">"data"<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"list"<span class="token punctuation">] <span class="token comment"># 遍历拿到所需要的数据,音乐名称,歌手,id... <span class="token keyword">for i <span class="token keyword">in datapack<span class="token punctuation">: <span class="token comment"># 音乐名 music_name <span class="token operator">= i<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">] <span class="token comment"># 歌手 music_singer <span class="token operator">= i<span class="token punctuation">[<span class="token string">"artist"<span class="token punctuation">] <span class="token comment"># 待会需要的id先拿到 rid <span class="token operator">= i<span class="token punctuation">[<span class="token string">"rid"<span class="token punctuation">] <span class="token comment"># 随便试听拿到一个音乐的接口,这是的rid就用得上了 api_music <span class="token operator">= <span class="token string">"http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" <span class="token string">"&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" <span class="token string">"&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5"<span class="token punctuation">.<span class="token builtin">format<span class="token punctuation">(rid<span class="token punctuation">) api_res <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= api_music<span class="token punctuation">) <span class="token comment"># 打印发现真实的url确实在里面 <span class="token comment"># print(api_res.text) music_url <span class="token operator">= json<span class="token punctuation">.loads<span class="token punctuation">(api_res<span class="token punctuation">.text<span class="token punctuation">)<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">] <span class="token comment"># 大功告成,试试效果 <span class="token keyword">print<span class="token punctuation">(music_name<span class="token punctuation">) <span class="token keyword">print<span class="token punctuation">(music_singer<span class="token punctuation">) <span class="token keyword">print<span class="token punctuation">(music_url<span class="token punctuation">) <span class="token comment"># 把数据存到字典方便下载时查找 music_dict <span class="token operator">= <span class="token punctuation">{<span class="token punctuation">} music_dict<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">] <span class="token operator">= music_name music_dict<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">] <span class="token operator">= music_url music_dict<span class="token punctuation">[<span class="token string">"singer"<span class="token punctuation">] <span class="token operator">= music_singer music_list<span class="token punctuation">.append<span class="token punctuation">(music_dict<span class="token punctuation">) <span class="token comment"># 看看真实数据数量 <span class="token keyword">print<span class="token punctuation">(<span class="token builtin">len<span class="token punctuation">(music_list<span class="token punctuation">)<span class="token punctuation">) <span class="token comment"># 下载 xiazai <span class="token operator">= <span class="token builtin">input<span class="token punctuation">(<span class="token string">"输入音乐名称:"<span class="token punctuation">) <span class="token comment"># 下载位置 root <span class="token operator">= <span class="token string">"E://下载的music//" <span class="token keyword">for i <span class="token keyword">in <span class="token builtin">range<span class="token punctuation">(<span class="token builtin">len<span class="token punctuation">(music_list<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">: <span class="token keyword">try<span class="token punctuation">: <span class="token keyword">if xiazai <span class="token operator">== music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">]<span class="token punctuation">: <span class="token comment"># 创建文件夹 <span class="token keyword">if <span class="token operator">not os<span class="token punctuation">.path<span class="token punctuation">.exists<span class="token punctuation">(root<span class="token punctuation">)<span class="token punctuation">: os<span class="token punctuation">.mkdir<span class="token punctuation">(root<span class="token punctuation">) <span class="token comment"># 拿到字典中对应的音乐url数据 music_content <span class="token operator">= requests<span class="token punctuation">.get<span class="token punctuation">(url <span class="token operator">= music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"url"<span class="token punctuation">]<span class="token punctuation">)<span class="token punctuation">.content <span class="token keyword">with <span class="token builtin">open<span class="token punctuation">(root <span class="token operator">+ <span class="token string">"{}({}).mp3"<span class="token punctuation">.<span class="token builtin">format<span class="token punctuation">(music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"name"<span class="token punctuation">]<span class="token punctuation">,music_list<span class="token punctuation">[i<span class="token punctuation">]<span class="token punctuation">[<span class="token string">"singer"<span class="token punctuation">]<span class="token punctuation">)<span class="token punctuation">,<span class="token string">"wb"<span class="token punctuation">) </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>