实例介绍
【实例简介】
【实例截图】
【核心代码】
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
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论