Python实现酷狗无损音乐搜索引擎完整代码解析

沈知远
沈知远
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍如何利用Python编写酷狗音乐无损搜索引擎。通过抓包分析搜索与下载接口,解析Hash加密机制,结合Flask框架搭建前后端系统。文章提供完整代码实现,涵盖请求模块、搜索逻辑及高音质下载策略,供技术学习与参考。

 

在深入研究酷狗音乐接口后,实现了其VIP音乐的下载功能。为了促进开源技术交流,特此整理并发布本文,内容仅供学习参考。尽管技术难度不高,但所有代码与接口数据均经过手动抓取与编写。

一、总体概述

本系统基于酷狗的搜索接口与无损音乐下载接口构建爬虫程序。后端采用Flask框架,负责接收前端提交的关键字并调用爬虫系统获取数据,最终将结果返回至前端展示。

运行环境要求:Windows或Linux系统,Python 2.7版本。

二、爬虫模块开发

通过对酷狗客户端进行抓包分析,获取到两个关键接口:

1、搜索接口

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

该接口通过传入关键字返回JSON格式数据,包含音乐名称、歌手、专辑及总数据量等信息。其中,包含各品质音乐的Hash值是核心数据。

 

默认接口仅返回30条结果。为获取全部数据,需修改pagesize参数。通过提取JSON中的total字段确定总数量,再次发起请求以获取完整列表。若total为0,则判定无搜索结果。

获取数据后,需提取无损音乐的Hash值,这是下载的关键。无损音乐的Hash键名为SQFileHash。若该值为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)至后端,后端将其传递给爬虫系统,爬虫返回数据后由前端进行渲染展示。

代码实现

# 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。

 

2. 输入关键字进行搜索。

 

五、总结

引擎搭建完成并可正常运行,但这仅是一个基础模型,未考虑多用户访问带来的压力,容易崩溃。经测试发现,该系统仅支持中文搜索,英文搜索无效,具体原因未明。在此强调,请尊重版权。尽管文中表述看似矛盾,但仍需遵守相关规定。

项目地址:码云项目地址。

总结

以上介绍了Python无损音乐搜索引擎的实现代码,希望对大家有所帮助。如有疑问请留言,小编会及时回复。感谢大家对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表