• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

哪里可以免费听到周杰伦的歌曲?请看这里,教你免费听歌

python 搞java代码 3年前 (2022-05-21) 12次浏览 已收录 0个评论

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

小伙伴说想听周杰伦的音乐,有什么网站是可以免费听的,然后他发现咪咕音乐可以免费听周杰伦的歌曲,既然可以免费听,那岂不是可以爬了~

 

基本开发环境

  • Python 3.6
  • Pycharm
<code><span class="hljs-keyword">import requests
<span class="hljs-keyword">import parsel</span></span></code>

www#gaodaima.com来源gao!%daima.com搞$代*!码$网搞代码

相关模块 pip 安装即可

 

目标网站分析

 

点击播放按钮,会自动跳转到音乐播放页面

 

播放界面有一个下载按钮,点击下载。

是需要登陆账号

 

  • 打开开发者工具
  • 选择network
  • 点击立即下载

会有一个下载的数据接口,post请求的数据接口,里面返回的数据有携带音频真实地址。

 

 

 

 

 

复制url地址,是会自动下载文件到本地的

既然是post请求,只需要看data参数的变化,看它需要传递哪些参数

 

多查看几首歌曲的下载氢气,就可以发现 copyrightId 就是每首音乐的ID值,只需要获取每首歌曲的ID值,就可以下载音乐了。

所以返回到周杰伦的音乐列表页

 

可以发现音乐列表页是静态网站,获取可以直接通过requests请求网站解析网站数据,可以获取音乐的ID值以及标题。

现在就是剩下最后一个问题了,那就是翻页,多页获取。

对于翻页爬取,只需要点击下一页,查看url地址的变化,找到其对应的变化规律即可。

 

page就是对应的页码,所以翻页爬取也搞定了,接下来就是写代码就好了

1、请求网页获取音乐的ID值以及标题

cookie 我就不带了,你可以自己登陆咪咕音乐之后复制开发者工具里面的

<code><span class="hljs-function">ef <span class="hljs-title">get_mp3_info(<span class="hljs-params">url):
    headers = {
        <span class="hljs-string">"cookie": <span class="hljs-string">"",
        <span class="hljs-string">"user-agent": <span class="hljs-string">"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
    }
    response = requests.<span class="hljs-keyword">get(url=url, headers=headers)
    selector = parsel.Selector(response.text)
    lis = selector.css(<span class="hljs-string">"#J_PageSonglist > div.songlist-body > div")
    <span class="hljs-keyword">for li <span class="hljs-keyword">in lis:
        page_url = li.css(<span class="hljs-string">".song-name-txt::attr(href)").<span class="hljs-keyword">get()
        mp3_id = page_url.split(<span class="hljs-string">"/")[<span class="hljs-number">-1]
        title = li.css(<span class="hljs-string">".song-name-txt::attr(title)").<span class="hljs-keyword">get()</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

2、post请求获取音乐下载地址

这里 headers 参数可以不用写这么多,为了方便就直接复制粘贴了,因为是post请求,有一些参数是必要带的,不然得到想要的返回结果。

<code>def get_mp3_url(mp3_id, title):
    url = <span class="hljs-string">"https://music.migu.cn/v3/api/order/download"
    headers = {
        <span class="hljs-string">"authority": <span class="hljs-string">"music.migu.cn",
        <span class="hljs-string">"method": <span class="hljs-string">"POST",
        <span class="hljs-string">"path": <span class="hljs-string">"/v3/api/order/download",
        <span class="hljs-string">"scheme": <span class="hljs-string">"https",
        <span class="hljs-string">"accept": <span class="hljs-string">"*/*",
        <span class="hljs-string">"accept-encoding": <span class="hljs-string">"gzip, deflate, br",
        <span class="hljs-string">"accept-language": <span class="hljs-string">"zh-CN,zh;q=0.9",
        <span class="hljs-string">"cache-control": <span class="hljs-string">"no-cache",
        <span class="hljs-string">"content-length": <span class="hljs-string">"42",
        <span class="hljs-string">"content-type": <span class="hljs-string">"application/x-www-form-urlencoded; charset=UTF-8",
        <span class="hljs-string">"cookie": <span class="hljs-string">"",
        <span class="hljs-string">"origin": <span class="hljs-string">"https://music.migu.cn",
        <span class="hljs-string">"pragma": <span class="hljs-string">"no-cache",
        <span class="hljs-string">"referer": <span class="hljs-string">"https://music.migu.cn/v3/music/order/download/60054701923",
        <span class="hljs-string">"sec-fetch-dest": <span class="hljs-string">"empty",
        <span class="hljs-string">"sec-fetch-mode": <span class="hljs-string">"cors",
        <span class="hljs-string">"sec-fetch-site": <span class="hljs-string">"same-origin",
        <span class="hljs-string">"user-agent": <span class="hljs-string">"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        <span class="hljs-string">"x-requested-with": <span class="hljs-string">"XMLHttpRequest",
    }

    <span class="hljs-keyword">data = {
        <span class="hljs-string">"copyrightId": <span class="hljs-string">"{}".format(mp3_id),
        <span class="hljs-string">"payType": <span class="hljs-string">"01",
        <span class="hljs-string">"type": <span class="hljs-string">"1"
    }
    response = requests.post(url=url, <span class="hljs-keyword">data=<span class="hljs-keyword">data, headers=headers)
    html_data = response.json()
    mp3_url = html_data[<span class="hljs-string">"downUrl"]</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></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>

3、保存音乐至本地

保存代码还是比较简单,也是常用的 with open

<code><span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">download<span class="hljs-params">(download_url, title):
    response = requests.get(url=download_url)
    path = <span class="hljs-string">"音乐" + title + <span class="hljs-string">".mp3"
    <span class="hljs-keyword">with open(path, mode=<span class="hljs-string">"wb") <span class="hljs-keyword">as f:
        f.write(response.content)</span></span></span></span></span></span></span></span></span></code>

具体实现效果

有一部分的音乐仍然还是需要付费的,所以当你post请求付费音乐的时间,是没有下载地址的,可以写一个判断

 

 

 

总结

代码可以优化,这只是最简易版本的爬虫代码,下载速度并不是很快,可以使用多线程爬取,速度更佳,可以自己去动手优化。

爬虫不难,主要是在于分析网站,除非涉及严重加密的网站,比如字体加密,JS数据加密,这些基本大部分网站,只需要花点心思分析网站的数据,就可以爬取了。

字体加密的网站其实也不难,主要是爬取的过程有点繁杂。加油吧


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:哪里可以免费听到周杰伦的歌曲?请看这里,教你免费听歌

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址