pythonはクールな犬の音楽のダウンロードを実現して、およびtkインターフェイスの可視化を利用します.

9398 ワード

考え方分析:クール犬のホームページからhttp://www.kugou.com/検索ボックスに検索曲を入力したら、リクエストページが変更されました.
http://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=blueフォーマットでは、keywordフィールドは曲名の値を検索し、そのページで各曲の結果を検索します.曲へのリンクを探してから、インタフェースに入って曲を変えて、リンクを再生するようにします.
使用するライブラリ:
requests:ウェブページを要求するために使用します.
lxml:取得したウェブページを解析し、検索に必要なフィールドを行います.
urllib:リモートリンクをダウンロードして、mp 3ソースファイルをダウンロードします.
Json:解析戻りデータ
tkinter:インターフェースの作成
1)検索画面の歌曲情報を取得する:(キーワードblueを例として)
      初めての試みの時、私は直接検索ページのページに登りました.
url='http://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=blue'
res=requests.get(url,headers=headers)
しかし、出力resの内容は空です.そしてnetworkでそれぞれの要求をつけて、彼らのレスポンスを調べます.このようなウェブサイトを発見しました.
http://songsearch.kugou.com/song_search_v 2calback=jQuery 112407470964083509348_154929985284&keyword=blue&page=1&pagesize=30&userid=-1&clientver=&playFilter=2&iscorection=1&prive game==1filter=0&u=154929985286
python实现酷狗音乐下载,以及利用tk界面可视化_第1张图片
   このページの応答内容は以下の通りです.したがって、このリンクは実際の検索結果の要求リンクキーであると推測できます.
python实现酷狗音乐下载,以及利用tk界面可视化_第2张图片
そしてテスト結果:このページは確かに検索画面の歌曲情報を返します.jsonライブラリを使って解析してデータを返してもいいです.必要な曲名はFilename、FileHashです.
python实现酷狗音乐下载,以及利用tk界面可视化_第3张图片
曲情報を検索したコードは以下の通りです.
res = requests.get(url).text #       
js = json.loads(res[res.index('(') + 1:-2]) #   {}    
data = js['data']['lists'] #      lists 
for i in range(len(data)):
    name = str(data[i]['FileName']).replace('', '').replace('', '')
    fhash = str(data[i]['FileHash'])
    mp3_info[name]=fhash #       -hash  
2)シングル曲のダウンロードリンク:
シングル再生画面は以下の通りです.http://www.kugou.com/song/#hash=D9D954883F2CAD22B1F428D774B6CCE1&album_id=8246933
 このurlのhashフィールドが見られます.各曲の固有のフラグフィールドです.album_idはアルバムidです.もちろんこのページを直接ゲットしても、返信内容はまだ空きです.他のところから探す必要があります.
networkでリンクを見つけ、その曲の詳細情報とダウンロードリンクを返します.
python实现酷狗音乐下载,以及利用tk界面可视化_第4张图片
えんごを打つurlフィールドは歌のダウンロードリンクです.要求されたホームページは次の通りです.hash=後は歌のhashマークです.
http://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19103400224052340737_1537711829955&hash=
プレイを取得しますurlのコードは以下の通りです.前のように曲の情報を取得した後、url retrieveを使ってダウンロードすればいいです.
url='http://wwwapi.kugou.com/yy/index.phpr=play/getdata&callback=jQuery19103400224052340737_1537711829955&hash=' + mp3_hash  #mp3_hash         hash  
html = requests.get(url, headers=header2).text
real_url = json.loads(html[html.index('(') + 1:-2])["data"]["play_url"] #      
urlretrieve(real_url, path) #path       
 
3)完全コードは以下の通りです.
インタフェースデザインは簡単なtkを使っています.これに接触したばかりのために、簡単な機能しか使われませんでした.前のステップに合わせて検索とダウンロードの関数をボタンに結び付けて、listboxに検索結果を表示して、マウスの選択した行数の内容を取得してダウンロードします.
# coding = utf-8
from tkinter import *
import tkinter.messagebox
import requests
from lxml import etree
from urllib.request import urlretrieve
from tkinter.filedialog import askdirectory
import json

