突然不知道听什么歌了,但是排行榜的准没错,于是用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+ 匹配多个数字 .*? 可以匹配任意字符 (除了\n)
正则表达式匹配的数据 返回的是列表

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

posted @ 2021-08-25 21:11  轻松学Python  阅读(230)  评论(0编辑  收藏  举报