本帖最后由 bbbbbd 于 2017-9-25 12:13 编辑

Python爬取网易云音乐播放地址

运行环境:Python2.7

一、分析目标网站

首先打开网易云音乐的官网,在搜索列表中随便搜索一首歌曲,打开开发者工具开始分析请求地址,进过分析是采用的ajax,如下所示一步一步找的我们需要的信息,发现是post方式提交的信息,哎~竟然提交的参数进行了加密

1.png (137.62 KB, 下载次数: 1)

2017-9-24 19:37 上传

2.png (161.1 KB, 下载次数: 1)

2017-9-24 19:37 上传

3.png (95.97 KB, 下载次数: 1)

2017-9-24 19:37 上传

好吧,我们还是接着分析吧,发现他是通过后面这个js文件进行加密的,然后找到这个js文件,点开简直不忍直视都是压缩过的~0.0

4.png (84.75 KB, 下载次数: 1)

2017-9-24 19:37 上传

5.png (179.14 KB, 下载次数: 1)

2017-9-24 19:37 上传

接下来我们点开sources找到js文件,如下图进行操作,把js里的内容复制下来存到本地(后面要进行js调试)

6.png (255.02 KB, 下载次数: 1)

2017-9-24 19:37 上传

7.png (141.77 KB, 下载次数: 1)

2017-9-24 19:37 上传

打开刚才复制下来的js代码,对其进行分析查找我们需要的提交参数params和encSecKey

8.png (87.79 KB, 下载次数: 2)

2017-9-24 19:37 上传

这里就是我们需要的信息,发现他是通过上面asrsea方法处理后得到的加密参数,并且这个函数需要4个参数,在这个方法的上面我们加入自己的调试代码以便于能在控制台看清楚这4个参数的真实面貌 那么这个asrsea到底在哪里呢?好吧,我们继续通过搜索功能把他定位到d函数,原来d函数就是我们要找的真正的加密参数的函数,对它进行分析发现是两次的aes加密,好了到这里我们貌似看到了曙光,嘻嘻~

9.png (67.29 KB, 下载次数: 1)

2017-9-24 19:37 上传

我们再进一步分析d中的i,他是通过a获取的随机16为字符串,既然这样我们可以把他替换成任意的16个字母或数字,这里我把他替换成16个F(那么刚才所说的第2参数对于我们来时就是一个常量了,经过多次观察3,4参数也是固定的(没用))

10.png (64.85 KB, 下载次数: 1)

2017-9-24 19:37 上传

好了,所有的分析工作到这里就基本上差不多了。 接下来,就是调试js了(我用的是Fiddler),打开Fiddler后回到网站刷新一次,在Fiddler中找到刚才花了很大一部分时间分析的那个js文件,用刚才我们修改说的本地js替换它,具体操作如下图所示

11.png (259.55 KB, 下载次数: 1)

2017-9-24 19:37 上传

12.png (203.78 KB, 下载次数: 1)

2017-9-24 19:37 上传

替换好js后,回到网站打开开发者工具到console里,刷新一下网站,神奇的事情发生了,刚才没有的参数都打印出来了,如下 我们只需要拿到参数1进行分析(其他3个都是固定的了)

13.png (33.34 KB, 下载次数: 1)

2017-9-24 19:37 上传

由于刚才我们把随机生成的i进行了替换成固定了,也就是说encSecKey我们不用每次都进行加密了,直接用下图这个就行(i=“FFFFFFFFFFFFFFFF”),拿出来存起来

14.png (94.79 KB, 下载次数: 1)

2017-9-24 19:37 上传

然后随便点到一首歌的详情页中,类似的分析(没有那么麻烦了,只需要找到参数就行)就行,此处就省略了,参考下图

15.png (36.11 KB, 下载次数: 1)

2017-9-24 19:37 上传

16.png (106.58 KB, 下载次数: 1)

2017-9-24 19:37 上传

17.png (25.22 KB, 下载次数: 1)

2017-9-24 19:37 上传

二、简单的代码实现(代码参数中默认是128kbps的,把128000改成320000就可以抓取320kbps了)

[Python] 纯文本查看 复制代码# -*- coding:utf8 -*-

import sys

from Crypto.Cipher import AES

import base64

import requests

import json

reload(sys)

sys.setdefaultencoding( 'utf-8' )

#返回搜索列表的params

def get_music_list(keyword):

first_param = '{"hlpretag":"","hlposttag":"","id":"","s":"' + keyword + '","type":"1","offset":"0","total":"true","limit":"100","csrf_token":""}'

return get_params(first_param)

#返回每个歌曲的params

def get_music_url(id):