head={
    'Host': 'songsearch.kugou.com',
    'Origin': 'http://www.kugou.com/',
    'Referer': 'http://www.kugou.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}

header2={
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}

mp3_info = {} #    ,      hash
#         
def selectPath():
    path_ = askdirectory()
    path.set(path_)

def help_info():
    tkinter.messagebox._show('v0.0.1  ', '        .                ,          
:
( , , , )
( )
, bug, ') def cleartxt(): text.delete(0,END) def show(): text.delete(0,END) song = entry.get() # url = "http://songsearch.kugou.com/song_search_v2?callback=jQuery112407470964083509348_1534929985284&keyword={}&" \ "page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filte" \ "r=0&_=1534929985286".format(song) res = requests.get(url).text # type(res) str loads {} # print(res.index('(')) res {} js = json.loads(res[res.index('(') + 1:-2]) data = js['data']['lists'] # for i in range(len(data)): text.insert(END, ">>>" + str(data[i]['FileName']).replace('', '').replace('', '')) text.see(END) text.update() name = str(data[i]['FileName']).replace('', '').replace('', '') fhash = str(data[i]['FileHash']) mp3_info[name]=fhash def download(): if not entry_path.get(): tkinter.messagebox._show(' ', ' ') return pre_path = entry_path.get() content=entry.get() if content: num=text.curselection()[0] # (5,) if num != None:# num , data[num] ,listbox 0 mp3_name=text.get(num)[3:] # >>> , mp3_hash=mp3_info.get(mp3_name) #hash url = 'http://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19103400224052340737_1537711829955&hash=' + mp3_hash html = requests.get(url, headers=header2).text real_url = json.loads(html[html.index('(') + 1:-2])["data"]["play_url"] print(real_url) try: path = pre_path + '/' + mp3_name +'.mp3' if '\\' in path : path=path.replace('\\', '/') urlretrieve(real_url, path) tkinter.messagebox._show(' ',' ') return except Exception as e: print(" , :", e) return root = Tk() path = StringVar() root.title(" v0.0.1") root.geometry("600x400+550+230") Label(root, text=" ", font=('Consolas', 15)).grid(row=0, column=0) Button(root, text=" ", relief = 'ridge',font=("Consolas", 15), command=show).grid(row=0, column=2) entry = Entry(root, font=('Consolas', 15)) entry.grid(row=0, column=1) Label(root, text=" ", font=('Consolas', 15)).grid(row=2, column=0) # entry_path = Entry(root, textvariable = path,font=('Consolas', 15)) entry_path.grid(row=2, column=1) Button(root, text=" ", relief = 'ridge',font=("Consolas", 15), command=selectPath).grid(row=2, column=2)#,sticky=E) text = Listbox(root,selectmode = BROWSE,font=("Consolas", 15), width=45, height=10) text.grid(row=3, columnspan=2) Button(root, text=" ", relief = 'ridge',font=("Consolas", 15), command=cleartxt).grid(row=3, column=2,sticky=S) # btn_down=Button(root, text=" ",relief = 'ridge',font=("Consolas", 15), command=download).grid(row=4, column=0, sticky=W) Button(root, text=" ", relief = 'ridge',font=("Consolas", 15), command=root.quit).grid(row=4, column=1, sticky=E) Button(root, text=" ", relief = 'ridge',font=("Consolas", 15), command=help_info).grid(row=4, column=2, sticky=E) root.mainloop()
 
プログラム実行スクリーンショット:
python实现酷狗音乐下载,以及利用tk界面可视化_第5张图片
 
大きい人は噴かないでください.初心者はちょうどpythonに接触します.プログラムは簡単ですが、この例を通して、爬虫類の基本的な考え方を身につけています.直接ホームページに登って、欲しい結果が得られない時は、networkから観察して、実際の要求インターフェースを見つけたり、あるいは採用するgetはまだpost方法であり、必要なフィールドなどがあります.