通过网易云歌单链接下载网易云歌曲
系统开发环境
操作系统:windows 10
Python版本:Python3.x
开发工具:pycharm 2019.2
所需模块:os,requests, lxml(请确认pycharm上是否有安装否则导入会报错)
难度系数:⭐⭐
一、先上图(最终效果)
说明:可见即可爬,暂时只能爬取已经显示的歌曲列表,后面知道怎么爬取全部歌曲有时间会更新或者另写一篇。
二、需要理解的知识点
-
通过F12或者右键检查调出开发者工具,查看Network找到播放列表请求链接,找到播放列表链接和歌单链接之间的规律
如图可以看到他们之间的规律为https://music.163.com/playlist?id=歌单链接最后的id,即”https://music.163.com/playlist?id=%s” % 歌单id
代码:
import requests from lxml import etree # 歌单地址和播放列表地址不一样,所以需要一些处理 str = input(r"请输入要下载的歌单链接:") print() # 获取歌单最后面的id id = str.split("=")[-1] # playlist中的请求地址 url = "https://music.163.com/playlist?id=%s" % id # 伪装头部信息爬取当前网页全部内容 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
-
获取网易云歌曲链接和歌曲名
查看url
查看歌曲id
复制id到编译工具查找对应的标签
查找对应的标签方便提取(这里应该是在Pycharm上查看比较好,content中能打印出来的就能解析出来,有的网站做了反爬会根据你的Hearders和ip决定给你展示多少内容,有些内容并不会给你展示而你是根据网页中的Elements解析的内容,你就获取不到你解析中想要的内容)
根据标签提取name和url
代码:def get_content(url): # 1.请求要抓取的网站--获取网站返回的数据 html = requests.get(url, headers=headers).content.decode("utf-8") # 2.加载html tree = etree.HTML(html) # print(html) """ // : 根目录 [] :谓语-条件 / : 单个元素 @ :提取这个元素 """ url_music = tree.xpath('//ul[@class="f-hide"]/li/a/@href') name = tree.xpath('//ul[@class="f-hide"]/li/a/text()')
-
获取网易云歌曲外链
这里用的是第二个
查看音乐id
复制到
网易外链转换
查找
分析规律
代码:for index, item in enumerate(url_music): url_id = item.split("=")[-1] file_name = name[index] # print(url_id, file_name) print("正在读取 %s.mp3" % file_name) # 网易云外链 http://music.163.com/song/media/outer/url?id= music_base = "http://music.163.com/song/media/outer/url?id=%s" % url_id print(music_base) # 加r防止字符转义 file_path = r"E:\PyCharm\Project\Module_01\网易云歌曲/%s.mp3" % file_name
-
读取音乐文件并写入
这个可能会报异常,因为如果歌曲名中有\ / : * ? ” < > | 是不符合windows命名规范的,已用正则做处理(更)
导入re库,用sub替换非法字符
import re
new_name = re.sub(r’[/:?*”<>|]+’, ‘_’, file_name)
代码:
with open(file_path, "wb") as mu: try: req = requests.get(music_base, headers=headers) mu.write(req.content) print("下载 %s.mp3 成功" % file_name) print() except Exception as e: print("读取 %s.mp3 失败" % file_name) pass continue get_content(url)
三、运行
复制歌单链接
粘贴到编辑器
因为直接粘贴并Enter会打开网页跳转到网页界面,所以链接后面加个空格再按Enter键
好了,你可以看到音乐开始下载了
查看音乐
Ctrl+Alt+F12打开音乐文件目录或者右键后再点击Directory Path打开
参考
四、项目全部代码(2020.9.29更)
import os
import re
import requests
from lxml import etree
# 歌单地址和播放列表地址不一样,所以需要一些处理
str = input(r"请输入要下载的歌单链接:")
print()
# 获取歌单最后面的id
id = str.split("=")[-1]
# playlist中的请求地址
url = "https://music.163.com/playlist?id={}".format(id)
# 伪装头部信息爬取当前网页全部内容
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
def get_content(url):
# 1.请求要抓取的网站--获取网站返回的数据
html = requests.get(url, headers=headers).content.decode("utf-8")
# 2.加载html
tree = etree.HTML(html)
# print(html)
"""
// : 根目录
[] :谓语-条件
/ : 单个元素
@ :提取这个元素
"""
url_music = tree.xpath('//ul[@class="f-hide"]/li/a/@href')
name = tree.xpath('//ul[@class="f-hide"]/li/a/text()')
# print(url_music, name)
for index, item in enumerate(url_music):
url_id = item.split("=")[-1]
file_name = name[index]
# 将不符合windows文件命名规范的文件名用 _ 替换
new_name = re.sub(r'[/\:?*"<>|]+', '_', file_name)
# print(url_id, file_name)
print("正在读取 {}.mp3".format(file_name))
# 网易云外链 http://music.163.com/song/media/outer/url?id=
music_base = "http://music.163.com/song/media/outer/url?id={}".format(url_id)
print(music_base)
# 加r防止字符转义
file_dir = "E:\PyCharm\Project\Module_09\网易云歌曲"
file_path = r"{}/{}.mp3".format(file_dir, new_name)
# 判断文件目录是否存在,如果不存在,新建一个文件夹
if not os.path.exists(file_dir):
os.makedirs(file_dir)
with open(file_path, "wb") as mu:
try:
req = requests.get(music_base, headers=headers)
mu.write(req.content)
print("下载 {}.mp3 成功".format(new_name))
print()
except Exception as e:
p = print("读取 {}.mp3 失败".format(new_name))
continue
if __name__ == '__main__':
get_content(url)
如果觉得对你们有帮助可以点个赞或者关注一波哦~
祝你们听的愉快~