python 爬蟲下載網易歌單歌曲
阿新 • • 發佈:2018-12-24
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()