Python爬虫全网搜索并下载音乐
现在写一篇博客总是喜欢先谈需求或者本内容的应用场景,是的,如果写出来的东西没有任何应用价值,确实也没有实际意义。今天的最早的需求是来自于如何免费[白嫖]下载全网优质音乐,我去b站上面搜索到了一个大牛做过的一个歌曲搜素神器,界面是这样的:

确实很好用的,而且涵盖了互联网上面大多数主流的音乐网站,涉及到的版本也很多,可谓大而全,但是一个技术人的追求远远不会如此,于是我就想去了解其中背后的原理,因为做过网络爬虫的人都知道,爬虫只能爬取某一页或者某些页的网站资源,所以我很好奇它背后是怎么实现的?
笔者一直以来都是做的基于Python3.7版本的网络爬虫,所以本文也是基于此来学习记录的。首先爬取的网站不是对应的音乐网站,而是一个音乐直链搜索,那里汇聚了大多数音频音乐的解析功能,界面如下:

所以自制一个搜索引擎的思想也很直观了,那就是利用第三方的接口,直接对该服务器发起请求即可,然后将获取的数据进行解析保存。这里以最近比较火的歌曲“白月光与朱砂痣”下载为例:

解析的结果如上,获取的数据格式是json类型,并且除了要有歌名以外,还要有音乐平台。
源代码实现如下:
import requests
import jsonpath
import os
"""
1.url
2.模拟浏览器请求
3.解析网页源代码
4.保存数据
"""
def song_download(url,title,author):
# 创建文件夹
os.makedirs("music",exist_ok=True)
path = 'music\{}.mp3'.format(title)
print('歌曲:{0}-{1},正在下载...'.format(title,author))
# 下载(这种读写文件的下载方式适合少量文件的下载)
content = requests.get(url).content
with open(file = title + author + '.mp3',mode='wb') as f:
f.write(content)
print('下载完毕,{0}-{1},请试听'.format(title,author))
def get_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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
# 判断请求是异步还是同步
"x-requested-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')
if title:
songs = list(zip(title,author,url))
for s in songs:
print(s[0],s[1],s[2])
print("-------------------------------------------------------")
index = int(input("请输入您想下载的歌曲版本:"))
song_download(url[index],title[index],author[index])
else:
print("对不起,暂无搜索结果!")
if __name__ == "__main__":
get_music_name()
演示一下运行效果:

然后文件下就会出现对应的歌曲.mp3文件

