Python基于爬虫实现全网搜索并下载音乐


Posted in Python onFebruary 14, 2021

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

Python基于爬虫实现全网搜索并下载音乐

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

Python基于爬虫实现全网搜索并下载音乐

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

Python基于爬虫实现全网搜索并下载音乐

解析的结果如上,获取的数据格式是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()

演示一下运行效果:

Python基于爬虫实现全网搜索并下载音乐

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

Python基于爬虫实现全网搜索并下载音乐

并且每次的歌曲检索都是在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()

我们再来看看效果吧

Python基于爬虫实现全网搜索并下载音乐

这样加上了UI界面和部分代码优化之后,就可以通过.py代码打包成.exe文件发布给用户使用了。

以上就是Python基于爬虫实现全网搜索并下载音乐的详细内容,更多关于python 爬虫下载音乐的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Django中的文件的上传的几种方式
Jul 23 Python
Python参数类型以及常见的坑详解
Jul 08 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
python中xlutils库用法浅析
Dec 29 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
Python LMDB库的使用示例
Feb 14 #Python
python 装饰器重要在哪
Feb 14 #Python
python爬虫如何解决图片验证码
Feb 14 #Python
Python实现粒子群算法的示例
Feb 14 #Python
Python中对象的比较操作==和is区别详析
Feb 12 #Python
python绘图模块之利用turtle画图
Feb 12 #Python
Python列表的深复制和浅复制示例详解
Feb 12 #Python
You might like
Zend Framework分发器用法示例
2016/12/11 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
Python3 读取Word文件方式
2020/02/13 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
舞蹈教育学专业推荐信
2013/11/27 职场文书
经济管理专业自荐信
2013/12/30 职场文书
投标担保书范文
2014/04/02 职场文书
询价采购方案
2014/06/09 职场文书
幸福家庭标语
2014/06/27 职场文书
婚礼新人答谢词
2015/01/04 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
实例详解Python的进程,线程和协程
2022/03/13 Python
MySQL 语句执行顺序举例解析
2022/06/05 MySQL