GET 请求
get 便是使用HTTP协议中的GET请求方式对目标网站发起请求。通常用于获取网页源代码、获取网络资源等。
准备
安装 requests 打开命令行窗口,输入以下语句:
pip install requests
然后,进入 python 编辑器,导入requests 库。
import requests
网页分析
打开酷我音乐主页,右键单击,选择“审查元素”,点击选项卡中的“网络”,然后再输入框中输入“梦寐之地”。
然后,网页中会出现我们想要的歌曲。
选择网络活动中的 searchMusicBykeyWord…… 项,点击“预览”,发现我们要的歌曲信息都在这里。
然后,我们点击“标头”,查看获取这些信息的方式。 我们可以看到,获取这些信息用到的是 get 请求。
干货
GET请求格式:
requests.get(<网址url>, params=<传递信息>, headers=<请求头>)
请求 url 我们已经找到了,只取问号之前的,因为问号之后的是请求参数。
url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord'
我们继续往下寻找,找到请求头 headers。 我们将请求头复制下来。其中以下几项是必须的,缺少则会报错。
headers = {
'Referer': 'http://www.kuwo.cn/search/list?key=',
'Cookie': '_ga=GA1.2.12335...',
'csrf': 'YO4OH2VYH1A'
}
然后是查询参数 params。 我们将请求 params 复制下来就可以了。
params = {
'key': '梦寐之地',
'pn': '1',
'rn': '20',
'httpsStatus': '1',
'reqId': '6e028fc0-db8f-11eb-b6f5-ff7d54a57f2b'
}
我们发现,key 键值就是我们要搜索的字符串关键词。我们可以用 input() 函数获取搜索关键词。
keyword = input('请输入查找的歌曲:')
更新字典。
params['key'] = keyword
然后,我们就可以发出 get 请求了。
获取搜索结果列表
response = requests.get(url, params=params, headers=headers)
查看请求结果。
print(response.status_code)
print(response.json())
返回: 然后,我们从中获取我们需要的信息。
datas = response.json().get('data', {}).get('list', {})
result = [[r['name'],
r['artist'],
r['album'],
r['songTimeMinutes'],
r['rid']]
for r in datas]
打出我们需要的信息看看。
print(result)
是我们所需要的信息。
接着我们把这些信息整理出来。
for i, [name, artist, album, length, rid] in enumerate(result):
print(f'{i} {name} {artist} 【{album}】')
下载歌曲
我们用 input() 函数让用户选择下载的歌曲序号。然后根据歌曲序号获取选择的歌曲信息。
indexes = input('请选择下载的序号,用逗号分隔\n').split(',')
indexes = list(map(int, indexes))
selections = [result[s] for s in indexes]
print('\n你选择了:', indexes)
print('歌曲信息:')
for data in selections:
print(data)
返回的每一项歌曲信息的第 4 项是歌曲的 rid 。
获取到歌曲的 rid 后,我们回到网页,随便点击一首歌的“播放”键。
然后,点击网络活动中的 url?format=... 的 json 文件,我们发现里面存储着播放的音乐的地址。
因此,我们只需要获得这个文件内容,就可以获取歌曲的地址了。 点击标头,查看 url 的获取方式。 这里,我们获得了请求的 url 和请求方式为 GET 。
url2 = 'http://www.kuwo.cn/url'
然后,我们往下查找请求参数。这个文件的获取并不需要请求标头。 其中,只有以下几项是必须的。
from_params = {
'rid': '148526468',
'type': 'convert_url3',
'br': '128kmp3',
}
我们发现,其中的 rid 项便是歌曲的 rid 。这样,我们之前获取的歌曲 rid 就派上用场了。
遍历歌曲 rid ,发出请求。
for name, artist, album, length, rid in selections:
params2['rid'] = rid
music_response = requests.get(url2, params=params2)
查看响应状态码和响应内容。
print(music_response.status_code)
print(music_response.json())
返回: 获取成功。
从中提取我们需要的歌曲 url。
music_url = music_response.json().get('url')
回到网页,点击网络活动中的 mp3 文件,点击标头,查看获取歌曲的方式。 请求方法:GET。
music = requests.get(music_url)
content = music.content
然后,我们将它们保存起来。
with open(f'{name} - {artist}.mp3', 'wb') as f:
f.write(content)
最后,我们打印一条完成信息:
print('下载成功!')
我们的酷我音乐下载器就完成了!
成果展示
下载的 mp3 :
完整源码
import requests
url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord'
headers = {
'Referer': 'http://www.kuwo.cn/search/list?key=',
'Cookie': '_ga=GA1.2.1165960666.1627019800; _gid=GA1.2.1256970099.1628133876; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1628133876,1628159290,1628161538,1628230455; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1628230455; _gat=1; kw_token=7UGGSOGBUX3',
'csrf': '7UGGSOGBUX3'
}
params = {
'key': '梦寐之地',
'pn': '1',
'rn': '20',
'httpsStatus': '1',
'reqId': '6e028fc0-db8f-11eb-b6f5-ff7d54a57f2b'
}
url2 = 'http://www.kuwo.cn/url'
params2 = {
'format': 'mp3',
'rid': '148526468',
'response': 'url',
'type': 'convert_url3',
'br': '128kmp3',
'from': 'web',
't': '1628233495875',
'httpsStatus': '1',
'reqId': '9ad9c0d0-f684-11eb-b8a6-f5e6223c897d'
}
keyword = input('请输入查找的歌曲:')
params['key'] = keyword
response = requests.get(url, params=params, headers=headers)
datas = response.json().get('data', {}).get('list', {})
result = [[r.get('name', ''),
r.get('artist', ''),
r.get('album', ''),
r.get('songTimeMinutes', ''),
r.get('rid', '')]
for r in datas]
for i, [name, artist, album, length, rid] in enumerate(result):
print(f'{i} {name} {artist} 【{album}】')
indexes = input('\n请选择下载的序号,用逗号分隔\n').split(',')
indexes = list(map(int, indexes))
selections = [result[s] for s in indexes]
print('\n你选择了:', indexes)
print('歌曲信息:')
for data in selections:
print(data)
for name, artist, album, length, rid in selections:
params2['rid'] = rid
music_response = requests.get(url2, params=params2)
music_url = music_response.json().get('url')
music = requests.get(music_url)
content = music.content
with open(f'{name} - {artist}.mp3', 'wb') as f:
f.write(content)
print('\n下载成功!')
代码在 3.8.10 下调试通过。
— End —
感谢阅读! 原创不易,点个赞,支持一下作者吧!
本文收录于专栏 Python 爬虫。 关注作者,互助交流,学习更多 Python 知识! https://blog.csdn.net/weixin_48448842
|