酷狗音乐网页版(网页酷狗音乐版下载安装)
【点击查看】低成本上班族靠谱副业好项目 | 拼多多无货源创业7天起店爆单玩法
【点击查看】逆林创业记 | 拼多多电商店铺虚拟类项目新玩法(附完整词表&检测工具)
【点击查看】逆林创业记 | 小白ai写作一键生成爆文速成课
领300个信息差项目,见公众号【逆林创业记】(添加请备注:网站)
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
基本开发环境
模块使用
import requests
import re
import parsel
目标网站分析
爬取酷狗网页的音乐会有一个问题:每个榜单的音乐歌曲仅有前22首歌曲,不过问题不大,把每个榜单的歌曲都爬取就可以了。歌曲都是其次,主要是一些技术点的使用。
一、分析音乐播放地址的来源
分析思路和上一篇是一样的,利用开发者工具找到音乐url地址,根据url地址中的参数,搜索来源。
来源地址:
https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19105634412839889134_1606809298742&hash=50920BD1702E7EEAEDA9948ED736ED75&dfid=3ve7aQ2XyGmN0yE3uv3WcaHs&mid=ac3836df72c523f46a85d8a5fd90fe59&platid=4&album_id=39379466&_=1606809298744
注意点:
看上面网页返回的数据,看似是一个json数据,其实是字符串。
这样的数据,怎么提取呢?
1、利用正则表达式匹配想要的数据
2、先利用字符串中replace替换掉前面的内容,然后字符串转json数据
3、一个小技巧,其实可以看到数据包的url地址参数中,含有一个参数callback 只要不携带这个参数,对于返回的response数据可以直接使用.json() 。
如上所述,只要找到album_id hash 这两个值就可以了。
Q:为什么我知道这两个参数的是变化的?
A:因为可以点击播放第二首歌曲酷狗音乐网页版,按照第一首歌曲的方式搜索查找,对比两个url 参数的变化就知道了。
Q:怎么找参数变化的规律或者来源?
A:常规的两种方式酷狗音乐网页版,如果1不行就2,当然具体情况,还是需要具体分析的
1、在详情页网页页面查找是否有这两个参数的来源;
2、在列表页中找,一般情况列表页中都是会有音乐的ID。
按照酷我音乐的情况,经过搜索后可以发现是第二种
Hash
album_id
可以发现两个参数都在网页中有,所以请求列表数据提取两个变化的参数即可。
获取每个榜单url
# 酷狗飙升榜
https://www.kugou.com/yy/rank/home/1-6666.html?from=rank
# 酷狗Top500榜
https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
# 网络红歌榜
https://www.kugou.com/yy/rank/home/1-23784.html?from=rank
通过开发者工具可以清楚的知道,榜单页面是静态网站页面。
通过开发工具中的 Elements可以看到所有的榜单都在li标签当中按ctrl + F利用css提取的方式写入可以匹配到的数据是30条,刚好是对应榜单的。
酷我音乐爬取整体流程思路
1、获取每个榜单的URL地址;
2、通过榜单列表页面,获取每首音乐的 hash 以及 album_id ;
3、把参数传入数据接口的url中,就可以提取音乐地址以及音乐名字;
4、保存音乐到本地文件夹了;
二、代码实现
注意点:
1、请求网页时需要携带的 headers 参数都加上;
2、控制爬取速度,否则会出现滑块验证;(使用多线程已经亲身体验了)
def get_response(html_url):
"""
源代码
:param html_url:
:return:
"""
response = requests.get(url=html_url, headers=headers)
return response
def get_parsing(html_data):
"""
解析函数
:param html_data:
:return:
"""
selector = parsel.Selector(html_data)
return selector
def get_sort(home_url):
"""
主页url
:param home_url: 主页url :'https://www.kugou.com/yy/html/rank.html'
:return: 每个类目url
"""
home_data = get_response(home_url).text
selector = get_parsing(home_data)
sort_url = selector.css('.pc_rank_sidebar ul li a::attr(href)').getall()
return sort_url
def music_data(sort_url):
"""
获取 Hash 以及 音乐ID
:param sort_url: 类目 url
:return: hash id
"""
music_text = get_response(sort_url).text
music_hash = re.findall('"Hash":"(.*?)"', music_text) # 列表
music_id = re.findall('"album_id":(d+)', music_text) # 列表
dataset = zip(music_hash, music_id)
return dataset
def get_music_url(music_hash, music_id):
"""
获取音乐地址以及名字
:param music_hash: hash
:param music_id: album_id
:return:
"""
page_url = 'https://wwwapi.kugou.com/yy/index.php'
params = {
'r': 'play/getdata',
# 'callback': 'jQuery191000525474747870458_1606800291410',
'hash': music_hash,
'dfid': '3ve7aQ2XyGmN0yE3uv3WcaHs',
'mid': 'ac3836df72c523f46a85d8a5fd90fe59',
'platid': '4',
'album_id': music_id,
'_': '1606800291411',
}
response = requests.get(url=page_url, params=params, headers=headers)
data_json = response.json()
music_url = data_json['data']['play_url']
music_name = data_json['data']['song_name']
save(music_url, music_name)
def save(music_url, music_name):
"""
保存音乐
:param music_url: 音乐地址
:param music_name: 音乐名字
:return:
"""
filename = '音乐\' + music_name + '.mp3'
music_content = get_response(music_url).content
with open(filename, mode='wb') as f:
f.write(music_content)
print('正在下载保存:', music_name)
def main(url):
"""
:param url: 每个类目url
:return:
"""
dataset = music_data(url)
for i in dataset:
# print(i)
music_hash = i[0]
music_id = i[1]
# print(music_hash, music_id)
get_music_url(music_hash, music_id)
if __name__ == '__main__':
url = 'https://www.kugou.com/yy/html/rank.html'
sort_urls = get_sort(url)
for sort_url in sort_urls:
main(sort_url)
三、运行效果截图
部分运行结果
最后想说一下下
文章评论(0)