Python爬虫之网易云音乐下载

目标

用Python根据网易云音乐的ID,下载音乐,保存到本地MP3格式

可以下载歌曲的范围:所有能够听的歌曲

配置基础

  • Python 3.5

模块

  • pycrypto
  • base64
  • requests
  • json
  • sys(可选)
  • progressbar(可选)

pycrypto

这是哈希函数(如SHA256RIPEMD160)和各种加密算法(AESDESRSAElGamal等)的集合。主要是用来加密解密,为何要用这个呢,稍后分析

安装

pip install pycrypto

base64

python 自带的模块,主要是配合pycrypto模块使用

requests、json

requests主要用来发送网络请求, json主要用于解析网络请求的response

分析

为了避免麻烦,我们选择网页版的网易云音乐而不用客户端的,省去抓包的麻烦
我们随便选择一首歌(这里选择:一千零一夜 )然后打开网页,得到如下界面:

然后打开浏览器网络面板,点击播放按钮,然后查看网络请求,如下:

一共发送了四个网络请求,仔细一点,我们发现了一个有趣的请求,就是上图最后一个,带有.mp3后缀的那个,很明显,这里是将一千零一夜这首歌缓存了下来,复制该网络请求到浏览器地址栏打开,然后浏览器就开始下载一千零一夜这首歌。到此,好像前面提的所谓的目标完成了,但是我不开心,身为一个开发人员,这么没有技术含量的东西,是不是可以考虑用技术去实现呢。能不能输入一个歌曲的ID,然后就把歌曲下回来呢。
我们播放多几首歌曲,很容易发现,每一首歌曲都会有一个独立的链接,仔细看看这个链接(http://m10.music.126.net/20180112152443/89f98929f411dab2299734cc6ef6b726/ymusic/2c3f/eda8/99d8/4c6255e48522101ef502da10df19e36b.mp3),显然是经过处理的,这个处理有可能是前端直接处理的,也有可能是后端处理的(是不是说了等于白说。。。),后端处理会有多种情况,其中一种就是另一个网络请求返回来对应的东西,反正网络请求不多,我们先看看网咯请求,一看吓一跳,还真蒙着了,上图中第一个网络请求返回来的数据

再看一下请求的组成

只要模拟这个请求,就可以得到歌曲的链接,只要得到链接就能下载歌曲。在该请求的参数中,params以及encSecKey都是一个经过加密的数据,在反复分析点击播放按钮的事件后,得到JavaScript进行了如下操作

var bPc2x = window.asrsea(JSON.stringify(j4n), buv7o(["流泪", "强"]), buv7o(Tg9X.md), buv7o(["爱心", "女孩", "惊恐", "大笑"]));e4i.data = k4o.cE5J({params: bPc2x.encText,encSecKey: bPc2x.encSecKey})

其中,window.asrsea函数代码如下

!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}window.asrsea = d,window.ecnonasr = e
}();

由上得知,window.asrsea一共传递了四个参数(假设为window.asrsea(a, b, c, d)),而这四个参数中,只有 a是一个跟歌曲id相关的参数,其他三个都是一个常量

b = "010001";
c = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
d = "0CoJUm6Qyw8W8jud"

再研究window.asrsea的代码,发现请求的两个参数params以及encSecKey都在这里加密了,其中params经过了两次AES加密,第一次加密的时候,传入了两个参数,一个是a,一个是d,第二个加密的两个参数,第一个是第一次加密的结果,第二个是一个16位的随机字符串,因为是一个随机的字符串,所以我们可以随便用一个16位的字符串就行了,由于这里这个随机的字符串固定了,那第二个参数encSecKey就是一个固定的值
至此,我们的分析完成,也得到了需要的信息

Python实现

Python想要模拟请求,那就需要进行AES加密,因此我们就用到了开始所说的pycrypto模块

from Crypto.Cipher import AES
import base64def aes_encrypt(text, key):iv = "0102030405060708"pad = 16 - len(text) % 16text = text + pad * chr(pad)encryptor = AES.new(key, AES.MODE_CBC, iv)result = encryptor.encrypt(text)result_str = base64.b64encode(encrypt_text)return result_str

QQ交流群: 173318043
项目地址:lmissy.cn
如果本文对你有所帮助,请点个赞,这是我努力下去的无限动力,谢谢(。・ω・。)

