Python教程

Python爬取网易云音乐歌单v1.1

本文主要是介绍Python爬取网易云音乐歌单v1.1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

需要安装requests、bs4模块

安装方法:cmd进入控制台

pip install requests

pip install bs4

 

源码:

  1 # -*- coding:utf-8 -*-
  2 import requests,os,json
  3 from bs4 import BeautifulSoup
  4 
  5 print(
  6     '''
  7     --------------------------------------
  8     
  9               网易云音乐歌单下载
 10             
 11                             by:冷溪凌寒
 12                                  V 1.1
 13     --------------------------------------
 14     '''
 15 )
 16 
 17 
 18 headers = {
 19     'Connection': 'close',
 20     'Referer': 'https://music.163.com/',
 21     'Host': 'music.163.com',
 22     'cookie':'', #自己获取
 23     "Accept-Encoding": "identity",
 24     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
 25     "user-agent":''#自己获取
 26 }
 27 s = requests.session() # 保持已登录状态
 28 format = '{0:<10}\t{1:{3}<10}\t{2:<10}' # 输出规则
 29 
 30 def get_list(url): # 获取歌单列表
 31     try:
 32         response = s.get(url, headers=headers).content # 获取网页
 33         soup = BeautifulSoup(response, 'html.parser') # html格式
 34         lis = list(soup.find('ul')) # 寻找ul标签
 35         father_list = [str(soup.find('h2').string)] # 获取歌单名字到表[0]
 36         for i in lis:
 37             son_list = []
 38             son_list.append(str(len(father_list)) + '.') # 序号
 39             son_list.append(i.a.string) # 歌曲名称
 40             son_list.append(str(i.a.get('href'))[str(i.a.get('href')).find('=') + 1:-1] + str(i.a.get('href'))[-1]) # 歌曲链接
 41             father_list.append(son_list) # 添加到列表
 42 
 43     except:
 44         print("\n\t歌曲链接输入错误") # 错误情况
 45         exit('ERROR!')  
 46 
 47     print("从'{}'中找到了{}条歌曲".format(str(soup.find('h2').string), len(father_list) - 1))
 48     return father_list
 49 
 50 
 51 def mkdir(dir):#创建文件夹
 52     dir = dir.translate({ord(i): None for i in '/\\:*?"<>|'}) # 将 /\:*?"<>| 文件不能命名的符号去除
 53 
 54     isExists=os.path.exists(dir)#判断是否创建了文件夹
 55     if not isExists:
 56         os.makedirs(dir)#创建文件夹
 57         print("创建文件夹'%s',将图片放入'%s'文件夹内。"%(dir,dir))
 58     else:
 59         print("已经有'%s'文件夹,将图片放入'%s'文件夹内。"%(dir,dir))
 60 
 61 
 62 def download(list):#根据歌曲列表下载歌曲
 63     print('---------------------------------------------------------------------------------------------------')
 64     print('序号            歌曲名称                歌曲链接')
 65     for i in list:
 66         if list.index(i)==0:
 67             continue    
 68         else:
 69             i[1] = i[1].translate({ord(i): None for i in '/\\:*?"<>|'}) # 将 /\:*?"<>| 文件不能命名的符号去除
 70 
 71             print(format.format(i[0], i[1], 'http://music.163.com/song/media/outer/url?id=' + i[2] + '.mp3', chr(12288))) # 排版
 72             # song_url = "https://link.hhtjim.com/163/" + i[2] + ".mp3" # 外链地址
 73             
 74             temp_url = "https://api.imjad.cn/cloudmusic/?type=song&id=" + i[2] # 外链地址
 75             temp_jsons = requests.get(temp_url).text
 76             temp_list=json.loads(temp_jsons).get('data')
 77             song_url=temp_list[0]["url"]
 78             song = requests.get(song_url).content # 获取歌曲源
 79             with open(list[0] +'/'+ i[1] + '.mp3', 'wb') as f: # 写入文件夹
 80                 f.write(song)
 81                 f.close()
 82 
 83     print('---------------------------------------------------------------------------------------------------')
 84     print('下载结束!')
 85 
 86 def download_song(id,url):#根据歌曲列表下载歌曲
 87     response = s.get(url, headers=headers).content # 获取网页
 88     soup = BeautifulSoup(response, 'html.parser') # html格式
 89     name = str(soup.find('em').string) # 获取歌曲名
 90     print('---------------------------------------------------------------------------------------------------')
 91     name = name.translate({ord(i): None for i in '/\\:*?"<>|'}) # 将 /\:*?"<>| 文件不能命名的符号去除
 92     print(format.format(1, name, 'http://music.163.com/song/media/outer/url?id=' + id + '.mp3', chr(12288))) # 排版
 93 
 94     temp_url = "https://api.imjad.cn/cloudmusic/?type=song&id=" + id # 外链地址
 95     temp_jsons = requests.get(temp_url).text
 96     temp_list=json.loads(temp_jsons).get('data')
 97     song_url=temp_list[0]["url"]
 98     song = requests.get(song_url).content # 获取歌曲源
 99     with open(name + '.mp3', 'wb') as f: # 写入文件夹
100         f.write(song)
101         f.close()
102     
103     print('---------------------------------------------------------------------------------------------------')
104     print('下载结束!')
105 
106 choose=input("请选择下载模式\n1为根据歌单ID下载列表歌曲\n2为根据歌曲ID下载单首歌曲\n")
107 if(choose=="1"):
108     search=input("请输入歌单ID:")
109     url="https://music.163.com/playlist?id="+search # 歌单地址
110     music_list=get_list(url) # 获取歌单列表
111     mkdir(music_list[0]) # 创建文件夹
112     download(music_list) # 通过歌单列表下载音乐
113 elif(choose=="2"):
114     search=input("请输入歌曲ID:")
115     url="https://music.163.com/song?id="+search # 歌曲地址
116     download_song(search,url)
117 else:
118     print("输入错误!")

 

cookie与user-agent获取方法:

登录后进入https://music.163.com/

 

 

 

 

 找到后写入代码中即可

这篇关于Python爬取网易云音乐歌单v1.1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!