1. 程式人生 > >幾行程式碼爬取喜馬拉雅音樂

幾行程式碼爬取喜馬拉雅音樂

爬取喜馬拉雅音樂

在這裡插入圖片描述

首先進入網址,我們能看到所有的音樂列表。開啟開發者工具F12,點選網路,重新整理網頁,我們能看到幾條資料。
在這裡插入圖片描述
我們點選播放一首音樂,觀察下面的資料變化情況。發現紅色部分標記的內容,點選一下。
在這裡插入圖片描述
注意請求頭部分的網址,並觀察網址結構。點選響應按鈕,檢視一下內容。
在這裡插入圖片描述
我們發現裡面是一個json串,裡面有音樂的一些資訊,我們想要下載音樂,因此只需要音樂 名,及音樂地址。紅色標記部分src為音樂地址。
在這裡插入圖片描述
我們訪問一下這個音樂地址,看看內容:恰好是音樂,說明我們尋找的資料正確
在這裡插入圖片描述

這樣下載這首音樂就非常簡單了,請求網址https://www.ximalaya.com/revision/play/album?albumId=3595841&pageNum=1&sort=-1&pageSize=30

並獲取json串中的音樂地址src,直接寫入資料到本地。
這是獲取一首音樂的方法,獲取整個介面的音樂只需遍歷json串中的src資料。

html=requests.get(url,headers=headers)
    ret=html.content.decode()#返回字串型別資料
    #print(ret)
    result = json.loads(ret)
    #print(result['data']['tracksAudioPlay'][0]['src'])
    for i in result['data']['tracksAudioPlay']:
        #print(i['src'])
        src=i['src']
        name=i['trackName']
        #print(name)
    #儲存資料
        with open("./{}.mp3".format(name),'ab')as f:
            music=requests.get(src,headers=headers)
            f.write(music.content)

想要把六個頁面的所有音樂都爬取下來,就要觀察一下其他頁面的網址。採用上述同樣的抓取方法。這是第二頁的
在這裡插入圖片描述
第三頁的:
在這裡插入圖片描述
這樣就發現了規律,因此可以寫一個通用表示式,https://www.ximalaya.com/revision/play/album?albumId=3595841&pageNum="+(str)(a)+"&sort=-1&pageSize=30其中a是傳入的引數,也就是第幾頁。

這樣我們就完成了對我們需求的分析。
所有程式碼:

#爬取喜馬拉雅音樂排行榜中所有的音樂

import requests
import json,time

#https://www.ximalaya.com/revision/play/album?albumId=3595841&pageNum=3&sort=-1&pageSize=30

def xima(a):
    url = "https://www.ximalaya.com/revision/play/album?albumId=3595841&pageNum="+(str)(a)+"&sort=-1&pageSize=30"
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:62.0) Gecko/20100101 Firefox/62.0',
    }
    html=requests.get(url,headers=headers)
    ret=html.content.decode()#返回字串型別資料
    #print(ret)
    result = json.loads(ret)
    #print(result['data']['tracksAudioPlay'][0]['src'])
    for i in result['data']['tracksAudioPlay']:
        #print(i['src'])
        src=i['src']
        name=i['trackName']
        #print(name)
    #儲存資料
        with open("./{}.mp3".format(name),'ab')as f:
            music=requests.get(src,headers=headers)
            f.write(music.content)

if __name__ == '__main__':
    for i in range(1,7):
        xima(i)
        time.sleep(5)

去掉所有註釋,程式碼非常簡單。只是簡單的json資料獲取,檔案寫入,time.sleep()控制速度。