酷狗音乐网页版(网页酷狗音乐版下载安装)


【点击查看】低成本上班族靠谱副业好项目 | 拼多多无货源创业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)

三、运行效果截图

部分运行结果

最后想说一下下

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ3361245237,本站将立刻清除。