基本信息
源码名称:python下载网易云音乐(仅供参考学习)
源码大小:2.67KB
文件格式:.rar
开发语言:Python
更新时间:2019-05-04
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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