闲得无聊,到处找推荐歌曲都没有满意的,想了想不是有爬虫吗,反手就把酷狗排行榜的歌都给它爬下来了,不说了,我听歌去了~

文末的话,我也放了相关视频教程,比文章详细多了

开始今天的正文吧

这是今天的知识点

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

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。