本文基于Python2.7
忽然想把歌曲库更新一下,就去点网易云歌单里的下载,发现自己的会员到期了,很多歌曲不能下载,这个我不能忍,于是乎就发挥了程序员的本质,用爬虫去爬取歌单歌曲,https://music.163.com/playlist?id=22155050(不需要userid) 这个是我自己的歌单(欢迎大家关注我的网易云)
没有会员效果如下,点击下载需要开通会员
找到自己歌单的链接,复制到浏览器中,记得复制的时候,只要id,不需要userid,https://music.163.com/playlist?id=22155050(不需要userid)
然后,将链接放到postman中请求,查看一下我需要去抓的内容,其实用浏览器中的审查元素也是类似的,但是我一般都是两个对比的,审查元素中可能有些元素不准确,所以我一般结合起来看postman,这个页面很简单,能够直接找到需要的歌曲id,和歌曲名称,有了id之后就可以用网易云的歌曲Outer链接去下载,因为代码比较简单,直接贴上来了
# -*- coding: UTF-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
import urllib
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
def get_html(url):
try:
html = requests.get(url,headers=headers,timeout=30)
html.encoding = 'utf-8'
html.raise_for_status()
return html.text
except BaseException as f:
print('获取HTML文本失败,错误信息为',f)
def get_url_down(html):
try:
soup = BeautifulSoup(html,'html.parser')
urls = soup.find_all('a')
for url in urls:
if '/song?' in str(url.get("href")):
try:
s = str(url.string).decode('utf-8').encode('gbk')
split = str(url.get("href")).split('=')
url ='http://music.163.com/song/media/outer/url?id={}.mp3'.format(split[1])
print s
print url
path = 'F:\NetEase\\' + s+ '.mp3'
urllib.urlretrieve(str(url),str(path))
except Exception as f:
print('获取URL失败,错误信息为', f)
continue
except BaseException as f:
print('获取URL失败,错误信息为',f)
def main():
html = get_html('https://music.163.com/playlist?id=22155050')
get_url_down(html)
if __name__ == '__main__':
reload(sys) # 2
sys.setdefaultencoding('utf-8')
main()
其中用到的一些方法没有深究,只要实现功能就可以了,反正下载就可以了,李姐万岁!
效果如下:
有几点说明,1.可能有些歌曲下载不成功,这个原因没有深究;2.已经下架的歌曲,没有Outer链接了,无法下载;3,能够下载大部分歌曲(这样我已经很满足了)
歌曲下载好了之后,添加到网易云音乐的本地音乐,然后匹配音乐,发现之前很多无法下载的歌曲已经显示已下载了