Python爬虫实战之网易云音乐加密解析附源码
作者:松鼠爱吃饼干 发布时间:2022-08-28 04:03:58
标签:Python,网易云音乐解析,实战
环境
python3.8
pycharm2021.2
知识点
requests >>> pip install requests
execjs >>> pip install PyExecJS
第一步
打开这个网站 在里面去分析我们需要的数据 每个音乐的名称 id
去网页源代码查找数据,发现并没有,这个网页 并不是一个静态页面
打开开发者工具,找到歌曲的id
找到真正的目标网址https://music.163.com/discover/toplist
【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学
点这里即可免费在线观看
第二步
通过代码去实现当前这一个步骤
通过代码去访问当这个页面 – 拿到网页源代码
提取我们真正想要的 音乐的名称 id
下载音乐: id获取是为了下载音乐分析里面音乐数据的 加密规则 去下载歌曲
开始代码
先导入所需模块
import requests
import re
import execjs
请求数据
# 通过代码去访问当这个页面 -- 拿到网页源代码
url = 'https://music.163.com/discover/toplist'
# 伪装
headers = {
'cookie': '_ntes_nuid=063717de540d3ec18d9b4a0bdf51e931; WM_TID=sxztjH%2FJbYZBEREFBQZvAgttUnJPrvYf; ntes_kaola_ad=1; NMTID=00OSBNvfChgV2TD7k5IhSzky6R8lXgAAAF0zoWmoA; _ntes_nnid=063717de540d3ec18d9b4a0bdf51e931,1607344992641; _iuqxldmzr_=32; OUTFOX_SEARCH_USER_ID_NCOO=2145381542.3273497; WEVNSM=1.0.0; WNMCID=sazafu.1624080681192.01.0; UM_distinctid=17b784cb58a17-097be09ee87fb9-c343365-1aeaa0-17b784cb58b8bc; __root_domain_v=.163.com; _qddaz=QD.159230735652240; vinfo_n_f_l_n3=11aae7905aa2179b.1.11.1575470964063.1625470009945.1632894007779; usertrack=ezq0J2FlcQWNYypxAx88Ag==; JSESSIONID-WYYY=Yvm62%5Cnd8XNkT2ryCNOJx9urqXsxCDMF6srNnGRegtmuNdB5MrrS9ou%2FWw3JbVf960uHnGW3Bb%2Fbhv2xZm3Vn%2B%2BonZSX38sqKiUMuRd6TDKD39HRzGmrZ%5Cp9IUaNs%5C5nYt9xltJBt5qRgWsl0PZsxDhSu26ugGAozPffXXAjemm0o%2Fv%5C%3A1634111694844; WM_NI=au9XpuutN3GwymEoZsAgWl6%2BH4cTcHgYKos%2BWibR3hSntTQhrpX%2FLoCAycOKLnZteLb1LlluoIk9jlKxaaUThS4tfZr9jWB3LVjXKQUH4%2BMpukbEPcnHaN80J8%2FhoqeeYms%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee8de74b85b18eb3b27bae8e8ab2d44e969f9aafae3388af8f98d06da59b968ecf2af0fea7c3b92aa3abf7b9f37fb7ac82d4c67dbbb38b90d97983b9998db5218cecadb5e244a5878590f22195b7aeb3b26491b2bcb5d464b2b098d0cf65819fb784ce4190b29695e848a2ef848def7fad97a5dae96889a8af82d860ac8dfc95e552b2e7a6b8c139908aa6b9ca5b9798fcccd07cb7b5aea6d369ae98afafbb3c8ae8e189ee7ba7bb978ef237e2a3; playerid=29374327',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
# url: 分析出来的真正数据链接
# headers: 伪装请求头
response = requests.get(url, headers).text
# <Response [200]>: 告诉你访问成功了
提取我们真正想要的 音乐的名称 id
zip_data = re.findall('<li><a href="/song\?id=(.*?)" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>', response)
for music_id, title in zip_data:
# url_1 = 'http://music.163.com/song/media/outer/url?id=' + music_id
url_1 = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
result = ctx.call('start', music_id)
data = {
'params': result['encText'],
'encSecKey': result['encSecKey']
}
# 发送请求
# 当前的音乐数据
music_url = requests.post(url_1, data=data, headers=headers).json()['data'][0]['url']
music_data = requests.get(music_url, headers).content
title = re.sub(r'[/\\:*?"<>|]', '_', title)
导入js文件
# js文件导入
js = open('music163.js', mode='r', encoding='utf-8').read()
ctx = execjs.compile(js)
保存文件
with open('music/' + title + '.mp3', mode='wb') as f:
f.write(music_data)
print(title)
完整代码
import requests
import re
import execjs
url = 'https://music.163.com/discover/toplist'
# 伪装
headers = {
'cookie': '_ntes_nuid=063717de540d3ec18d9b4a0bdf51e931; WM_TID=sxztjH%2FJbYZBEREFBQZvAgttUnJPrvYf; ntes_kaola_ad=1; NMTID=00OSBNvfChgV2TD7k5IhSzky6R8lXgAAAF0zoWmoA; _ntes_nnid=063717de540d3ec18d9b4a0bdf51e931,1607344992641; _iuqxldmzr_=32; OUTFOX_SEARCH_USER_ID_NCOO=2145381542.3273497; WEVNSM=1.0.0; WNMCID=sazafu.1624080681192.01.0; UM_distinctid=17b784cb58a17-097be09ee87fb9-c343365-1aeaa0-17b784cb58b8bc; __root_domain_v=.163.com; _qddaz=QD.159230735652240; vinfo_n_f_l_n3=11aae7905aa2179b.1.11.1575470964063.1625470009945.1632894007779; usertrack=ezq0J2FlcQWNYypxAx88Ag==; JSESSIONID-WYYY=Yvm62%5Cnd8XNkT2ryCNOJx9urqXsxCDMF6srNnGRegtmuNdB5MrrS9ou%2FWw3JbVf960uHnGW3Bb%2Fbhv2xZm3Vn%2B%2BonZSX38sqKiUMuRd6TDKD39HRzGmrZ%5Cp9IUaNs%5C5nYt9xltJBt5qRgWsl0PZsxDhSu26ugGAozPffXXAjemm0o%2Fv%5C%3A1634111694844; WM_NI=au9XpuutN3GwymEoZsAgWl6%2BH4cTcHgYKos%2BWibR3hSntTQhrpX%2FLoCAycOKLnZteLb1LlluoIk9jlKxaaUThS4tfZr9jWB3LVjXKQUH4%2BMpukbEPcnHaN80J8%2FhoqeeYms%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee8de74b85b18eb3b27bae8e8ab2d44e969f9aafae3388af8f98d06da59b968ecf2af0fea7c3b92aa3abf7b9f37fb7ac82d4c67dbbb38b90d97983b9998db5218cecadb5e244a5878590f22195b7aeb3b26491b2bcb5d464b2b098d0cf65819fb784ce4190b29695e848a2ef848def7fad97a5dae96889a8af82d860ac8dfc95e552b2e7a6b8c139908aa6b9ca5b9798fcccd07cb7b5aea6d369ae98afafbb3c8ae8e189ee7ba7bb978ef237e2a3; playerid=29374327',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
response = requests.get(url, headers).text
zip_data = re.findall('<li><a href="/song\?id=(.*?)" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>', response)
js = open('music163.js', mode='r', encoding='utf-8').read()
ctx = execjs.compile(js)
for music_id, title in zip_data:
url_1 = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
result = ctx.call('start', music_id)
data = {
'params': result['encText'],
'encSecKey': result['encSecKey']
}
music_url = requests.post(url_1, data=data, headers=headers).json()['data'][0]['url']
music_data = requests.get(music_url, headers).content
title = re.sub(r'[/\\:*?"<>|]', '_', title)
with open('music/' + title + '.mp3', mode='wb') as f:
f.write(music_data)
print(title)
来源:https://pythonjx.blog.csdn.net/article/details/120747494


猜你喜欢
- pytorch geometric的GNN、GCN节点分类# -*- coding: utf-8 -*-import osimport to
- 小小程序猿SQL Server认知的成长 1.没毕业或工作没多久,只知道有数据库、SQL这么个东东,浑然分不清SQL和Sql Server
- 使用Python的内置方法dir,可以范围一个模块中定义的名字的列表。官方解释是:Docstring:dir([object]) ->
- 随着网页技术的发展,网络视觉设计与之前以程序员为主导的审美特征相比,具有了极大的改观。同时,随着美术、音乐、舞蹈人才的加入,网络开始在这一社
- 大家在没有阅读本文之前先看下python的基本概念,Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Gui
- 文章主要描述的是SQL Server数据库和Oracle数据库行转列的一种比较典型操作方法,对于有些业务来说,数据在表中的存储与其最终的Gr
- 本文实例为大家分享了Python自动循环扔QQ邮箱漂流瓶的具体代码,供大家参考,具体内容如下Python代码如下:# coding=utf-
- 1.pickle 写: 以写方式打开一个文件描述符,调用pickle.dump把对象写进去 &
- 上图效果,动态添加绑定radio选项,然后也可以动态删除,右边编辑器删除,左边的视图也对应的删除。视图代码 view:"<u
- 利用python查找电脑里的文件非常方便比如在我的电脑:D:\软件 文件夹里有非常非常多的软件。我忘记某个软件叫什么名字了,只记得文件名称里
- 认证登录django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:1 authenticate(**cre
- 1、首先,根据自己的机子到MySQL官网下载对应的数据库https://dev.mysql.com/downloads/mysql/2、利用
- 一、原理说明1,authentication_string这是Mysql8.0新做出的修改,在旧版本中使用的是password()函数。2,
- 这篇文章主要介绍了Python远程开发环境部署与调试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴:import tens
- 最近因工作需要,要在静态页面上实现分页,想了下,决定用AJAX来实现,所以就捣鼓了下面这么个东西,截图如下:更多关于分页的文章演示地址:ht
- 常用快捷键1、Ctrl + Enter:在下方新建行但不移动光标;2、Shift + Enter:在下方新建行并移到新行行首;3、Ctrl
- 1、调用字符映射表输入特殊符号在键盘上按win+R,在打开的对话框中输入“charmap”,会出现字符映射表:2、利用字符编码输入特殊符号#
- 前言我们经常会与文件和目录打交道,对于这些操作python提供了一个os模块,里面包含了很多操作文件和目录的函数。在写一些系统脚本或者自动化
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较