资讯专栏INFORMATION COLUMN

Python爬虫之网易云音乐歌曲下载

enrecul101 / 3523人阅读

摘要:爬虫之网易云音乐下载目标用根据网易云音乐的,下载音乐,保存到本地格式可以下载歌曲的范围所有能够听的歌曲配置基础模块可选可选这是哈希函数如和和各种加密算法,,,等的集合。

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/2018...),显然是经过处理的,这个处理有可能是前端直接处理的,也有可能是后端处理的(是不是说了等于白说。。。),后端处理会有多种情况,其中一种就是另一个网络请求返回来对应的东西,反正网络请求不多,我们先看看网咯请求,一看吓一跳,还真蒙着了,上图中第一个网络请求返回来的数据

再看一下请求的组成

只要模拟这个请求,就可以得到歌曲的链接,只要得到链接就能下载歌曲。在该请求的参数中,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 base64


def aes_encrypt(text, key):
    iv = "0102030405060708"
    pad = 16 - len(text) % 16
    text = 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
如果本文对你有所帮助,请点个赞,这是我努力下去的无限动力,谢谢(。・ω・。)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41241.html

相关文章

  • 小白都懂的Python爬虫网易音乐下载

    摘要:完整代码如下正在下载根据网易云歌曲的直接下载歌曲上安装爬取网易云歌曲源码地址 首发知乎:https://zhuanlan.zhihu.com/p/... 目标 偶然的一次机会听到了房东的猫的《云烟成雨》,瞬间迷上了这慵懒的嗓音和学生气的歌词,然后一直去循环听她们的歌。然后还特意去刷了动漫《我是江小白》,好期待第二季... 我多想在见你,哪怕匆匆一眼就别离... 好了,不说废话了。这次...

    SoapEye 评论0 收藏0
  • uhost部署爬虫下载网易音乐到us3上

    摘要:首先从上拉取项目然后依次安装以下依赖之后配置的以下字段公共空间名称不加后缀私有空间名称不加后缀二选一本地文件名上传文件在空间中的名称一切配置完成之后开始使用,方法如下按提示输入歌曲名称下载歌曲效果展示下载之后的歌曲可以在文件夹中查看首先从git上拉取项目git clone https://github.com/money666-sxy/msc_crawler然后依次安装以下依赖pip3 in...

    Tecode 评论0 收藏0
  • selenium实战-同步网易音乐歌单到qq音乐

    摘要:对于这次的爬虫来说,由于网易云音乐以及音乐网页中大部分元素都是使用渲染生成的,因此选择使用来完成这次的脚本。可以发现网易云音乐的手机版歌单地址是。现在已经支持网易云音乐与音乐歌单的互相同步。 本文主要介绍selenium在爬虫脚本的实际应用。适合刚接触python,没使用过selenium的童鞋。(如果你是老司机路过的话,帮忙点个star吧) 项目地址 https://github.c...

    dailybird 评论0 收藏0
  • 爬虫 - 收藏集 - 掘金

    摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...

    1fe1se 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<