嗨喽,大家好呀~这里是爱看美女的茜茜呐
环境使用:
-
Python 3.10
-
Pycharm
模块使用:
-
requests -> pip install requests
-
execjs -> pip install execjs
爬虫实现基本思路流程:
一. 数据来源分析:
-
明确需求: 明确采集的网站以及数据内容
-
网址: https://music.163.com/#/discover/toplist?id=3779629
-
数据: 歌曲内容
-
-
抓包分析: 分析歌曲播放链接地址是那个, 怎么获得
-
打开开发者工具: F12 / 右键点击检查选择network (网络)
-
点击播放歌曲
-
找到音乐播放链接地址: (选择媒体文件 media)
播放链接: https://m704.music.126.net/20231209203449/814a6a477dc83f8002fa2a08b16f38ba/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/31966535088/1b87/d918/e5fe/cc565b1103eadc6fd1a967372bfe9420.m4a?authSecret=0000018c4e7bde2719dd0aaba0891864 -
继续分析, 播放链接是从哪来生成: (通过关键字去搜)
请求方式: post
请求头参数: 无加密
请求参数: 表单数据 (加密数据)
params: √
encSecKey: √通过JS代码断点调试: 跟栈方法
var bVg1x = window.asrsea(JSON.stringify(i4m), bsk6e([“流泪”, “强”]), bsk6e(WH4L.md), bsk6e([“爱心”, “女孩”, “惊恐”, “大笑”]));
nodejs 环境 (和你python安装在同一个位置)
-
二. 代码实现步骤:
-
发送请求 -> 模拟浏览器对于url地址发送请求
-
获取数据 -> 获取服务器返回响应数据
-
解析数据 -> 提取我们需要的内容
-
保存数据 -> 保存歌曲数据到本地文件夹
代码展示
导入模块
# 导入编译js代码模块
import execjs
# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
模拟浏览器
headers = {'Origin': '****','Referer': '****/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
}
请求网址
link = '****/discover/toplist?id=3778678'
发送请求
html_data = requests.get(url=link, headers=headers).text
提取id 和 歌名
info = re.findall('<a href="/song\?id=(\d+)">(.*?)</a>', html_data)
print(len(info))
num = 1
for music_id, title in info:print(num, music_id, title)num += 1
请求网址
url = '****m/weapi/song/enhance/player/url/v1?csrf_token='
“”"
构建请求参数
“”"
读取js代码
f = open('网易云.js', encoding='utf-8').read()
编译js代码
js_code = execjs.compile(f)
调用JS代码函数
i4m = {"ids": f"[{music_id}]","level": "standard","encodeType": "aac","csrf_token": ""}res = js_code.call('post_data', i4m)data = {'params': res['encText'],'encSecKey': res['encSecKey']}
发送请求
response = requests.post(url=url, data=data, headers=headers)
获取响应数据
json_data = response.json()
解析数据, 键值对取值
music_url = json_data['data'][0]['url']
保存数据
content = requests.get(url=music_url, headers=headers).contentwith open('music热歌\\' + title + '.mp3', mode='wb') as f:f.write(content)print(music_url)
尾语
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。