本人python初学者,记录自己的一次学习过程,仅供参考。欢迎各位前辈指点。
分析页面
本次要分析的页面主要是酷狗音乐的搜索界面:
思路如下:
- 在上图所示页面点击播放一首音乐后,F12进入开发者模式,找到含有音乐的play_url的请求网址,该url就是音乐播放的url。
- 在对请求网址进行删减后,注意到encode_album_audio_id(红框内)的参数,似乎是代表着音乐的id。
- 所以如果有了每首歌曲的encode_album_audio_id,也就获得了这首歌曲的play_url;
- 返回到搜索界面,进入开发者模式,并Ctrl+F搜索红框内encode_album_audio_id,发现了一个list,里面包含了搜索界面的音乐信息;
- 我们在对应的音乐里面,发现了和encode_album_audio_id相同的值——EMixSongID;
所以现在的任务也就变成了提取每首音乐的EMixSongID,也就是得到了encode_album_audio_id,同时就得到了play_url; - 观察请求页面的参数
尝试了不同几个页面的参数后,发现只有clienttime和signature是变化的。(可能还有关键字keyword)
其中clientime为当前时间戳,pyhon time库处理简单。
关于signature的处理可自行查找。 - 接下来的任务就是对url中的json格式进行处理,提取EMixSongID
- 将得到得到不同歌曲的不同的EMixSongID进行url拼接,得到含有该首歌曲play_url的url,再次对该页面进行json处理,得到play_url,完成。
def get_url():
k = time.time()
k = int(round(k * 1000))
text = input("请输入搜索关键字")
info = [
"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt",
"appid=1014",
"bitrate=0",
"callback=callback123",
"clienttime={}".format(k),
"clientver=1000",
"dfid=34d3K63Qc3AA3wvcEp1te6TT",
"filter=10",
"inputtype=0",
"iscorrection=1",
"isfuzzy=0",
"keyword={}".format(text),
"mid=41d5a0c36112c5cb310d75b0ab73ac0f",
"page=1",
"pagesize=30",
"platform=WebFilter",
"privilege_filter=0",
"srcappid=2919",
"token=",
"userid=0",
"uuid=41d5a0c36112c5cb310d75b0ab73ac0f",
"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]
# 创建md5对象
new_md5 = md5()
info = ''.join(info)
# 更新哈希对象
new_md5.update(info.encode(encoding='utf-8'))
# 加密
result = new_md5.hexdigest()
music_info_url = 'https://complexsearch.kugou.com/v2/search/song?callback=callback123&srcappid=2919&clientver=1000&clienttime={}&' \
'mid=41d5a0c36112c5cb310d75b0ab73ac0f&uuid=41d5a0c36112c5cb310d75b0ab73ac0f&dfid=34d3K63Qc3AA3wvcEp1te6TT&' \
'keyword={}&page=1&pagesize=30&bitrate=0&isfuzzy=0&inputtype=0&platform=WebFilter&userid=0&iscorrection=1&' \
'privilege_filter=0&filter=10&token=&appid=1014&signature={}'.format(k, text, result)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
'Cookie': '填入你自己的Cookie'
}
# 请求搜索界面的URL
minfo_get = requests.get(music_info_url, headers=headers).text
# 获得该页面的json格式并处理
minfo_get = minfo_get[12: