zoukankan      html  css  js  c++  java
  • 突然不知道听什么歌了,但是排行榜的准没错,于是用Python全部都爬下来了!

    闲得无聊,到处找推荐歌曲都没有满意的,想了想不是有爬虫吗,反手就把酷狗排行榜的歌都给它爬下来了,不说了,我听歌去了~
    在这里插入图片描述
    文末的话,我也放了相关视频教程,比文章详细多了
    在这里插入图片描述
    开始今天的正文吧

    这是今天的知识点

    1、动态数据抓包演示
    2、json数据解析
    3、requests模块的使用
    4、正则表达式的简单使用
    5、css选择器数据解析方法
    

    用到的环境和模块

    python 3.6  
    pycharm (安装包/安装教程/激活码/使用教程/翻译插件)
    
    requests >>>  pip install requests
    parsel  >>> pip install parsel 
    re 正则表达式
    环境模块

    爬虫可见即可爬,你要想爬所有的也可以。

    思路流程:

    一. 数据来源分析

    1. 确定需求 爬取音乐数据 音频
        2. 通过开发者工具(浏览器都自带 F12 或者 鼠标右键点击检查)进行抓包分析
            I. 找我们音乐播放地址  play_url
            II. 找播放地址来源  对比参数变化 [hash ID]1629808844252 时间戳(表示你请求的时间点)
                time 时间模块 可以获取当前时间戳
            III. 找 hash ID 参数的来源
            IV. 获取所有榜单的url地址
    

    二. 代码实现过程

        1. 发送请求 对于榜单url地址发送请求
        2. 获取数据 获取网页源代码数据
        3. 解析数据 提取所有榜单相对应的url地址
        4. 发送请求 对于 榜单的url地址发送请求
        5. 获取数据 获取网页源代码数据
        6. 解析数据 提取音乐 hash 和 id 值
        7. 发送请求 把 hash 和 id 值 参数相对url里面 发送请求
        8. 获取数据 获取json字典数据
        9. 解析数据 提取 歌名 音乐播放地址
        10. 保存数据
    
    

    数据来源分析 >>> 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据

    首先把要用的模块都安排上

    import requests  # 数据请求模块 pip install requests
    import parsel  # 数据解析模块 pip install parsel
    import re  # 正则表达式 内置模块 不需要安装
    import pprint  # 格式化输出
    import os
    import

    设置一手文件夹,我们爬下来的音乐就放到这里

    filename = 'music\'
    if not os.path.exists(filename):
        os.mkdir(filename)

    然后有些歌曲下载下来可能有特殊字符,我们得把它替换掉

    def change_title(title):
        pattern = re.compile(r"[/\:*?"<>|]")  # '/  : * ? " < > |'
        new_title = re.sub(pattern, "_", title)  # 替换为下划线
        return new_title

    1、发送请求 对于榜单url地址发送请求

    url = 'https://www.kugou.com/yy/html/rank.html'

    请求头 作用: 伪装 把python代码伪装成浏览器发送请求
    任意一个数据包的 user-agent 都是一样的
    user-agent 表示的就是浏览器的基本信息

    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)

    2、获取数据 获取网页源代码数据

    print(response.text) 

    html 字符串数据(想直接解析字符串数据 只能用re) 转成 selector 对象

    3、解析数据 提取所有榜单相对应的url地址

    selector = parsel.Selector(response.text)
    print(selector)

    css选择器 根据标签的内容 提取想要的数据
    第一次提取 获取li 标签

    lis = selector.css('.pc_rank_sidebar li')
    lis = lis[13:]

    返回的是列表, 所以可以遍历 把里面每一个元素提取出来 Selector 对象

    for li in lis:
        title = li.css('a::attr(title)').get()
        link_url = li.css('a::attr(href)').get()
        print(f'=====================正在爬取{title}=====================')
    print(title, link_url)

    4、发送请求 对于 榜单的url地址发送请求

    response_1 = requests.get(url=link_url, headers=headers)
    re.findall('')

    5、获取数据 获取网页源代码数据 response_1.text

    print(response_1.text)

    6、解析数据 提取音乐 hash 和 id 值

    hash_list = re.findall('"Hash":"(.*?)"', response_1.text)

    d 匹配一个数字 d+ 匹配多个数字 .*? 可以匹配任意字符 (除了 )
    正则表达式匹配的数据 返回的是列表

    album_id = re.findall('"album_id":(d+),', response_1.text)
        for index in zip(hash_list, album_id):
            hash = index[0]
            music_id = index[1]

    7、 发送请求 把 hash 和 id 值 参数相对url里面 发送请求

     index_url = 'https://wwwapi.kugou.com/yy/index.php'
            params = {
                'r': 'play/getdata',
                # 'callback': 'jQuery19106964302346548317_1629810585326',
                'hash': hash,
                'dfid': '1JdWoI2IQjNS2aq9KB1Ylhf3',
                'mid': 'fe0e97001229790f9065ef29dec3bdcd',
                'platid': '4',
                'album_id': music_id,
                '_': '1629810585327',
            }
            response_2 = requests.get(url=index_url, params=params, headers=headers)
            # json_data = response_2.json()['data']
            music_name = response_2.json()['data']['audio_name']
            new_name = change_title(music_name)
            music_url = response_2.json()['data']['play_url']
            if music_url:
                music_content = requests.get(url=music_url, headers=headers).content
                with open(filename + new_name + '.mp3', mode='wb') as f:
                    f.write(music_content)
                    print(music_name)

    在这里插入图片描述

    来看看效果
    在这里插入图片描述在这里插入图片描述
    这下子我又能消停几天了

    视频教程我也放在这给大家了,视频会讲的详细一些 点我看视频 密码:qwer

  • 相关阅读:
    【模板】2-SAT 问题
    HDU5875 Function
    Codeforces Round #380 (Div. 2)/729B Spotlights 水题
    Codeforces Round #380 (Div. 2)/729E Subordinates 贪心
    Codeforces Round #380 (Div. 2)/729D Sea Battle 思维题
    HDU 5869 Different GCD Subarray Query 树状数组+离线
    HDU 5696 区间的价值 暴力DFS
    HDU 5876 Sparse Graph BFS+set删点
    HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元
    HDU 5800 To My Girlfriend DP
  • 原文地址:https://www.cnblogs.com/hahaa/p/15186976.html
Copyright © 2011-2022 走看看