聲明:僅供參考學(xué)習(xí),參考,若有不足,歡迎指正
你是不是遇到過這種情況,在pc端上音樂無(wú)法下載,必須下載客戶端才能下載?
那么,爬蟲可以解決這個(gè)麻煩!繼續(xù)實(shí)戰(zhàn)利用request和xpath爬取網(wǎng)上音樂。
本文主要是在網(wǎng)頁(yè)端下載音樂,如果你有客戶端也可以,太高級(jí)的筆者也不會(huì)。這是一個(gè)基礎(chǔ)皮毛的練習(xí)
分析網(wǎng)頁(yè)
定位目標(biāo)網(wǎng)址:(你也可以在瀏覽器打開某云之后隨便進(jìn)入一個(gè)歌單)
https://music.163.com/#/playlist?id=26467411
對(duì)于網(wǎng)頁(yè)上的音樂在進(jìn)行下載時(shí),經(jīng)常會(huì)彈出提示頁(yè)面:請(qǐng)前往客戶端下載?。?!
非常討厭了也是,好好的下載一首歌曲,非要弄得這么麻煩。甚至,有些音樂在下載了軟件后,需要付費(fèi)或者VIP,萬(wàn)惡的資本家。
本次實(shí)戰(zhàn)就可以通過簡(jiǎn)單的爬蟲解決以上問題,直接下載歌曲。
- 首先,檢查—> Network —> 刷新
- 點(diǎn)擊 文檔(Doc),可以看到它的標(biāo)頭里面的請(qǐng)求網(wǎng)址為:
https://music.163.com/playlist?id=26467411 這跟最開始是不一樣的。
這是因?yàn)槲覀兯?qǐng)求的網(wǎng)址并非是瀏覽器地址欄上的網(wǎng)址,通過這張截圖,很清晰的發(fā)現(xiàn)我們所請(qǐng)求的網(wǎng)址是哪個(gè)了。
- 通過對(duì)每首歌曲打開,進(jìn)行網(wǎng)頁(yè)源代碼分析不難發(fā)現(xiàn),本網(wǎng)頁(yè)的歌曲都有一個(gè)共同的特點(diǎn):即前面的網(wǎng)址為 https://music.163.com/#/song?id= 加每首歌曲的 id 號(hào)。
然而,目前為止,我們僅僅是找到了些許規(guī)律,并沒有找到歌曲的真正鏈接,要真正下載到每一首歌曲,還遙不可及。
音樂文件一般為mpeg,mp3,mpeg-4,midi,mwa,m4a等
到現(xiàn)在為止還沒有請(qǐng)求音樂,當(dāng)我們?cè)谶M(jìn)行點(diǎn)擊播放時(shí)會(huì)發(fā)現(xiàn):
當(dāng)我們?cè)谶M(jìn)行播放音樂時(shí),請(qǐng)求數(shù)量增多,說明該網(wǎng)頁(yè)又重新進(jìn)行了對(duì)網(wǎng)頁(yè)的請(qǐng)求。通過重新查找發(fā)現(xiàn)(只需查看后面新的內(nèi)容)這次有了一些 .m4a 文件。
當(dāng)點(diǎn)擊這些文件打開時(shí)會(huì)發(fā)現(xiàn),有一個(gè)新的 Request URL:,當(dāng)你將該網(wǎng)址復(fù)制在新的網(wǎng)頁(yè)下進(jìn)行打開,會(huì)出現(xiàn)如下圖所示(打開時(shí)瀏覽器會(huì)自動(dòng)進(jìn)行下載該音樂)
結(jié)合上面的情況來說,我們是不是已經(jīng)成功了呢?但很難過的告訴你,這個(gè)網(wǎng)址在短時(shí)間內(nèi)打開,的確會(huì)有用,但是,它是有時(shí)間限制的,不信的話,你可以過五分鐘(或許還不需要這么久)再重新打開該網(wǎng)址,試一下。
所以這種方式行不通,由于是初學(xué)者,我們就需要點(diǎn)外援了。
第二種方式
- 這里介紹一個(gè)新的URL:(不要問這個(gè)怎么來的)
http://music.163.com/song/media/outer/url?id=
在之前的分析中,我們發(fā)現(xiàn)了一個(gè)很重要的一點(diǎn),便是這10首歌曲都是一個(gè)網(wǎng)址加每首歌曲的id所在的新頁(yè)面。
我們有了上面的這個(gè)網(wǎng)址,便可以為所欲為了。你現(xiàn)在便可以立馬復(fù)制上面的鏈接,在網(wǎng)頁(yè)上找到一首歌曲的id號(hào)添加至網(wǎng)址后面進(jìn)行打開(如:http://music.163.com/song/media/outer/url?id=36897723),是不是得到了如下的界面:
通過這個(gè)頁(yè)面就可以直接下載。
批量爬取
首先,每首音樂可以通過這個(gè)網(wǎng)址 ? id 進(jìn)行下載,所以,我們第一步便是想辦法獲取每首音樂的 id 。根據(jù)之前的分析,不難發(fā)現(xiàn),每首音樂的 id 都在一個(gè)<a>標(biāo)簽內(nèi),我們只要獲取這個(gè)<a>就可以了。
一步一步來開始寫代碼
- 根據(jù)真正的目標(biāo)網(wǎng)址(注意真正的)獲取源碼信息
import requests
from lxml import etree
# 真實(shí)地址在Network--Doc
url = 'https://music.163.com/playlist?id=26467411'
# 請(qǐng)求(requests) 圖片,視頻,音頻 content | 字符串 text
html_str = requests.get(url).text
print(html_str)
print(type(html_str)) # 字符串類型
result = etree.HTML(html_str)
- 從源碼中用 xpath 找到每首歌的id和name
song_ids = result.xpath('//a[contains(@href,"/song?")]/@href') # 歌曲id
song_names = result.xpath('//a[contains(@href,"/song?")]/text()') # 歌名
# print(song_ids)
# print(song_names) #列表
for song_id,song_name in zip(song_ids,song_names):
print(song_id)
print(song_name)
整理一下
通過打印發(fā)現(xiàn),前面多了一些 /song?id= ,這時(shí),便使用下面這行代碼,進(jìn)行刪減,仔細(xì)觀察打印結(jié)果發(fā)現(xiàn)后面多了三個(gè)無(wú)用的,這三個(gè)必須刪掉才行,不然在進(jìn)行后面的 URL 拼接,肯定會(huì)報(bào)錯(cuò),因?yàn)閴焊驼也坏竭@樣的一個(gè)網(wǎng)址。文章來源:http://www.zghlxwxcb.cn/news/detail-675036.html
count_id = song_id.strip('/song?id=') # 去掉/song?id=
# print(count_id)
# 過濾含有“$”符號(hào)
if ('$' in count_id) == False:
print(count_id)
- 拼接URL后,在瀏覽器里打開上面的任意鏈接
song_url
,即可獲取該音樂的鏈接,并進(jìn)行下載。但是,我們最終的目的是讓爬蟲自動(dòng)幫我們?nèi)肯螺d并進(jìn)行保存至文件夾,利用 for 循環(huán)就可以啦
song_url = base_url + count_id # 拼接url
print(song_url)
mp3 = requests.get(song_url).content
# 保存數(shù)據(jù)
with open('yinyue/{}.mp3'.format(song_name),'wb') as file:
file.write(mp3)
如需完整代碼,請(qǐng)自行查看。某云音樂爬取文章來源地址http://www.zghlxwxcb.cn/news/detail-675036.html
到了這里,關(guān)于python爬蟲實(shí)戰(zhàn)零基礎(chǔ)(3)——某云音樂的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!