因為現(xiàn)在眾多音樂平臺下載歌曲都要收費了,導致我沒有車載音樂聽了。于是便自學爬蟲做了這個簡易的音樂爬蟲。不是那些大平臺的音樂爬蟲,是一個不知名的小音樂網(wǎng)站的爬蟲。下面開始正題:
首先,便是找不是那幾家大互聯(lián)網(wǎng)公司的音樂網(wǎng)站,在我的不懈努力之下終于找到了一家歌曲比較齊全的野雞音樂網(wǎng)站(請允許我這么說)。雖說是野雞,但是該有的熱門歌手的新歌和熱門歌曲都有,麻雀雖小,五臟俱全。
接著,便要對網(wǎng)站進行抓包,并對網(wǎng)頁鏈接尋找規(guī)律,當然,這個小網(wǎng)站的網(wǎng)頁鏈接的規(guī)律也是非常之簡單。如下圖所示:
不難發(fā)現(xiàn),它的網(wǎng)頁網(wǎng)址的規(guī)律,前面那一串不知名網(wǎng)址,加上你要搜索的的歌手的名字,然后再加上.html就可以了。于是乎,就解決了代碼中url的問題。代碼如下:
import requests
name = input()
url = 'http://www.2t58.com/so/{}/1.html'.format(name)
response = requests.get(url = url)
上面代碼目前是完全可行,雖然我并沒有加入heards等相關(guān)的反爬參數(shù),但是網(wǎng)站在這目前為止也沒有進行反爬。
接下來,我們隨便點擊幾首歌曲:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-776218.html
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-776218.html
因為喜歡周杰倫的朋友特別的多啊,我就搜索了周杰倫,并點了他的幾首歌曲,我們可以發(fā)現(xiàn),網(wǎng)頁欄的網(wǎng)頁地址變得毫無規(guī)律了,是一串我們看不懂的英文字母加上.html。而我們想要下載歌曲又必須進入到這個給頁面,所以我們必須找到它網(wǎng)頁地址的規(guī)律,或者說我們必須找到,那一串毫無規(guī)律的英文字母可以從哪個數(shù)據(jù)包中得到。接下來,我便進行了數(shù)據(jù)抓包并分析。?
很容易發(fā)現(xiàn),在每個a標簽的href中的最后一個字段就是我們要的那一串毫無規(guī)律的英文字母,所以我們要做的就是查看它的url,然后通過requests的模塊發(fā)送請求將這個網(wǎng)頁給請求下來,經(jīng)過我的嘗試,該網(wǎng)站在這里進行了反爬,如果不加入heards則會請求不到數(shù)據(jù),大家注意一下。然后,就是用正則表達式將我們需要的英文字母給匹配保留下來,代碼如下:
ex = '<div class="name"><a href="/song/(.*?).html" target="_mp3">.*?</a></div>'
musicIndex = re.findall(ex, response.text, re.S)
接下來,就是回去歌曲的下載鏈接,將它以二進制形式保存就可以了。隨便點擊一首歌曲,對歌曲詳細頁面進行抓包。
數(shù)據(jù)包是非常多的,我們可以根據(jù)數(shù)據(jù)包的類型來有選擇型的查看,音頻和視頻等很顯然就是media類型的數(shù)據(jù)包。很顯然這就是我們想要的音樂鏈接,我們將它在一個單獨的網(wǎng)頁欄中搜索可以得到?jīng)]有限制可以直接下載的完整的音樂。但是我們要的是批量下載,一首一首的下載效率太慢了。所以,我們還要繼續(xù)尋找有沒有一個數(shù)據(jù)包,它的響應就包含了這首歌曲的鏈接。我的做法是將最后一個.mp3的名稱在數(shù)據(jù)包搜索欄中搜索對應關(guān)鍵字,很幸運,我找到了。
?
?
?接下來就非常簡單了,我們已經(jīng)找到了每個要搜索的歌手的詳情網(wǎng)頁的規(guī)律(固定網(wǎng)址+歌手名字+.html),我們有獲取了每一首歌曲的詳情頁面(那一段沒有規(guī)律的英文字母),最后又在歌曲詳情頁面找到了包含歌曲鏈接的數(shù)據(jù)包,所以接下來我們要做的就是,將歌曲鏈接用二進制保存下來,學過爬蟲的同學應該注意到了,上面這個數(shù)據(jù)包的響應數(shù)json數(shù)據(jù),返回的是一個字典形式的數(shù)據(jù),我們可以根據(jù)鍵值對來取出我們需要的歌曲的下載鏈接。首先就是將這個給數(shù)據(jù)包根據(jù)對應的url請求下來,注意在請求頭中查看相應url的參數(shù),代碼如下:
data = {'id': i,'type': 'music'}
url2 = 'http://www.2t58.com/js/play.php'
response2 = requests.post(url = url2, headers = headers, data = data)
json_data = response2.json()
musicList = json_data['url']
我們將歌曲的下載鏈接保存在列表musicList中,最后就是將歌曲保存,代碼如下:
musicResponse = requests.get(url = musicList)
filename = json_data['title'] + '.mp3'
with open('E:/music/' + filename, 'wb') as f:
f.write(musicResponse.content)
print(filename + '下載成功!')
大家改一下路徑就可以正常運行了。
?
完整代碼:
import requests
import re
# 張學友:aHNj
# 陳奕迅:eG4
# 林憶蓮:d2t3eA
name = input()
url = 'http://www.2t58.com/so/{}/1.html'.format(name)
response = requests.get(url = url)
ex = '<div class="name"><a href="/song/(.*?).html" target="_mp3">.*?</a></div>'
musicIndex = re.findall(ex, response.text, re.S)
smallmusicList = []
for j in range(0, 5):
smallmusicList.append(musicIndex[j])
print(smallmusicList)
headers ={
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Content-Length':'26',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f=1690974946; Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f=1690976158',
'Host':'www.2t58.com',
'Origin':'http://www.2t58.com',
'Referer':'http://www.2t58.com/song/bWhzc3hud25u.html',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}
for i in musicIndex:
data = {'id': i,'type': 'music'}
url2 = 'http://www.2t58.com/js/play.php'
response2 = requests.post(url = url2, headers = headers, data = data)
json_data = response2.json()
musicList = json_data['url']
musicResponse = requests.get(url = musicList)
filename = json_data['title'] + '.mp3'
with open('E:/music/' + filename, 'wb') as f:
f.write(musicResponse.content)
print(filename + '下載成功!')
可能是因為網(wǎng)站不夠完善,有些歌手的詳情網(wǎng)頁并不是歌手名+.html,而是一些無規(guī)律的英文字母,我暫時發(fā)現(xiàn)的已經(jīng)放在上面,如果要下載該歌手的歌曲,就輸入相應的英文字母。
?
僅供學習使用,請不要用于違法犯罪。
?
?
?
?
?
到了這里,關(guān)于Python爬蟲實戰(zhàn)案例——音樂爬蟲,收費歌曲依舊可用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!