1. 程式人生 > >Python爬取下載網易雲音樂

Python爬取下載網易雲音樂

from urllib import request
import requests
import re
from bs4 import BeautifulSoup
from pprint import pprint
import urllib, time


def get_content(url):
    headers = {
        'Host': 'music.163.com',
        'Referer': 'https://music.163.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'#網頁版瀏覽器下的連結,谷歌瀏覽器開啟開發者工具獲取此地址,其他瀏覽器開啟web工具箱
    }
    r = requests.session()
    r = BeautifulSoup(r.get(url, headers=headers).content, "html.parser")
    return r


def save(r):
    music_dict = {}
    result = r.find('ul', {'class': 'f-hide'}).find_all('a')
    # print(result)
    for music in result:
        music_dict[music['href'].strip("/song?id=")] = music.text
    # for k, v in src_dict.items():
    # print(k, v)
    return music_dict


def download_song(song_id, music_dict):
    try:
        song_url = 'http://music.163.com/song/media/outer/url?id=%s.mp3' % song_id  # 該連結為瀏覽器在網頁版快取歌曲的下載連結
        # song_content=get_content(song_url)
        # print(song_content)
        # urllib.request.urlretrieve(song_url, r'C:\Users\Administrator\Desktop\%s.mp3'%music_dict[song_id])  # 下載檔案
        # request.urlretrieve(song_url, r'C:\Users\Administrator\Desktop\%S.mp3'%music_dict[song_id])
        urllib.request.urlretrieve(song_url, 'E:\\test\\%s.mp3' % music_dict[song_id])
        time.sleep(0.9)
        print("下載完成!")
    except KeyError:
        print("請確認歌曲id是否正確或者歌曲是否收費。")


def write(music_dict):
    fp = open('music1.txt', 'a')
    for k, v in music_dict.items():
        fp.write(music_dict[k] + "\r\n" + "id:" + k + "\r\n")
    fp.close()


if __name__ == '__main__':
    url = 'https://music.163.com/playlist?id=2450495265'#歌單鏈接,右鍵點選歌單獲取連結
    r = get_content(url)
    music_dict = save(r)
    pprint(music_dict)
    # print(musiclist[5]+"\r\n"+musiclist[6])
    write(music_dict)
    print("---------------------")
    while 1:
        song_id = input("(輸入0退出)請輸入想下載的歌曲id:")
        if song_id == '0':
            print("歡迎使用")
            break
        print("正在搜尋歌曲資訊並下載.")
        # musiclist=",".join(musiclist)
        download_song(song_id, music_dict)