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を例として)
初めての試みの時、私は直接検索ページのページに登りました.
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
このページの応答内容は以下の通りです.したがって、このリンクは実際の検索結果の要求リンクキーであると推測できます.
そしてテスト結果:このページは確かに検索画面の歌曲情報を返します.jsonライブラリを使って解析してデータを返してもいいです.必要な曲名はFilename、FileHashです.
曲情報を検索したコードは以下の通りです.
シングル再生画面は以下の通りです.http://www.kugou.com/song/#hash=D9D954883F2CAD22B1F428D774B6CCE1&album_id=8246933
このurlのhashフィールドが見られます.各曲の固有のフラグフィールドです.album_idはアルバムidです.もちろんこのページを直接ゲットしても、返信内容はまだ空きです.他のところから探す必要があります.
networkでリンクを見つけ、その曲の詳細情報とダウンロードリンクを返します.
えんごを打つurlフィールドは歌のダウンロードリンクです.要求されたホームページは次の通りです.hash=後は歌のhashマークです.
インタフェースデザインは簡単なtkを使っています.これに接触したばかりのために、簡単な機能しか使われませんでした.前のステップに合わせて検索とダウンロードの関数をボタンに結び付けて、listboxに検索結果を表示して、マウスの選択した行数の内容を取得してダウンロードします.
プログラム実行スクリーンショット:
大きい人は噴かないでください.初心者はちょうどpythonに接触します.プログラムは簡単ですが、この例を通して、爬虫類の基本的な考え方を身につけています.直接ホームページに登って、欲しい結果が得られない時は、networkから観察して、実際の要求インターフェースを見つけたり、あるいは採用するgetはまだpost方法であり、必要なフィールドなどがあります.
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
このページの応答内容は以下の通りです.したがって、このリンクは実際の検索結果の要求リンクキーであると推測できます.
そしてテスト結果:このページは確かに検索画面の歌曲情報を返します.jsonライブラリを使って解析してデータを返してもいいです.必要な曲名はFilename、FileHashです.
曲情報を検索したコードは以下の通りです.
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でリンクを見つけ、その曲の詳細情報とダウンロードリンクを返します.
えんごを打つ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に接触します.プログラムは簡単ですが、この例を通して、爬虫類の基本的な考え方を身につけています.直接ホームページに登って、欲しい結果が得られない時は、networkから観察して、実際の要求インターフェースを見つけたり、あるいは採用するgetはまだpost方法であり、必要なフィールドなどがあります.