1. 程式人生 > 其它 >Scrapy爬取網易雲音樂和評論(四、關於API)

Scrapy爬取網易雲音樂和評論(四、關於API)

教程系列連結目錄:

1、Scrapy爬取網易雲音樂和評論(一、思路分析)
2、Scrapy爬取網易雲音樂和評論(二、Scrapy框架每個模組的作用)
3、Scrapy爬取網易雲音樂和評論(三、爬取歌手)
4、Scrapy爬取網易雲音樂和評論(四、關於API)
5、Scrapy爬取網易雲音樂和評論(五、評論)

專案GitHub地址:https://github.com/sujiujiu/WYYScrapy

前面有提到,API的參考連結,另外再放上幾個,
1、http://moonlib.com/606.html(我用的這個)
2、http://blog.csdn.net/qujunjie/article/details/34422379


3、https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi(這個比較官方,我也不知道是不是官方,但是很全很全很全)

我們的順序是:
1、歌手專輯
2、專輯資訊(不包括評論)
3、歌曲資訊(不包括評論)
4、歌詞
5、專輯和歌曲評論(這個另起一章寫)

我們拿一個來講解,其他的類似:
比如,歌手專輯:

http://music.163.com/api/artist/albums/166009?id=166009&offset=0&total=true&limit=12

(經過測試,id前面那個id值可以不需要,有id就足夠了)

*offset:偏移量,它其實算是比如歌手的專輯頁每頁有12首,第一頁的offset就是0(一般是0開頭),然後第二頁offset就是12,第一頁0~11剛好12位數,所以offset從12開頭,以此類推。可以算作是second_offset = limit*(first_offset+1)
*limit:一頁有多少,這個可以改,但是不同的網站有不同的規律,比如豆瓣,它這個limit的上限跟當頁顯示給你看的不同,比如一頁預設給你顯示20條資料,但是你給它改成50也會給你返回50條。但是網易雲不一樣,它顯示是12條,它的limit可以往下,但不能往上,往上它返回也是12條,它這是固定的,那超過怎麼辦呢?假設36條,那麼3頁對吧,根據前面的offset,不停的改offset,這數字一看就有規律,很容易就能想到用遍歷,如圖,這是我寫的一個歌手專輯資訊的函式:

我的那個get_req()函式就是對requests.get做了些處理,中途肯定會遇到各種各樣的狀態碼對吧,這個你們自己去思考。

這裡我沒有用response,因為不涉及到一個完整的傳遞鏈,它只是要存進資料庫的某一個欄位,如圖,這個才是我要進行儲存的的函式,其中呼叫了get_artist_album_info()這個函式,它只是作為一個欄位存進了item。

這裡的話獲取hotAlbums的值應該要判斷一下,因為有些頁面404,該value值已經沒有了。這裡需要做處理,但是一直沒時間弄,這裡只能當個示例講解,需要各位自己弄一下:

其中呼叫了get_artist_album_info()這個函式,它只是作為一個欄位存進了item。

然後回到get_artist_album_info()函式,這裡的建議就是,將固定的不變,會變的用params這個引數,requests.get它後面可以傳各種引數,包括params,以及前面的headers。
這個params裡有四個引數:
*** id:歌手的id,事實上,有它,albums_url裡那個%s佔位的地方可以不要,但是因為最開始參照的那個網站有,也是測試成功就沒管了。(上面我提供的連結1和2的區別在這裡,用哪個都行)
*** offset
:這個首先看到我的page_count,就是指頁數,比如3頁,但其實網易雲這個抓不到有多少頁,其實應該是從第一頁的json返回的專輯資訊得到的總專輯數量有多少,然後進行處理的。但是因為寫這個的時候我直接爬的頁數,但是當時沒測試,所以建議改成這樣就可以了:

# album_count是一個歌手所有專輯的總數
# 獲得的方法可以先爬第一頁的json資料,或者別的你們自己找
for offset in range(0,album_count,12):
    params = {
        'id':singer_id,
        'offset':offset,
        'total':'true',
        'limit':12
    }
  • total:這個引數的意義除了在評論有用,這裡不確定到底有什麼用,最開始我以為,改成TRUE能不需要offset,會返回所有資料,後來發現沒什麼區別,最大上限就是一頁12,放著也沒關係。
  • limit:這裡就是12

API

以此類推,其他到底都是這樣了,這裡把http://moonlib.com/606.html的API集中寫一下,method都是GET,中括號程式碼可省,可寫可不寫:
1、歌手專輯:

# 歌手專輯:
# 三種寫法,隨意,推薦第三種,後面都是這樣,具體param可以參考上面圖片裡的程式碼
1、http://music.163.com/api/artist/albums/[artist_id]/
2、http://music.163.com/api/artist/albums/[166009]/id=166009&offset=0&total=true&limit=5
3、url='http://music.163.com/api/artist/albums/166009'
params = {....}

2、專輯裡的歌曲列表

# 專輯裡的歌曲列表
http://music.163.com/api/album/2457012?ext=true&id=2457012&offset=0&total=true&limit=10

3、歌曲資訊

# 歌曲資訊
# 這裡說明一下,%5B和%5D就是一對中括號[],最好改成[],像歌手專輯裡第一種寫法那個一樣,因為%5B那種寫法還要處理,且麻煩。
http://music.163.com/api/song/detail/?id=28377211&ids=%5B28377211%5D

4、歌詞資訊

# 這個跟其他都不一樣,後面的lv、kv、tv是固定的,只要改id即可。
http://music.163.com/api/song/lyric?os=pc&id=93920&lv=-1&kv=-1&tv=-1