python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载
第三章的requests庫(kù)階段性demo,爬取好聽音樂網(wǎng)的榜上歌曲。
此網(wǎng)站沒有js混淆,音樂資源鏈接有規(guī)律,適合爬蟲新手上手。
首先觀察首頁(yè)和音樂榜的url鏈接關(guān)系,我們先手動(dòng)模擬下載,chrome f12獲取response,可探查到url規(guī)律如下:
1.
熱播榜url為:
新曲榜url為:
由此可知hot、new、recommend、latest、gedan分別為各榜二級(jí)網(wǎng)址
2.再分析hot榜單內(nèi)頁(yè)碼網(wǎng)址規(guī)律
可得url規(guī)律為:{index}榜第 i 頁(yè)網(wǎng)址為 http://www.htqyy.com/top/musicList/{index}?pageIndex=(i-1)&pageSize=20
3.接著找下載鏈接規(guī)律
在試聽界面點(diǎn)擊試聽按鈕,f12刷新 network media會(huì)獲得media音頻response,statu code顯示為206,說明歌曲get請(qǐng)求已緩存到disk,驗(yàn)證url規(guī)律為http://f2.htqyy.com/play7/sid/mp3/12,試聽和下載url的關(guān)聯(lián)關(guān)系,其中sid,也就是歌曲名為主鍵,所以我們從音樂榜頁(yè)碼頁(yè)獲得的sid可以傳入下載地址中,拼接獲得下載地址,/mp3/12為固定字符串
其后我在運(yùn)行爬蟲的時(shí)候發(fā)現(xiàn)部分資源會(huì)401,找到對(duì)應(yīng)的sid頁(yè)面,f12排查,發(fā)現(xiàn)下載地址并不唯一,按mp3和m4a文件類型分別有兩個(gè)地址:
http://f2.htqyy.com/play7/{sid}/mp3/12 和 http://f2.htqyy.com/play7/{sid}/m4a/12
實(shí)際運(yùn)行爬蟲的時(shí)候,我們會(huì)發(fā)現(xiàn)經(jīng)常有歌曲無(wú)法200正常下載,或者401或者拋出異常我自己分析的話,這有兩種原因,
1.mp3格式url網(wǎng)址無(wú)效,需切換m4a網(wǎng)址下載
2.請(qǐng)求時(shí)間間隔太短,應(yīng)設(shè)置1-2s,以防因?yàn)檠舆t和服務(wù)器原因無(wú)法正常爬取。
此demo主要考察python和程序設(shè)計(jì)基本功,requests庫(kù)的應(yīng)用較少,由此也發(fā)現(xiàn)異常處理、網(wǎng)址拼接、f12工具的使用、性能和代碼質(zhì)量考核等因素在爬蟲設(shè)計(jì)時(shí)是非常重要的,由此也看出一個(gè)設(shè)計(jì)優(yōu)異的爬蟲框架對(duì)實(shí)際業(yè)務(wù)來說是非常重要的,連續(xù)爬取、防封、分布式爬取,提高性能門檻也是必須的業(yè)務(wù)要求,爬蟲隨便幾個(gè)demo寫完看似很簡(jiǎn)單,但是簡(jiǎn)單的事如何做的有質(zhì)量也是不簡(jiǎn)單的。
具體代碼如下:
#SweetLightSpider
import re #python 的正則庫(kù)
import requests #python 的requests庫(kù)
importtimeimport random #隨機(jī)選擇
from requests import exceptions #requests 內(nèi)置exception
classSweetLightMusicSpider:def __init__(self, page):
self.page=page#隨機(jī)獲取音樂榜單的網(wǎng)頁(yè)信息text數(shù)據(jù),取得songID準(zhǔn)備為后續(xù)url拼接,獲得songName獲得歌曲名
def __getSong(self):
songID=[]
songName=[]
keyword= ["hot", "new", "recommend", "latest", "gedan"]
rankform=random.choice(keyword)print(rankform)for i inrange(0, self.page):
url= "http://www.htqyy.com/top/musicList/"+str(rankform)+"?pageIndex="+str(i)+"&pageSize=20"
#獲得帶有音樂id和name的信息的html文本
html =requests.get(url)
strr=html.text#正則匹配篩選信息
pat1 = r'title="(.*?)" sid'pat2= r'sid="(.*?)"'id_list=re.findall(pat2, strr)
title_list=re.findall(pat1, strr)#獲得songID/Name數(shù)組
songID.extend(id_list)
songName.extend(title_list)returnsongID, songNamedef __songdownload(self):
song_list= SweetLightMusicSpider.__getSong(self)for x inrange(0, len(song_list[0])):
song_url= "http://f2.htqyy.com/play7/"+str(song_list[0][x])+"/"+"mp3"+"/12"song_name= song_list[1][x]
response=requests.get(song_url)print(response.status_code)
data=response.contentif response.status_code == 200:print("正在下載第{0}首, 歌曲名為:《{1}》".format(x+1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data)print("第{0}首: 《{1}》 已下載完畢".format(x+1, song_name))elif response.status_code == 401:
time.sleep(2)print("重定向資源中")
song_url2= "http://f2.htqyy.com/play7/"+str(song_list[0][x])+"/"+"m4a"+"/12"response2=requests.get(song_url2)print(response2.status_code)try:assert response2.status_code == 200
exceptexceptions.HTTPError as e:print(e)continue
else:
data2=response2.contentprint("正在下載第{0}首, 歌曲名為:《{1}》".format(x + 1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data2)print("第{0}首: 《{1}》 已下載完畢".format(x + 1, song_name))
time.sleep(1)defmusic_Spider(self):
SweetLightMusicSpider.__songdownload(self)if __name__ == '__main__':
i= SweetLightMusicSpider(10)
i.music_Spider()
設(shè)置兩個(gè)請(qǐng)求間隔為1s,重定向url為2s,調(diào)試如下,基本杜絕了
1.無(wú)法獲取到的歌曲? 2.下載錯(cuò)誤為十幾KB無(wú)法打開的歌曲? 這兩個(gè)運(yùn)行異常bug
最后犧牲了部分爬取效率獲得了爬取質(zhì)量的提高:
最后檢查E盤的音樂下載情況,沒有下載錯(cuò)誤,文件大小均在1-3mb,不存在音樂無(wú)法打開的情況
隨便打開一首網(wǎng)易云播放器驗(yàn)證下:
沒有問題,bingo。因?yàn)槭禽p音樂網(wǎng)站嘛,faded的純樂器版。。。。。。i am faded? >_<
總結(jié)
以上是生活随笔為你收集整理的python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【常见笔试面试算法题12续集二】动态规划
- 下一篇: python列反过来_xlwings 教