python 爬虫下载网易歌单歌曲

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()

猜你喜欢

转载自blog.csdn.net/qyf__123/article/details/84798944