最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python無損音樂搜索引擎實現(xiàn)代碼

 更新時間:2018年02月02日 11:10:41   投稿:mrr  
這篇文章主要介紹了Python無損音樂搜索引擎的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

 

研究了一段時間酷狗音樂的接口,完美破解了其vip音樂下載方式,想著能更好的追求開源,故寫下此篇文章,本文僅供學(xué)習(xí)參考。雖然沒什么技術(shù)含量,但都是自己一點一點碼出來,一點一點抓出來的。

一、綜述:

根據(jù)酷狗的搜索接口以及無損音樂下載接口,做出爬蟲系統(tǒng)。采用flask框架,前端提取搜索關(guān)鍵字,后端調(diào)用爬蟲系統(tǒng)采集數(shù)據(jù),并將數(shù)據(jù)前端呈現(xiàn);

運行環(huán)境:windows/linux  python2.7

二、爬蟲開發(fā):

通過抓包的方式對酷狗客戶端進行抓包,抓到兩個接口:

1、搜索接口:

http://songsearch.kugou.com/song_search_v2?keyword={關(guān)鍵字}page=1

這個接口通過傳遞關(guān)鍵字,其返回的是一段json數(shù)據(jù),數(shù)據(jù)包含音樂名稱、歌手、專輯、總數(shù)據(jù)量等信息,當(dāng)然最重要的是數(shù)據(jù)包含音樂各個品質(zhì)的hash。

 

默認(rèn)接口返回的數(shù)據(jù)只包含30首音樂,為了能拿到所有的數(shù)據(jù),只需要把pagesize更改就可以,所以我提取了總數(shù)據(jù)數(shù)量,然后再次發(fā)動一次數(shù)據(jù)請求,拿到全部的數(shù)據(jù)。當(dāng)然,這個總數(shù)據(jù)量也就是json中的total也是作為搜索結(jié)果的依據(jù),如果total == 0 則判斷無法搜索到數(shù)據(jù)。

搜索到數(shù)據(jù)后,我就要提取無損音樂的hash,這個hash是音樂下載的關(guān)鍵,無損音樂hash鍵名:SQFileHash,提取到無損hash(如果是32個0就表示None),我把他的名稱、歌手、hash以字典形式傳遞給下一個模塊。

代碼實現(xiàn):

a.請求模塊(復(fù)用率高):

# 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)
  # 返回的是已經(jīng)轉(zhuǎn)換過后的字典數(shù)據(jù)
  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版系統(tǒng),pc版
Music_api_1 = 'http://trackercdnbj.kugou.com/i/v2/?cmd=23&pid=1&behavior=download'
# V2版系統(tǒng),手機版(備用)
Music_api_2 = 'http://trackercdn.kugou.com/i/v2/?appid=1005&pid=2&cmd=25&behavior=play'
# 老版系統(tǒng)(備用)
Music_api_3 = 'http://trackercdn.kugou.com/i/?cmd=4&pid=1&forceDown=0&vip=1'

我這里準(zhǔn)備三個接口,根據(jù)酷狗系統(tǒng)版本不同,采用不同加密方式,酷狗音樂下載的關(guān)鍵就是音樂接口處提交的key的加密方式,key是由hash加密生成的,不同的酷狗版本,加密方式不同:

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

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

只要將音樂的hash+key添加到api_url ,get提交過去,就能返回一段json數(shù)據(jù),數(shù)據(jù)中就包括了音樂的下載鏈接,然后在提取其download_url。下面我將采用酷狗的第一個接口完成代碼的實現(xiàn),當(dāng)然,酷狗存在地區(qū)的限制,接口有效性也帶檢測,如果第一個不行就換一個,你懂得?。?!然后我把數(shù)據(jù)做成字典進行傳遞。

代碼實現(xiàn):

# coding=utf-8
import copy
import hashlib
import MusicParse
import MusicSearch
# V2版系統(tǒng),pc版,加密方式為md5(hash +"kgcloudv2")
Music_api_1 = 'http://trackercdnbj.kugou.com/i/v2/?cmd=23&pid=1&behavior=download'
# V2版系統(tǒng),手機版,加密方式為md5(hash +"kgcloudv2") (備用)
Music_api_2 = 'http://trackercdn.kugou.com/i/v2/?appid=1005&pid=2&cmd=25&behavior=play'
# 老版系統(tǒng),加密方式為md5(hash +"kgcloud")(備用)
Music_api_3 = 'http://trackercdn.kugou.com/i/?cmd=4&pid=1&forceDown=0&vip=1'
def V2Md5(Hash): # 用于生成key,適用于V2版酷狗系統(tǒng)
  return hashlib.md5((Hash + 'kgcloudv2').encode('utf-8')).hexdigest()