first_param = '{ids: "[' + str(id) + ']", br: 128000, csrf_token: ""}'

return get_params(first_param)

#返回加密后的POST参数params

def get_params(first_param):

iv = '0102030405060708'

first_key = '0CoJUm6Qyw8W8jud'

second_key = 16 * 'F'

h_encText = AES_encrypt(first_param, first_key, iv)

h_encText = AES_encrypt(h_encText, second_key, iv)

return h_encText

#返回加密后的POST参数encSecKey

def get_encSecKey():

#encSecKey是固定的参数

encSecKey = '257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c'

return encSecKey

#AES加密算法

def AES_encrypt(text, key, iv):

pad = 16 - len(text) % 16

text = text + pad * chr(pad)

encryptor = AES.new(key, AES.MODE_CBC, iv)

encrypt_text = encryptor.encrypt(text)

encrypt_text = base64.b64encode(encrypt_text)

return encrypt_text

#返回json数据

def get_json(url,params,encSecKey):

data = {

"params":params,

"encSecKey": encSecKey

}

response = requests.post(url,data=data)

return response.content

if __name__ == "__main__":

search_url = 'http://music.163.com/weapi/cloudsearch/get/web?csrf_token='

url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token='

params = get_music_list('王菲')

encSecKey = get_encSecKey()

json_text = get_json(search_url, params, encSecKey)

json_dict = json.loads(json_text)

for item in json_dict['result']['songs']:

p = get_music_url(item['id'])

music = get_json(url,p, encSecKey)

print '歌名:'+item['name'],'歌手:'+item['ar'][0]['name'],json.loads(music)['data'][0]['url']

效果图:

18.png (233.19 KB, 下载次数: 1)

2017-9-24 19:37 上传

python播放在线音乐_Python爬取网易云音乐播放地址相关推荐

  1. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  2. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  3. python爬取网易云音乐_python爬取网易云音乐简单案例

    首先找到想要下载的歌曲表单,例如: 打开推荐 点击推荐的歌曲表单 接下来我们尝试爬取这个表单的全部歌曲名,及歌曲的MP3地址 我使用fiddler4抓包工具抓取相关信息 #encoding=utf8 ...

  4. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜单(获取iframe中数据,src为空)...

    一.分析思路 网易云音乐热歌榜的页面采用嵌入内联框架的方式,若爬虫直接从官网入口进入访问热歌榜 http://music.163.com/#/discover/toplist?id=3778678,是 ...

  5. python爬取评论_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  6. python爬取网易云音乐热评_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  7. python爬取网易云评论最多的歌_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  8. python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...

    网易云音乐评论爬虫(三):爬取歌曲的全部评论 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的 ...

  9. python爬取歌曲_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

最新文章

  1. Linux 第71天 mariadb backup and recovery
  2. CVPR 2019 | 全新缺失图像数据插补框架—CollaGAN
  3. Java面试中常问的Spring方面问题
  4. Centos6.9安装部署nginx服务器
  5. 使用 Python 进行双重退火优化
  6. android系统修改开机动画效果,Android手机开机动画的修改
  7. linux7怎么把gpt分区改成MBR,GPT转MBR|硬盘GPT分区转MBR教程(两种办法)
  8. 修改oracle管理员用户密码
  9. 解决vue报错:Avoided redundant navigation to current location
  10. markdown文档插入表情符号支持的英文单词大全 官方
  11. c语言万年历一行打印两个月,万年历 c语言 两月一行
  12. 那些看网络小说的时光——2019
  13. CNN的Python实现——第四章:卷积神经网络的结构
  14. 蹩脚的CSDN手机绑定
  15. 在亚马逊严抓测评的风口下,亚马逊买家秀关联视频或许是一个安全有效的方式
  16. 解决移动桌面文件夹和文档文件夹时出现两个文件夹合并的问题
  17. 利用Pycharm断点调试Python程序
  18. 海外市场增长快速,爱贝激战跨境支付蓝海
  19. GREATEST LEAST
  20. 怎么将抖音保存的视频的水印去掉

热门文章

  1. 照片宽高比怎么设置_iPhone拍照小技巧:保留常用设置更高效
  2. Android Studio教程 简介与入门(资料比较旧,但有一定参考价值)
  3. [ZT]一个三十岁男人的婚姻思考(五)
  4. 如何用 EM 算法对王者荣耀数据进行聚类
  5. java产生随机数的方法
  6. 时间转字符串,字符串转时间.
  7. 两种方式导入excel
  8. python缩进块_Python缩进规则(包含快捷键)
  9. 条件变量(condition variable)详解
  10. git管理多个ssh key