Python无损音乐搜索引擎实现代码


Posted in Python onFebruary 02, 2018

Python无损音乐搜索引擎实现代码 

研究了一段时间酷狗音乐的接口,完美破解了其vip音乐下载方式,想着能更好的追求开源,故写下此篇文章,本文仅供学习参考。虽然没什么技术含量,但都是自己一点一点码出来,一点一点抓出来的。

一、综述:

根据酷狗的搜索接口以及无损音乐下载接口,做出爬虫系统。采用flask框架,前端提取搜索关键字,后端调用爬虫系统采集数据,并将数据前端呈现;

运行环境:windows/linux  python2.7

二、爬虫开发:

通过抓包的方式对酷狗客户端进行抓包,抓到两个接口:

1、搜索接口:

http://songsearch.kugou.com/song_search_v2?keyword={关键字}page=1

这个接口通过传递关键字,其返回的是一段json数据,数据包含音乐名称、歌手、专辑、总数据量等信息,当然最重要的是数据包含音乐各个品质的hash。

Python无损音乐搜索引擎实现代码 

默认接口返回的数据只包含30首音乐,为了能拿到所有的数据,只需要把pagesize更改就可以,所以我提取了总数据数量,然后再次发动一次数据请求,拿到全部的数据。当然,这个总数据量也就是json中的total也是作为搜索结果的依据,如果total == 0 则判断无法搜索到数据。

搜索到数据后,我就要提取无损音乐的hash,这个hash是音乐下载的关键,无损音乐hash键名:SQFileHash,提取到无损hash(如果是32个0就表示None),我把他的名称、歌手、hash以字典形式传递给下一个模块。

代码实现:

a.请求模块(复用率高):

# coding=utf-8
import requests
import json
headers = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  'Accept-Encoding': 'gzip, deflate',
  'Accept-Language': 'zh-CN,zh;q=0.9',
  'Cache-Control': 'max-age=0',
  'Connection': 'keep-alive',
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
         'Chrome/63.0.3239.132 Safari/537.36',
}
def parse(url):
  ret = json.loads(requests.get(url, headers=headers, timeout=5).text)
  # 返回的是已经转换过后的字典数据
  return ret
if __name__ == '__main__':
  parse()

b.搜索模块

# coding=utf-8
import copy
import MusicParse
def search(keyword):
  search_url = 'http://songsearch.kugou.com/song_search_v2?keyword={}page=1'.format(keyword)
  # 这里需要判断一下,ip与搜索字段可能会限制搜索,total进行判断
  total = MusicParse.parse(search_url)['data']['total']
  if total != 0:
    search_total_url = search_url + '&pagesize=%d' % total
    music_list = MusicParse.parse(search_total_url)['data']['lists']
    item, items = {}, []
    for music in music_list:
      if music['SQFileHash'] != '0'*32:
        item['Song'] = music['SongName'] # 歌名
        item['Singer'] = music['SingerName'] # 歌手
        item['Hash'] = music['SQFileHash'] # 歌曲无损hash
        items.append(copy.deepcopy(item))
    return items
  else:
    return None
if __name__ == '__main__':
  search()

到这步,音乐搜索接口以及利用完了,下面就是无损音乐搜索了。

2、音乐下载接口:

# V2版系统,pc版
Music_api_1 = 'http://trackercdnbj.kugou.com/i/v2/?cmd=23&pid=1&behavior=download'
# V2版系统,手机版(备用)
Music_api_2 = 'http://trackercdn.kugou.com/i/v2/?appid=1005&pid=2&cmd=25&behavior=play'
# 老版系统(备用)
Music_api_3 = 'http://trackercdn.kugou.com/i/?cmd=4&pid=1&forceDown=0&vip=1'

我这里准备三个接口,根据酷狗系统版本不同,采用不同加密方式,酷狗音乐下载的关键就是音乐接口处提交的key的加密方式,key是由hash加密生成的,不同的酷狗版本,加密方式不同:

酷狗v2版key的生成:md5(hash +”kgcloudv2″)

酷狗老版key的生成:md5(hash +”kgcloud”)

只要将音乐的hash+key添加到api_url ,get提交过去,就能返回一段json数据,数据中就包括了音乐的下载链接,然后在提取其download_url。下面我将采用酷狗的第一个接口完成代码的实现,当然,酷狗存在地区的限制,接口有效性也带检测,如果第一个不行就换一个,你懂得!!!然后我把数据做成字典进行传递。

