1. 程式人生 > >python 爬蟲下載網易歌單歌曲

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