并且每次的歌曲检索都是在PyCharm专业版的控制台中进行的,这样的用户体验就非常糟糕,所以针对以上两个问题,我对源代码进行了改进。
# 导入模块
from tkinter import *
import requests
import jsonpath
import os
from urllib.request import urlretrieve
# 2.功能实现
"""
1.url
2.模拟浏览器请求
3.解析网页源代码
4.保存数据
"""
def song_download(url,title,author):
# 创建文件夹
os.makedirs("music",exist_ok=True)
path = 'music\{}.mp3'.format(title)
text.insert(END,'歌曲:{0}-{1},正在下载...'.format(title,author))
# 文本框滑动
text.see(END)
# 更新
text.update()
# 下载
urlretrieve(url,path)
text.insert(END,'下载完毕,{0}-{1},请试听'.format(title,author))
# 文本框滑动
text.see(END)
# 更新
text.update()
def get_music_name():
"""
搜索歌曲名称
:return:
"""
name = entry.get()
platfrom = var.get()
# name = '白月光与朱砂痣'
url = 'https://music.liuzhijin.cn/'
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
# 判断请求是异步还是同步
"x-requested-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')
print(title,author,url)
song_download(url[0],title[0],author[0])
# 1.用户界面
# 创建画板
root = Tk()
# 设置窗口标题
root.title('全网音乐下载器')
# 设置窗口大小以及出现的位置
root.geometry('560x450+400+200')
# 标签组件
label = Label(root,text="请输入下载的歌曲:",font=('楷体',20))
# 定位与布局
label.grid(row=0)
# 输入框组件
entry = Entry(root,font=('宋体',20))
entry.grid(row=0,column=1)
# 单选按钮
var = StringVar()
r1 = Radiobutton(root,text='网易云',variable=var,value='netease')
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=('楷体',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文件发布给用户使用了。
Python爬虫全网搜索并下载音乐的更多相关文章
- python一键电影搜索与下载
代码地址如下:http://www.demodashi.com/demo/14313.html python一键电影搜索与下载 概述 使用python搜索并爬取豆瓣电影信息,包括评分,主演,导演,类型 ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- Python爬虫帮你打包下载所有抖音好听的背景音乐,还不快收藏一起听歌【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 爱奇艺用券付费VIP电影+python爬虫程序+可视化界面+下载本地
申明:本博客中的工具及源码仅供个人学习使用,请勿用作商业等其他任何违法用途!否则后果自负 直接步入正题吧! 工具开发环境:windows10,python3.6 工具界面设计:基于python 自带的 ...
- Python爬虫实战:批量下载网站图片
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: GitPython PS:如有需要Python学习资料的小伙伴可以 ...
- 【Python爬虫案例学习】下载某图片网站的所有图集
前言 其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. 其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行. 基本环境配置 python 版本:2.7 ...
- Python 爬虫学习 网页图片下载
使用正则表达式匹配 # coding:utf-8 import re import urllib def get_content(url): """ Evilxr, &q ...
- python爬虫:抓取下载电影文件,合并ts文件为完整视频
目标网站:https://www.88ys.cc/vod-play-id-58547-src-1-num-1.html 反贪风暴4 对电影进行分析 我们发现,电影是按片段一点点加载出来的,我们分别抓取 ...
- python爬虫模块之HTML下载模块
HTML下载模块 该模块主要是根据提供的url进行下载对应url的网页内容.使用模块requets-HTML,加入重试逻辑以及设定最大重试次数,同时限制访问时间,防止长时间未响应造成程序假死现象. 根 ...
随机推荐
- 02_Python基础
2.1 第一条编程语句 print("Hello, Python!") print("To be, or not to be, it's a question." ...
- Py-面向对象,组合,继承
面向对象 只有特定对象能使用特定的几个方法对象=特征+动作 def dog(name,gender,type): #狗的动作 def jiao(dog): print('一条狗%s,汪汪汪' %dog ...
- 笔记 | pandas之时间序列学习随笔1
1. 时间序列自动生成 ts = pd.Series(np.arange(1, 901), index=pd.date_range('2010-1-1', periods=900)) 最终生成了从20 ...
- PCB导线长宽与电源压降
为了计算PCB中电源线走线后的压降,需要知道PCB中使用的铜的电阻率, PCB板中的铜是直接贴上去的铜箔,因此可以当成纯铜(我问了PCB打样的厂家他们的铜的电阻率,但是他们给我说不知道,所以干脆就当成 ...
- On-the-fly Garbage Collection: an Exercise in Cooperation
On-the-fly Garbage Collection: an Exercise in Cooperation - Microsoft Research https://www.microsoft ...
- 编码占用的字节数 1 byte 8 bit 1 sh 1 bit 中文字符编码 2. 字符与编码在程序中的实现 变长编码 Unicode UTF-8 转换 在网络上传输 保存到磁盘上 bytes
小结: 1.UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等: 2 服务器->网页 utf-8 ...
- OpenSSL 常见对称加密算法特性分析
在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢? 对于加密方式.算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高. 现在主流的加密协议的安全性均能 ...
- windows下hash抓取的几种方式
前提:在渗透测试过程中,对于windows系统的机器渗透需要注意hash的获取,其中hash分为LM-HASH与NTLM-HASH,在windows系统中,hash的默认存储位置为: C:\Windo ...
- 【uva 1515】Pool construction(图论--网络流最小割 模型题)
题意:有一个水塘,要求把它用围栏围起来,每个费用为b.其中,(#)代表草,(.)代表洞,把一个草变成洞需要费用d, 把一个洞变成草需要费用f.请输出合法方案中的最小费用. 解法:(不好理解...... ...
- 【uva 1612】Guess(算法效率,2种想法)
题意:已知 N 位选手的3题的预期得分,得分要不全拿,要不为0.且知道最后的实际名次,而且得分相同的选手,ID小的排在前面.问这样的名次可能吗.若可能,输出最后一名的最高可能得分.(N≤16384) ...