代码实现:

# coding=utf-8
import copy
import hashlib
import MusicParse
import MusicSearch
# V2版系统,pc版,加密方式为md5(hash +"kgcloudv2")
Music_api_1 = 'http://trackercdnbj.kugou.com/i/v2/?cmd=23&pid=1&behavior=download'
# V2版系统,手机版,加密方式为md5(hash +"kgcloudv2") (备用)
Music_api_2 = 'http://trackercdn.kugou.com/i/v2/?appid=1005&pid=2&cmd=25&behavior=play'
# 老版系统,加密方式为md5(hash +"kgcloud")(备用)
Music_api_3 = 'http://trackercdn.kugou.com/i/?cmd=4&pid=1&forceDown=0&vip=1'
def V2Md5(Hash): # 用于生成key,适用于V2版酷狗系统
  return hashlib.md5((Hash + 'kgcloudv2').encode('utf-8')).hexdigest()
def Md5(Hash): # 用于老版酷狗系统
  return hashlib.md5((Hash + 'kgcloud').encode('utf-8')).hexdigest()
def HighSearch(keyword):
  music_list = MusicSearch.search(keyword)
  if music_list is not None:
    item, items = {}, []
    for music in music_list:
      Hash = str.lower(music['Hash'].encode('utf-8'))
      key_new = V2Md5(Hash) # 生成v2系统key
      try:
        DownUrl = MusicParse.parse(Music_api_1 + '&hash=%s&key=%s' % (Hash, key_new))['url']
        item['Song'] = music['Song'].encode('utf-8') # 歌名
        item['Singer'] = music['Singer'].encode('utf-8') # 歌手
        item['url'] = DownUrl
        items.append(copy.deepcopy(item))
      except KeyError:
        pass
    return items
if __name__ == '__main__':
  HighSearch()

酷狗的爬虫系统就设计完毕了,下面开始使用flask框架搭建前后端了。

三、引擎搭建

这个搜索引擎是基于flask框架的,设计思路比较简单,就是前端传递post数据(keyword)传递到后端,后端拿着这个keyword传递给爬虫,爬虫把数据返回给系统,系统在前端渲染出来。

代码实现:

# coding=utf-8
import sys
from flask import Flask
from flask import request, render_template
from KgSpider import HighMusicSearch
reload(sys)
sys.setdefaultencoding('utf-8')
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def search():
  if request.method == 'GET':
    return render_template('index.html')
  elif request.method == 'POST':
    keyword = request.form.get('keyword')
    items = HighMusicSearch.HighSearch(keyword)
    if items != None:
      return render_template('list.html', list=items)
    else:
      return '找不到!!!不支持英文'
  else:
    return render_template('404.html')
if __name__ == '__main__':
  app.run(debug=True)

四、调试

整改引擎系统,也就设计完毕,然我们试试效果:

1.启动脚本:python run.py

Python无损音乐搜索引擎实现代码 

2.输入关键字进行搜索

Python无损音乐搜索引擎实现代码 

五、总结

引擎搭建完毕,也能正常的运行了,但是这只是一个模型,完全没有考虑,多用户访问带来的压力,很容易崩溃,当然经过我的测试,发现只能搜索中文,英文完全无效,why?别问我,我也不知道!!!当然在这里我也想说一下,请尊重版权!!!虽然我是口是心非!!!!!

项目地址: 码云项目地址

总结

以上所述是小编给大家介绍的Python无损音乐搜索引擎实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
深入探究Python中变量的拷贝和作用域问题
May 05 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
用python生成1000个txt文件的方法
Oct 25 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
python写文件时覆盖原来的实例方法
Jul 22 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
python opencv旋转图片的使用方法
Jun 04 Python
Python面向对象class类属性及子类用法分析
Feb 02 #Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 #Python
Python星号*与**用法分析
Feb 02 #Python
Python模块WSGI使用详解
Feb 02 #Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 #Python
tensorflow中next_batch的具体使用
Feb 02 #Python
Python输出各行命令详解
Feb 01 #Python
You might like
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
Python Unittest自动化单元测试框架详解
2018/04/04 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
python实现ip地址的包含关系判断
2020/02/07 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
python元组拆包实现方法
2021/02/28 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
介绍一下linux的文件权限
2014/07/20 面试题
篝火晚会主持词
2014/03/25 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
民事答辩状范本
2015/05/21 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
家访教师心得体会
2016/01/23 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL