#本文使用Python 3实现,笔者于Python 3.6,Python 3.7平台调试可运行。
#由于爬虫技术特殊性,最后一次调试:Nov.27,2018时仍然可用。
#IDE上,我更偏向于Anaconda。conda的数据分析与科学计算能力比较强、自带许多数学库(方便解析爬来的数据)。conda套件里有一个叫Spyder的软件。本期文章使用它实现。
网易云音乐是一款由网易开发的音乐产品,试想这样一种情况:老师/上司给我布置一份任务,为明天的迎新晚会做准备。需要把节目清单上的歌曲下载下来,交给负责此方面的同事。我们该怎样做呢?对照歌单一个一个在搜索框里搜索-下载?不,这看起来效率并不高。
如果有一个程序,能够实现基于给出播放列表的音乐批量下载。取缔现有的人工单个搜索,提高搜索精度。应该会有不少的效率提升。
#根据监管规定,本项目仅用于测试与学习用途。请勿用作商业用途。请在合法范围内使用。
#根据监管规定,本项目仅用于测试与学习用途。请勿用作商业用途。请在合法范围内使用。
#根据监管规定,本项目仅用于测试与学习用途。请勿用作商业用途。请在合法范围内使用。
首先,我们先看一下思路:
爬取网易云这件事你得建一个工程文件夹把所有需要的东西都放在这里面,那既然是工程。就不可避免的有一个main函数。据说许多初涉Python DA的同学不喜欢写main?
本实现基于requests, sys, click, re, base64, binascii, json, os, Crypto.Cipher, http库。
这些库不需要百分百理解,但最好有个8,9成的基础。实践出真知。
hash库后来发现用不到就删掉了。
整个程序整体的框架,在一些疑难点加了注释方便理解。
main:
建立两个类,存放NeteaseMusic的信息和Song的信息(包含歌曲ID,歌曲URL等)。
参考Jack Cherish的算法,使用quiet定位最优结果。
class Netease():
#
def __init__(self, timeout, folder, quiet, cookie_path):
self.finder = finder(timeout, cookie_path)
self.folder = '.' if folder is None else folder
self.quiet = quiet
建立一个文件夹放下载好的歌曲
下载的歌曲列表写在一个music_list文本文件中,并保存为文本文档。
只读方式打开这个文档
调用map根据按行读入的文本(忽略换行等无效字符)生成一个list,传给download_song_by_search函数。
download_song_by_search函数根据字符串查询是否有这首歌
def get_song_url(self, song_id, bit_rate=320000):
#这里加入了320K优先
url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token='
csrf = ''
params = {'ids': [song_id], 'br': bit_rate, 'csrf_token': csrf}
result = self.post_request(url, params)
# 歌曲下载地址
song_url = result['data'][0]['url']
# 歌曲不存在
if song_u