python 爬虫下载网易歌单歌曲
可以根据歌单 id 来下载歌单中的所有音乐,付费音乐除外
可以自己输入歌单 id 来进行单个歌单下载,也可以结合上一篇文章
先取到所有的歌单信息,在进行所有歌单中的歌曲下载
爬取思路
- 判断是否输入歌单 id
- 输入了 id
- 拼接请求的歌单 url
- 发送请求,取到当前歌单中的所有歌曲的信息
- 遍历每个歌曲信息
- 拼接下载歌曲的 url,
http://music.163.com/song/media/outer/url?id=歌曲id
- 这个一个大佬的找到的网易接口,将歌曲 id 拼接即可请求到下载地址
- 发起请求,下载歌曲
- 未输入 id
- 根据上段代码 爬取网易云音乐所有歌单信息,执行完会将歌单信息保存到 TXT 文件中
- 从文件中读取分割出所有的歌单 url
- 遍历歌单 url,取到每个歌单中的所有歌曲的信息
- 遍历,拼接 url
- 发起请求,下载歌曲
爬虫自动创建文件夹
当代码执行时发现没有文件夹会报错,可以加上判断,没有文件夹,会自动创建
folder_path = "D:\develop\code\spider_code\其他\music" # 要保存到的路径,自己修改
if not os.path.exists(folder_path): # 判断有没有当前路径
os.makedirs(folder_path) # 没有就进行创建
代码
import os
import requests
from selenium import webdriver
class DwMusic:
def __init__(self, playlist_id):
# 下载链接前缀
self.url_temp = "http://music.163.com/song/media/outer/url?id="
self.playlist_id = playlist_id if playlist_id else None
self.playlist_url = "https://music.163.com/playlist?id={}".format(self.playlist_id if playlist_id else None)
self.driver = webdriver.Chrome()
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Safari/537.36"
}
def parse_get_url(self, url):
resp = requests.get(url, headers=self.headers)
return resp.content
def get_palylist_url(self):
playlist_url = []
with open('music_163.txt', 'r', encoding="utf-8") as f:
playlist_list = f.readlines()
for playlist in playlist_list:
if playlist != "\n":
playlist_url.append(playlist[-45:-1])
print(playlist_url)
return playlist_url
def get_song_url(self):
tr_list = self.driver.find_elements_by_xpath("//table[@class='m-table ']/tbody/tr")
song_list = []
for tr in tr_list:
items = {}
items["song_url"] = self.url_temp + tr.find_element_by_xpath(".//a").get_attribute("href")[30:]
items["song_name"] = tr.find_element_by_xpath(".//b").get_attribute("title")
print(items)
song_list.append(items)
return song_list
def download_song(self, song_list):
for song_info in song_list:
# 发起请求
try:
resp = self.parse_get_url(song_info["song_url"])
print("正在下载:{}".format(song_info["song_name"]))
folder_path = "D:\develop\code\spider_code\其他\music"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
with open("music/{}.mp3".format(song_info["song_name"]), 'wb+') as f:
f.write(resp)
print("***** {} 下载成功 *****".format(song_info["song_name"]))
except Exception as e:
print(e)
print("{}下载失败".format(song_info["song_name"]))
pass
def run(self):
if not self.playlist_id:
# 从文件中取到歌单的 url
playlist_url = self.get_palylist_url()
# 取到每个歌曲的 url
# 发送请求
for playlist in playlist_url:
self.driver.get(playlist)
# 进入到 iframe 框架中
self.driver.switch_to.frame('g_iframe')
# 取到歌曲 id,生成下载歌曲 url
song_list = self.get_song_url()
# 下载歌曲
self.download_song(song_list)
else:
self.driver.get(self.playlist_url)
# 进入到 iframe 框架中
self.driver.switch_to.frame('g_iframe')
# 取到歌曲 id,生成下载歌曲 url
song_list = self.get_song_url()
# 下载歌曲
self.download_song(song_list)
self.driver.quit()
if __name__ == '__main__':
playlist = input("请输入歌单id: ")
dwmusic = DwMusic(playlist)
dwmusic.run()