吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14145|回复: 50
收起左侧

[Python 转载] Python爬取网易云音乐播放地址

  [复制链接]
bbbbbd 发表于 2017-9-24 10:51
本帖最后由 bbbbbd 于 2017-9-25 12:13 编辑

Python爬取网易云音乐播放地址
运行环境:Python2.7


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

1.png
2.png
3.png

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

4.png
5.png

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

6.png
7.png

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

8.png

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

9.png

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

10.png

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

11.png
12.png

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

13.png

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

14.png

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

15.png
16.png
17.png
二、简单的代码实现(代码参数中默认是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



















15.png
18.png
17.png
16.png
13.png
14.png
12.png
11.png
10.png
9.png
8.png
7.png
6.png
5.png
1.png
2.png
4.png
3.png

免费评分

参与人数 12吾爱币 +13 热心值 +11 收起 理由
TBCCC + 1 + 1 谢谢@Thanks!
EMBARK + 1 + 1 谢谢@Thanks!
GitHubHJ + 1 + 1 谢谢@Thanks!
Jamesstrange + 1 + 1 谢谢@Thanks!
烯特勒 + 1 + 1 我很赞同!
scraw + 1 谢谢@Thanks!
CityHuntShou + 1 + 1 谢谢@Thanks!
wolaileo + 1 + 1 用心讨论,共获提升!
Quincy379 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
cs001 + 2 + 1 谢谢@Thanks!
a634085832 + 1 + 1 提倡开源学习,学到东西了,感谢
一杯柠檬苏打 + 1 + 1 热心支持

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| bbbbbd 发表于 2017-9-24 23:10
本帖最后由 bbbbbd 于 2017-9-24 23:15 编辑
a634085832 发表于 2017-9-24 22:13
http://ydcx.fspt.net:8889/isimsWeb/buyRecord.aspx    这个不会分析,求教一下,网页很 ...

我看了一下,在登录页面中选好内容后会以post方式提交到http://ydcx.fspt.net:8889/isimsWeb/default.aspx

参数:(包括你选的参数和一些其他参数)__EVENTTARGET=&__EVENTARGUMENT=&__LASTFOCUS=&__VIEWSTATE=%2FwEPDwUKLTQ0MDY2MDE3Ng9kFgICAQ9kFgYCAQ8QDxYGHg1EYXRhVGV4dEZpZWxkBQhST09NTkFNRR4ORGF0YVZhbHVlRmllbGQFBnJvb21kbR4LXyFEYXRhQm91bmRnZBAVEQbmpbzmoIsHQeagi%2BilvwdB5qCL5LicB0LmoIvopb8HQuagi%2BS4nAdD5qCL6KW%2FB0PmoIvkuJwHROagi%2BilvwdE5qCL5LicB0XmoIvopb8HReagi%2BS4nAdG5qCL6KW%2FB0bmoIvkuJwHR%2Bagi%2BilvwdH5qCL5LicB0jmoIvopb8HSOagi%2BS4nBURAAIwMQIwMgIwMwIwNAIwNQIwNgIwNwIwOAIwOQIxMAIxMQIxMgIxMwIxNAIxNQIxNhQrAxFnZ2dnZ2dnZ2dnZ2dnZ2dnZxYBAgFkAgMPEA8WBh8ABQhST09NTkFNRR8BBQZyb29tZG0fAmdkEBUGBualvOWxggtB5qCL6KW%2FMuWxggtB5qCL6KW%2FM%2BWxggtB5qCL6KW%2FNOWxggtB5qCL6KW%2FNeWxggtB5qCL6KW%2FNuWxghUGAAQwMTAyBDAxMDMEMDEwNAQwMTA1BDAxMDYUKwMGZ2dnZ2dnFgECAWQCBQ8QDxYGHwAFCFJPT01OQU1FHwEFBnJvb21kbR8CZ2QQFRkG5oi%2F6Ze0AzIwMQMyMDIDMjAzAzIwNAMyMDUDMjA2AzIwNwMyMDgDMjA5AzIxMAMyMTEDMjEyAzIxMwMyMTQDMjE1AzIxNgMyMTcDMjE4AzIxOQMyMjADMjIxAzIyMgAAFRkABjAxMDIwMQYwMTAyMDIGMDEwMjAzBjAxMDIwNAYwMTAyMDUGMDEwMjA2BjAxMDIwNwYwMTAyMDgGMDEwMjA5BjAxMDIxMAYwMTAyMTEGMDEwMjEyBjAxMDIxMwYwMTAyMTQGMDEwMjE1BjAxMDIxNgYwMTAyMTcGMDEwMjE4BjAxMDIxOQYwMTAyMjAGMDEwMjIxBjAxMDIyMgYwMTAyMjMGMDEwMjI0FCsDGWdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WBAUEYnV5UgUFdXNlZFIFDEltYWdlQnV0dG9uMQUMSW1hZ2VCdXR0b24yRtB%2BOlhswpsyR5j%2FPkTMrrQe7TyKNDSnRxrAa9O%2Bas0%3D&__VIEWSTATEGENERATOR=744561C5&drlouming=01&drceng=0102&drfangjian=010208&radio=buyR&ImageButton1.x=35&ImageButton1.y=11

到这个地址后,后台处理代码会生成一个session对象用于存储提交的选择内容(这些数据都运行在服务器端),本地的cookie对象会储存一个sessionid,
然后跳转到http://ydcx.fspt.net:8889/isimsWeb/buyRecord.aspx,在这个页面的后台的load方法中会检测session是否有值并进行判断,处理并返回相应的数据(我专业课学过asp.net有一点了解所以才讲了一些后台的逻辑业务)
 楼主| bbbbbd 发表于 2017-9-24 21:19
a634085832 发表于 2017-9-24 21:02
好的,感谢了,我可以再问一个问题吗? 一般用什么软件来分析网站的啊,想动态网页提交表单 ...

用浏览器分析就行(chrome、Firefox....)还可以用抓包工具 ,例如chrome: 打开开发者工具,你把需要的信息填好提交观察network看看提交的URL是什么   然后就是自己模拟post请求提交到那个URL上
宁丹妮 发表于 2017-9-24 10:59
jrc96 发表于 2017-9-24 11:25 来自手机
谢谢分享
linclon 发表于 2017-9-24 11:26
厉害厉害,楼主牛,感谢楼主分享
a634085832 发表于 2017-9-24 11:51
楼主,貌似运行会报错,你的Python是什么版本的?
 楼主| bbbbbd 发表于 2017-9-24 12:05
a634085832 发表于 2017-9-24 11:51
楼主,貌似运行会报错,你的Python是什么版本的?

Python版本是2.7.x
你看看代码开头的一些必要库你装了没有(例如:requests库,打开Python自带的idle输入import requests看看有没有报错,报错就是没有这个库,用pip安装,其他库请自测
ssewhy 发表于 2017-9-24 12:12
61行多了个url
 楼主| bbbbbd 发表于 2017-9-24 12:18

多谢改正(我是从github复制过来的,忘记同步了)
Try0oo 发表于 2017-9-24 13:56
棒棒的,学习了
空处 发表于 2017-9-24 17:39
来学习一下,虽然只有代码,还看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 01:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表