基本信息
源码名称:python下载网易云音乐(仅供参考学习)
源码大小:2.67KB
文件格式:.rar
开发语言:Python
更新时间:2019-05-04
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

from urllib import request
import random
import os
import sys
import lxml
import sqlite3
from multiprocessing import Pool

ua_list=[
    {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},
    {'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)"},
    {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0"}
    ]

header = {
        'User-Agent':random.choice(ua_list)["User-Agent"]
        }


def url_request(url):
    requ = request.Request(url,headers=header)
    html = request.urlopen(requ).read().decode("utf-8")

    return html

def createDB():
    conn = sqlite3.connect('163.db')
    c = conn.cursor()
    c.execute('CREATE TABLE art_id(id INTEGER PRIMARY KEY AUTOINCREMENT, art_name text, art_id text)')
    c.execute('CREATE TABLE song_id(id INTEGER PRIMARY KEY AUTOINCREMENT, song_name text, song_id text, song_art_name text, song_art_id text)')
    conn.commit()
    conn.close()
    print ('新数据库创建成功')
    return None

def save_art_date(art_name,art_id):
    try:
        conn = sqlite3.connect('163.db')
        c = conn.cursor()
        c.execute("INSERT into art_id(art_name, art_id) VALUES ('{0}','{1}')".format(art_name,art_id))
        conn.commit()
        conn.close()
    except:
        pass

def save_song_date(song_name,song_id,song_art_name,song_art_id):
    try:
        conn = sqlite3.connect('163.db')
        c = conn.cursor()
        c.execute("INSERT into song_id(song_name,song_id,song_art_name,song_art_id) VALUES ('{0}','{1}','{2}','{3}')".format(song_name,song_id,song_art_name,song_art_id))
        print("正在存储---'{0}'-'{1}'".format(song_name,song_art_name))
        conn.commit()
        conn.close()
    except:
        pass

def song_down(song_id,song_name,song_art_name):
    url ="http://music.163.com/song/media/outer/url?id={0}.mp3".format(song_id)
    header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    requ = request.Request(url, headers=header)
    html = request.urlopen(requ).read()
    with open("{0}-{1}.mp3".format(song_name,song_art_name), "wb") as song_f:
        song_f.write(html)
    print("{0}-{1}.mp3下载完成!".format(song_name,song_art_name))


def search_db(name, song):
    conn = sqlite3.connect('163.db')
    c = conn.cursor()
    try:
        c.execute("DROP TABLE temp")
    except:
        count = 0
    c.execute('CREATE TABLE temp(id INTEGER PRIMARY KEY AUTOINCREMENT, song_name text, song_id text, song_art_name text)')
    res = c.execute("SELECT song_name,song_id,song_art_name FROM song_id WHERE song_name LIKE '%{0}%' AND song_art_name LIKE '%{1}%'".format(song, name))
    count = 0
    for i in res:
        t_song_name = i[0]
        t_song_id = i[1]
        t_song_art_name = i[2]
        c.execute("INSERT into temp(song_name,song_id,song_art_name) VALUES ('{0}','{1}','{2}')".format(t_song_name, t_song_id, t_song_art_name))
        count = count   1
    if count > 0:
        print("共找到{0}首:".format(count))
        temp = c.execute("SELECT song_name,song_id,song_art_name FROM temp")
        t_count = 1
        for i in temp:
            print("{0}->{1}-{2}".format(t_count,i[0],i[2]))
            t_count = t_count   1
        downnum = 1
        try:
            downnum = int(input("请输入要下载曲目的序号,全部下载输入“0”,无输入取消下载:"))
        except:
            downnum = t_count
        if downnum == 0:
            temp = c.execute("SELECT song_name,song_id,song_art_name FROM temp")
            for i in temp:
                song_down(song_id=i[1],song_name=i[0],song_art_name=i[2])
            print("全部曲目下载完成!")
            os.system('pause')
        elif downnum > 0 and downnum < t_count:
            t = 1
            temp = c.execute("SELECT song_name,song_id,song_art_name FROM temp")
            for i in temp:
                if t == downnum:
                    song_down(song_id=i[1], song_name=i[0], song_art_name=i[2])
                    os.system('pause')
                    break
                else:
                    t = t   1
        else:
            print("下载取消,返回主菜单!")
    elif count == 0:
        print("未找到相关曲目,请重试!")
        os.system('pause')
    c.execute("DROP TABLE temp")
    conn.close()

def get_artist(url):
    html = url_request(url)
    html = lxml.etree.HTML(html)
    li_art = html.xpath('//*[@id="m-artist-box"]/li')
    for art in li_art:
        art_name=art.xpath(".//a[1]/text()")[0]
        art_id =art.xpath(".//a[1]/@href")[0]
        art_id = art_id.replace('/artist?id=','')
        save_art_date(art_name=art_name, art_id=art_id)
        get_art_song(art_name,art_id)

def get_art_song(art_name,art_id):
      url = "https://music.163.com/artist?id={}".format(art_id)
      html = url_request(url)
      html = lxml.etree.HTML(html)
      li_song = html.xpath('//ul[@class="f-hide"]/li')
      for song in li_song:
          song_name = song.xpath("./a/text()")[0]
          song_src = song.xpath("./a/@href")[0]
          song_id = song_src.replace('/song?id=','')
          save_song_date(song_name=song_name, song_id=song_id, song_art_name=art_name, song_art_id=art_id)

def intdatabase():
    try:
        os.remove("163.db")
        print("旧数据库已删除")
    except:
        pass
    try:
        createDB()
    except:
        pass
    art_id_ch = [1001, 1002, 1003]
    art_id_ou = [2001, 2002, 2003]
    art_id_jp = [6001, 6002, 6003]
    art_id_un1 = [7001, 7002, 7003]
    art_id_un2 = [4001, 4002, 4003]

    all_art_id = art_id_ch   art_id_ou   art_id_jp   art_id_un1   art_id_un2
    pool = Pool()
    for x in all_art_id:
        url_artist = "https://music.163.com/discover/artist/cat?id={}".format(x)
        pool.apply_async(get_artist, (url_artist,))
    pool.close()
    pool.join()

def printmenu():
    print("################################################")
    print("##--------------------------------------------##")
    print("##             简易网易音乐下载器             ##")
    print("##--------------------------------------------##")
    print("##                                            ##")
    print("##    1->数据库初始化                         ##")
    print("##                                            ##")
    print("##    2->音乐下载                             ##")
    print("##                                            ##")
    print("##    3->退出                                 ##")
    print("##                                            ##")
    print("##  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ##")
    print("##  此程序仅供学习交流使用,请务用于商业用途  ##")
    print("##  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ##")
    print("##                                            ##")
    print("##  请支持正版音乐!!!                      ##")
    print("##                                            ##")
    print("##   by:dlwjmcf@吾爱                          ##")
    print("################################################")

def printmenu1():
    print("################################################")
    print("##--------------------------------------------##")
    print("##                    警告                    ##")
    print("##--------------------------------------------##")
    print("##                                            ##")
    print("##    数据库初始化会删除原有信息              ##")
    print("##                                            ##")
    print("##    确定吗?                                ##")
    print("##                                            ##")
    print("##    N->返回主菜单                           ##")
    print("##                                            ##")
    print("##    YES->确认                               ##")
    print("##                                            ##")
    print("##                                            ##")
    print("##                                            ##")
    print("################################################")

if __name__ == "__main__":
    job = 0
    while 1:
        if job == 0:
             printmenu()
        elif job == 1:
            conf = ''
            printmenu1()
            conf = input("输入“YES”确认初始化(默认N):")
            if conf == 'YES' or conf == 'yes':
                intdatabase()
            job = 0
            continue
        elif job ==2:
            name=input("请输入歌手:")
            song=input("请输入歌曲:")
            search_db(name, song)
            job = 0
            continue
        elif job ==3:
            sys.exit()
        else:
            print("错误的输入,请重试!")
        try:
            job = int(input('你想要做什么:'))
        except:
            job = 9