现在写博客总是喜欢先说说这个内容的需求或者应用场景。是的,如果写出来的东西没有应用价值,那确实是没有意义的。今天最早的需求来自于如何免费下载全网优质音乐[小白],去b站搜了一个大牛做的搜歌神器,界面是这样的:真的很简单可以使用,而且涵盖了网上大部分主流音乐网站,涉及的版本也很多,可谓是大而全,但是一个技术人的追求远非如此,所以想了解下其背后的原理,因为做过互联网了解爬虫的都知道,爬虫只能爬取某个页面或某几个页面的网站资源,所以很好奇它背后是如何实现的?笔者一直都是基于Python3.7版本做网络爬虫,所以本文也以此为基础进行学习记录。首先,爬取的网站并不是对应的音乐网站,而是一个音乐直连搜索,聚集了大部分音频音乐分析功能。接口如下:所以做一个搜索引擎的思路也很直观,就是利用第三方接口,直接向服务器发起请求,然后解析并保存获取到的数据即可。下面以下载最近流行的歌曲《白月光朱砂痣》为例:分析结果如上,得到的数据格式为json类型,除了歌名,还必须有音乐平台。源码实现如下:importrequestsimportjsonpathimportos"""1.url2.模拟浏览器请求3.解析网页源码4.保存数据"""defsong_download(url,title,author):#Createfolderos.makedirs("music",exist_ok=True)path='music\{}.mp3'.format(title)print('歌曲:{0}-{1},正在下载...'.format(title,author))#Download(这种读写文件的下载方式适用于下载少量文件)content=requests.get(url).contentwithopen(file=title+author+'.mp3',mode='wb')asf:f.write(content)print('下载完成,{0}-{1},请收听'.format(title,author))defget_music_name():"""搜索歌曲名称:return:"""name=input("请输入歌曲名称:")print("1.网易云:netease\n2.QQ:qq\n3.酷狗:kugou\n4.酷我:kuwo\n5.百度:baidu\n6.喜马拉雅:ximalaya")platfrom=input("请输入音乐平台类型:")print("------------------------------------------------------")url='https://music.liuzhijin.cn/'headers={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.141Safari/537.36",#判断请求是异步还是同步"x-要求-with":"XMLHttpRequest",}param={"input":name,"filter":"name","type":platfrom,"page":1,}res=requests.post(url=url,data=param,headers=headers)json_text=res.json()title=jsonpath.jsonpath(json_text,'$..title')author=jsonpath.jsonpath(json_text,'$..author')url=jsonpath.jsonpath(json_text,'$..url')iftitle:songs=list(zip(title,author,url))forsinsongs:print(s[0],s[1],s[2])print("---------------------------------------------------")index=int(input("请输入您要下载歌曲的版本:"))song_download(url[index],title[index],author[index])else:print("抱歉,没有searchresultsyet!")if__name__=="__main__":get_music_name()演示运行效果:然后文件下会出现对应的歌曲.mp3文件,每首歌曲的检索都是在PyCharm专业版的控制台进行的,这样的用户体验很差,所以我针对以上两个问题改进了源码#导入模块fromtkinterimport*importrequestsimportjsonpathimportosfromurllib.requestimporturlretrieve#2。功能实现"""1.url2.模拟浏览器请求3.解析网页源代码4.保存数据"""defsong_download(url,title,author):#创建文件夹os.makedirs("music",exist_ok=True)path='music\{}.mp3'.format(title)text.insert(END,'song:{0}-{1},downloading...'.format(title,author))#文本框滑动text.see(END)#Updatetext.update()#Downloadurlretrieve(url,path)text.insert(END,'下载完成,{0}-{1},请听'.format(title,author))#文本框滑动text.see(END)#Updatetext.update()defget_music_name():"""搜索歌曲名称:return:"""name=entry.get()platfrom=var.get()#name='WhiteMoonlightandCinnabarMole'url='https://music.liuzhijin.cn/'headers={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.141Safari/537.36",#判断请求是异步还是同步"x-requested-with":"XMLHttpRequest",}param={"input":name,"filter":"name","type":平台,“page":1,}res=requests.post(url=url,data=param,headers=headers)json_text=res.json()title=jsonpath.jsonpath(json_text,'$..title')author=jsonpath。jsonpath(json_text,'$..author')url=jsonpath.jsonpath(json_text,'$..url')print(title,author,url)song_download(url[0],title[0],author[0])#1.Userinterface#Createdrawingboardroot=Tk()#Setwindowtitleroot.title('NetworkMusicDownloader')#设置窗口大小和出现位置root.geometry('560x450+400+200')#标签组件label=Lab??el(root,text="请输入下载的歌曲:",font=('单体',20))#定位布局label.grid(row=0)#输入框组件entry=Entry(root,font=('宋体',20))entry.grid(row=0,column=1)#radiobuttonvar=StringVar()r1=Radiobutton(root,text='网易云',variable=var,value='网易')r1.grid(row=1,column=0)r2=Radiobutton(root,text='QQ',variable=var,value='qq')r2.grid(row=1,column=1)#列表框text=Listbox(root,font=('单体',16),width=50,height=15)text.grid(row=2,columnspan=2)#下载按钮button1=Button(root,text='开始下载',font=('Italian',15),command=get_music_name)button1.grid(row=3,column=0)button2=Button(root,text='退出程序',font=('斜体',15),command=root.quit)button2.grid(row=3,column=1)#显示界面root.mainloop()#如何将.py代码打包成.exe文件来看看效果吧添加UI界面和一些代码优化后,可以通过.py代码打包成.exe文件发布给用户
