標籤:
今天挑戰下百度音樂抓取,先用Chrome分析下請求的連結。
最關鍵的就是這個連結
http://play.baidu.com/data/music/songlink
請求這個帶上songid就能返回給你音樂的json,那麼怎麼來擷取songid呢?
點開 http://music.baidu.com/tag,找個標籤進去。然後查看頁面源碼。發現有以下片段。
在每首歌曲的li元素的data-songitem裡面恰巧包含我們需要的sid。ok,目標明確了,首先請求百度音樂的音樂標籤頁,然後獲得sid。然後請求
http://play.baidu.com/data/music/songlink
並且帶上我們組裝好的sid。最後根據返回json擷取我們需要的資訊。
代碼如下(剛學Python,寫的不是太好):
#!/usr/bin/python#coding=utf-8__author__ = ‘zhm‘import urllibimport urllib2import refrom json import *#SONG_TAG_URL = ‘http://music.baidu.com/tag/%E7%BB%8F%E5%85%B8%E8%80%81%E6%AD%8C‘SONG_LINK_URL = ‘http://play.baidu.com/data/music/songlink‘def getContent(url,pattern): try: f=urllib2.urlopen(url) result = f.read(); content = re.compile(pattern, re.DOTALL) style = content.search(result) if style: result = style.group(0) return result else: return None except Exception ,e: print eif __name__=="__main__": for i in range(0,1000,25): #根據給出的百度音樂分類位址解析出songid result = getContent(SONG_TAG_URL+‘?start=‘+unicode(i)+‘&size=25&third_type=0‘,‘<ul>.*?</ul>‘) sids = [] sidPattern = re.findall(""sid":.*?,"",result) for sid in sidPattern: sids.append(re.sub(‘,"‘,‘‘,re.sub(‘"sid":‘,‘‘,sid))) # print sids #將songid構造成post請求參數 formdata = { "songIds" : ",".join(sids)} data_encoded = urllib.urlencode(formdata) # print data_encoded songList = urllib2.urlopen(SONG_LINK_URL,data_encoded) songListJson = songList.read() # print songListJson #json 轉字典 song_dict = JSONDecoder().decode(songListJson) #擷取songList song_data_dict = song_dict.get("data").get("songList") for sond_data in song_data_dict: song_name = sond_data.get(‘songName‘) song_artistName = sond_data.get(‘artistName‘) song_format = sond_data.get(‘format‘) song_link = sond_data.get(‘songLink‘) if song_name is None or song_artistName is None or song_format is None or song_link is None: continue print song_name+‘--‘+song_artistName+‘.‘+song_format+u‘ 下載連結為:‘+song_link #下載方法此處就省略了。
Python抓取百度音樂。