爬取圖片基本上告一段落了,方法大同小異,最關鍵的是如何應對反爬蟲,使自己的爬蟲程序能夠連續不間斷地運行下去。視頻試著爬取了一下,感覺不是很好,因為數據太大了,保存response.content的方法已經明顯不適用,不如獲取一個下載地址列表,讓迅雷、QQ旋風等專業的多線程、支持斷點續傳的程序去下載。音頻的大小適中,mp3格式的音樂數據基本在5M以下,FLAC高音質的音樂數據在30M以下,以現在的網速,基本上是可以爬取的。下面講一講使用百度音樂的開發API接口下載音樂的方法,讓我們愉快地學習吧。
(一) 第一種方法
url = "http://sug.music.baidu.com/info/suggestion"
這是百度音樂搜索獲得songid的網址,我們怎樣向它請求數據呢,很簡單,填寫個payload就可以了。
mess = song_name + singer 或者 song_name 或者singer ?
歌名、歌手或者兩者都填
payload = {'word': mess, 'version': '2.1.1', 'from': '0'}
r = requests.get(url, params=payload)
contents = r.text
d = json.loads(contents, encoding="utf-8")
請求并進行json解析,
那么JSON里面有什么呢?
上圖,里面一共有11項數據,在第4層JSON里面,英文名字很清楚,我就不多說了。最關鍵的拿到了songid:816477,song_id = d["data"]["song"][0]["songid"]。那么下一步就是用這個songid去獲取實際下載地址了。
這是百度音樂免費api接口,可以為我們提供下載地址。
url = "http://music.baidu.com/data/music/fmlink"
和上面類似,使用payload提交我們要查詢的數據,songIds代表歌曲id,type代表要下載的格式,有‘mp3’,‘flac’等多種格式。這里不知道是否可以提交albumId(專輯名稱)、artistId(歌手名稱)還未測試。
payload = {'songIds': song_id, 'type': 'mp3'}
r = requests.get(url, params=payload)
contents = r.text
d = json.loads(contents, encoding="utf-8")
這是最終獲取的JSON數據,歌曲實際地址在songLink里面,獲取方法:
songlink = d["data"]["songList"][0]["songLink"]
獲取歌曲的文件格式,正則表達式
pattern=re.compile(r'music\/.*?\.(.*?)\?.*?',re.S)
songformat=re.findall(pattern,songlink)
saveformat=songformat[0]
最后結果:
songLink :? http://yinyueshiting.baidu.com/data2/music/134370487/816477248400128.mp3?xcode=9e3069036aac66c3c6826868de970894
saveformat : mp3
然后保存,這就不多說了。有時候會有請求不完全的情況,這是用len(response.content)判斷一下,看看是否大于2M,沒有就重新請求下載。
(二)第二種方法
第二種方法是參考自這篇博客,作者也說是轉的,所以不知道原始作者是誰,向作者致敬。
搜索歌曲API:http://musicmini.baidu.com/app/search/searchList.php?qword={0}&ie=utf-8&page={1}
{0}=需要搜索的歌曲或歌手 如‘晴天’ ‘周杰倫’
{1}=頁碼數(第一頁就是0,第二頁是1) 基本置為‘0’就可以
返回的是一個html網頁,需要分析網頁,得到歌曲ID,歌曲名,歌手,專輯等 屬性,網頁解析我就不說了,BeautifulSoup ?xpath re都可以,都在'tr'標簽里,上一下圖:
獲取歌曲詳細信息的網址
url='http://ting.baidu.com/data/music/links?songIds={0}'
{0}=從上面的結果的中分析的歌曲的ID ?晴天的songid:816477
獲取和上面類似的html,json解析后,格式與上面類似
{
"errorCode":22000,
"data":
{
"xcode":"17173bd17415d2c22a7250ec29f7e010",
"songList":[{
"queryId":"247911654",
"songId":247911654,
"songName":"\u590f\u6d1b\u7279\u70e6\u607c",
"artistId":"5913",
"artistName":"\u91d1\u5fd7\u6587",
"albumId":247911669,
"albumName":"\u590f\u6d1b\u7279\u70e6\u607c",
"songPicSmall":"http:\/\/musicdata.baidu.com\/data2\/pic\/247910612\/247910612.jpg",
"songPicBig":"http:\/\/musicdata.baidu.com\/data2\/pic\/247910608\/247910608.jpg",
"songPicRadio":"http:\/\/musicdata.baidu.com\/data2\/pic\/247910603\/247910603.jpg",
"lrcLink":"\/data2\/lrc\/248241445\/248241445.lrc",
"version":"\u5f71\u89c6\u539f\u58f0",
"copyType":0,
"time":192,
"linkCode":22000,
"songLink":"http:\/\/yinyueshiting.baidu.com\/data2\/music\/247912201\/247911654108000128.mp3?xcode=17173bd17415d2c221ec55f2ef944ac8",
"showLink":"http:\/\/yinyueshiting.baidu.com\/data2\/music\/247912201\/247911654108000128.mp3?xcode=17173bd17415d2c221ec55f2ef944ac8",
"format":"mp3",
"rate":128,
"size":3078749,
"relateStatus":"0",
"resourceType":"0",
"source":"web"
}
]
}
}
提取信息:
"songLink":"http:\/\/yinyueshiting.baidu.com\/data2\/music\/247912201\/247911654108000128.mp3?xcode=17173bd17415d2c221ec55f2ef944ac8"
網易云音樂和蝦米音樂的API還沒有研究,好像現在因為音樂版權問題,很多英文歌曲、港臺歌曲都不能夠免費聽了。例如辛曉琪的兩兩相忘,已經從網易云上下架了,百度音樂也沒有搜到,蝦米