关键词搜索

源码搜索 ×
×

突然不知道听什么歌了,但是排行榜的准没错,于是用Python全部都爬下来了!

发布2021-08-26浏览324次

详情内容

这是今天的知识点

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

用到的环境和模块

复制代码

python 3.6  
pycharm (安装包/安装教程/激活码/使用教程/翻译插件)

requests >>>  pip install requests
parsel  >>> pip install parsel 
re 正则表达式

复制代码

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

思路流程:

一. 数据来源分析

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

二. 代码实现过程

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

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

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

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

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

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+ 匹配多个数字 .*? 可以匹python教程配任意字符 (除了\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)

复制代码

在这里插入图片描述

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

作者:静默虚空

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载