def Md5(Hash): # 用于老版酷狗系統(tǒng)
  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系統(tǒng)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()

酷狗的爬蟲系統(tǒng)就設(shè)計完畢了,下面開始使用flask框架搭建前后端了。

三、引擎搭建

這個搜索引擎是基于flask框架的,設(shè)計思路比較簡單,就是前端傳遞post數(shù)據(jù)(keyword)傳遞到后端,后端拿著這個keyword傳遞給爬蟲,爬蟲把數(shù)據(jù)返回給系統(tǒng),系統(tǒng)在前端渲染出來。

代碼實現(xiàn):

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

四、調(diào)試

整改引擎系統(tǒng),也就設(shè)計完畢,然我們試試效果:

1.啟動腳本:python run.py

 

2.輸入關(guān)鍵字進行搜索

 

五、總結(jié)

引擎搭建完畢,也能正常的運行了,但是這只是一個模型,完全沒有考慮,多用戶訪問帶來的壓力,很容易崩潰,當(dāng)然經(jīng)過我的測試,發(fā)現(xiàn)只能搜索中文,英文完全無效,why?別問我,我也不知道?。?!當(dāng)然在這里我也想說一下,請尊重版權(quán)?。?!雖然我是口是心非?。。。?!

項目地址: 碼云項目地址

總結(jié)

以上所述是小編給大家介紹的Python無損音樂搜索引擎實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • python中cPickle用法例子分享

    python中cPickle用法例子分享

    這篇文章主要介紹了python中cPickle用法例子,有需要的朋友可以參考一下
    2014-01-01
  • Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    本文主要介紹了Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__),詳細(xì)的介紹了這幾種下劃線的用處,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • python中strip(),lstrip(),rstrip()函數(shù)的使用講解

    python中strip(),lstrip(),rstrip()函數(shù)的使用講解

    這篇文章主要介紹了python中strip(),lstrip(),rstrip()函數(shù)的使用講解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python如何禁用print輸出

    python如何禁用print輸出

    這篇文章主要介紹了python如何禁用print輸出問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python 獲取 datax 執(zhí)行結(jié)果保存到數(shù)據(jù)庫的方法

    Python 獲取 datax 執(zhí)行結(jié)果保存到數(shù)據(jù)庫的方法

    今天小編就為大家分享一篇Python 獲取 datax 執(zhí)行結(jié)果保存到數(shù)據(jù)庫的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python接口自動化之正則用例參數(shù)化的示例詳解

    python接口自動化之正則用例參數(shù)化的示例詳解

    這篇文章主要介紹了python接口自動化之正則用例參數(shù)化,它是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 使用python中的openpyxl操作excel詳解

    使用python中的openpyxl操作excel詳解

    這篇文章主要介紹了使用python中的openpyxl操作excel詳解,openpyxl 模塊是一個讀寫Excel文檔的Python庫,本文就來講解如何使用openpyxl操作excel,需要的朋友可以參考下
    2023-07-07
  • 五分鐘學(xué)會怎么用python做一個簡單的貪吃蛇

    五分鐘學(xué)會怎么用python做一個簡單的貪吃蛇

    這篇文章主要介紹了五分鐘學(xué)會怎么用python做一個簡單的貪吃蛇,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • python實現(xiàn)PolynomialFeatures多項式的方法

    python實現(xiàn)PolynomialFeatures多項式的方法

    這篇文章主要介紹了python實現(xiàn)PolynomialFeatures多項式的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 梳理總結(jié)Python開發(fā)中需要摒棄的18個壞習(xí)慣

    梳理總結(jié)Python開發(fā)中需要摒棄的18個壞習(xí)慣

    大家好,今天給大家分享 18 個 Python 初學(xué)者常有的壞習(xí)慣,這些壞習(xí)慣不僅影響 Python 代碼的可讀性,而且 影響 Python 的運行性能,摒棄這些壞習(xí)慣并以 Pythonic 的方式編寫代碼,提高的不僅僅是你的代碼質(zhì)量,也給閱讀代碼的人留下好印象
    2022-01-01

最新評論

黔江区| 涡阳县| 三台县| 平山县| 额尔古纳市| 清丰县| 宁强县| 上栗县| 类乌齐县| 滨州市| 紫阳县| 彭水| 桓台县| 宁陕县| 朔州市| 萝北县| 望奎县| 禄丰县| 冕宁县| 长宁县| 百色市| 曲水县| 左权县| 偏关县| 连平县| 永丰县| 灌南县| 冀州市| 陕西省| 茂名市| 淄博市| 秦皇岛市| 如东县| 木里| 仙游县| 宁陕县| 沙河市| 庆安县| 罗江县| 荣成市| 香港 |