Python爬虫之网易云音乐下载相关推荐

  1. 源码 | Python爬虫之网易云音乐下载

    目标 偶然的一次机会听到了房东的猫的<云烟成雨>,瞬间迷上了这慵懒的嗓音和学生气的歌词,然后一直去循环听她们的歌.然后还特意去刷了动漫<我是江小白>,好期待第二季- 我多想在见 ...

  2. Python爬虫实践-网易云音乐

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  3. 如何利用python爬虫获取网易云音乐某个歌手简介_Python 爬虫获取网易云音乐歌手信息...

    今天就先带大家爬取网易云音乐下的歌手信息并把数据保存下来. 爬取结果 环境 语言:Python 工具:Pycharm 导包 BeautifulSoup:用来解析源码,提取需要的元素. selenium ...

  4. Python爬虫获取网易云音乐 我的喜欢歌单 歌曲数据

    需求:突然奇想,获取网易云音乐 我的喜欢 歌单音乐数据 获取歌曲详情 如标题,歌手,时长,专辑等等 思路: 爬虫请求url 获取数据,找到对的链接请求就成功了一半,查看返回数据,然后保存数据(歌曲+歌 ...

  5. python +tkinter 打造网易云音乐下载播放器

    先上图],本次爬取得是网易云音乐,因为接口很方便,还没试百度云音乐, 提供2种下载方式,单曲下载和url歌单链接批量下载,自动识别单曲或者是歌单链接,[正则表达式匹配] 由于搜索单曲,歌曲列表经过筛选 ...

  6. python 录制网易云登陆_小白都能看懂:Python爬取网易云音乐下载教程

    配置基础 Python Selenium Chrome浏览器(其它的也可以,需要进行相应的修改) 分析 如果爬取过网易云的网站的小伙伴都应该知道网易云是有反爬取机制的,POST时需要对一些信息的参数进 ...

  7. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新

    背景 目的 >>> 通过python + kivy打包一个简易的网易云会员歌曲下载软件; 初试 >>> 用you-get库里面的网易云接口来实现下载; 失败 > ...

  8. python爬虫---网易云音乐下载

    python爬虫爬取网易云音乐 1.实现功能 2.具体实现 1.搜索部分 2.下载歌曲 1.再次获取信息 2.下载 3.结语 Github完整代码获取:https://github.com/Lian- ...

  9. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

最新文章

  1. 11 Java NIO Non-blocking Server-翻译
  2. Hadoop报错:All specified directories are failed to load.
  3. 机器学习基础:最优化方法
  4. toolbar java_Java ToolBar.layout方法代码示例
  5. 大牛领导单独找我聊了两句:搞框架的同时别忘了算法
  6. 让页面高度自动到底部 始终底部
  7. UVA12468 Zapping【水题】
  8. 春节要闻回顾 | 数字人民币和元宇宙被搬上春晚;美国财政部报告警告NFT可用于洗钱...
  9. Torch not compiled with CUDA enabled报错的解决办法
  10. Mono.Cecil 修改目标.NET的IL代码保存时报异常的处理。
  11. ics日历 android,哪些日历 App 支持导入 ics 或 webcal 协议订阅?
  12. linux core文件截断,Coredump被截断了
  13. php微信退款aes,关于微信支付退款req_info字段解密问题
  14. 新版源支付V5.18三端全套版+去授权/云端监控/免挂
  15. 八字易经算法之用JAVA实现排八字神煞
  16. 快数据如何在物联网高速公路上驱动分析
  17. 基本的安全和HTTP认证
  18. Avaya收购Esna丰富企业通信应用
  19. Ubuntu 微信 linux版最新可用——UOS魔改版
  20. u盘linux选uefi,U盘UEFI+GPT模式安装CentOS7.X系统

热门文章

  1. IT学不好没什么,大不了躺平
  2. 我们一起来排序——使用Java语言优雅地实现常用排序算法
  3. stm32通用定时器用做外部脉冲计数器的例程
  4. 互联网从业者需要知道的26个定律
  5. NASM语言更改中断向量表
  6. 树莓派2 安装linux系统安装教程,树莓派raspi2-ubuntu meta安装配置指导
  7. 推荐系统召回策略之多路召回与Embedding召回
  8. 在Safari浏览器登陆CSDN后无法正确显示编辑界面写文章
  9. 重视网络安全,从部署SSL证书开始
  10. 属实8错的电饭煲蛋糕