Scrapy爬取網易雲音樂和評論(一、思路分析)

NO IMAGE

目錄:

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

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

前提:

scrapy這個框架很多人用過,網上教程也很多,但大多就是爬爬小說這種比較簡單且有規律的,網易雲音樂也有很多人寫過,也有API,不過大多是爬取了熱門歌曲,或是從歌單下手,但是考慮到歌單會有很多重複的。當然,從歌手頁的話,如果有多個歌手合唱,那每個歌手頁也都會有這首歌,但他們的連結是一樣的,也是會有重複的,但是相對來說就比較少,所以就從歌手下手。

在GitHub上也有很多優秀的例子,但沒有文件,我這裡寫一個整站的。
專案GitHub地址:https://github.com/sujiujiu/WYYScrapy

另外,在寫的過程中,發現scrapy這個框架其實不是那麼完美,它對上手的要求有點高,而且又有些束縛,尤其是對資料庫的操作,不是那麼的完美。

就比如我要設定一些已經存在的url跳過(在沒有索引的情況下),而scrapy它本身就是一個各個功能分開寫的,pinelines這個檔案是處理資料庫的,但我要處理存在的url跳過,pinelines就不方便了,還有些可能就要寫到程式,這就相悖了。所以我後來還是沒有用框架又寫了一遍。這一塊就拿出來當教程吧。

開發環境:WIN7 Anaconda py2.7 scrapy
資料庫:MongoDB
文章的順序:先分析思路,再分析scrapy框架每個模組的作用,最後寫程式碼和分析API,只有5篇。

一、我們先爬歌手,有兩種方法:

方法一:

一種是遍歷,大概十一二萬的樣子,大多id是相隔不遠的,有個別歌手有主頁,但是沒有申請音樂人,用這種方式比較齊,也不用去單獨寫程式碼。
但我最開始用的是下面這種,我們也拿這個來分析:

方法二:

1、從這個頁面,爬取所有歌手的id:http://music.163.com/#/discover/artist,這裡要說一下,網易雲的所有網址,要去掉中間那個#號才是真正的url,帶#的檢視原始碼是獲取不到真正的資訊的。所以其實是:http://music.163.com/discover/artist
我們看這個頁面左側欄:
image.png

2、因為當時我寫的時候,參考到這篇,https://github.com/runningRobin/music163/blob/master/music163/spiders/spider.py
左欄裡的id
這個group_ids裡的就是左側每個項對應所有的頁面了(不包括最上方的推薦歌手和入駐歌手,因為包含在其他裡面了)

3、我們按F12或右鍵檢查,如圖,每個對應的url是:http://music.163.com/discover/artist/cat?id=xxx
image.png

4、然後我們再點進去:
image.png
url的id就是上面這個id了,而後面的initial是什麼呢?initial是首字母的意思,你看下面我們選中的是A,然後它是65,是不是想到ASCII碼,在ASCII碼中A就是從65開始的,Z是90,後面以此類推,最後有個其他,是0,我們將它弄成一個列表:

#  男女、國家分類id
group_ids = (1001, 1002, 1003, 2001, 2002, 2003, 6001, 6002, 6003, 7001, 7002, 7003, 4001, 4002, 4003)
# 歌手姓名首字母id
initials = [i for i in range(65,91)]   [0]

二、歌手頁

1、點進來之後我們來到歌手頁,http://music.163.com/#/artist?id=6452,同樣,去掉#,
2、我們會發現下面有好幾個塊,
image.png
我們獲取的這個url對應的是熱門50首,如果你只需要熱門歌曲你可以獲取它所有連結:
image.png
這個程式碼被我分為兩塊,第一塊是熱門50首的url,也只有url。
而第二塊textarea裡是json,是這些歌曲的完整的資訊,我獲取的是json資訊,只不過,這些資訊通過lxml.etree或者BeautifulSoup用text的方式獲取下來會是字串,我們需要用json將它格式化,但是極個別在爬取的過程中,死活獲取不到。
3、上面那個是歌手的熱門歌曲,我們要獲取全站,就得從歌手的專輯下手,獲取專輯裡所有的歌手才行。因為scrapy本身的束縛,其實說是全站,並不是那麼方便,比如這四個板塊,我們只能選一個,一直往下,單曲或MV就得另寫。
4、我們在專輯頁會發現,有些是有很多頁的,後來搜的時候發現了API,所以接下來的東西,我們就不通過頁面的方式了,API我是通過這個網站發現的:http://moonlib.com/606.html,因為最開始我的目的是爬評論,來看到評論的API很多變了,我以為這些都變了,一開始還擱置了沒用,傻傻的去寫lxml,但是它的翻頁的序號是爬不到的,後來隨手測試了一下API,發現都有用。我們用到的是2到6(不包括5,沒用到歌單),第7條介面是MV的,不過不幸沒有發現像專輯一樣的列表頁資訊,它只有單曲的MV的API。不過這裡我們用不上。後面會專門分析API。
image.png

5、接下來就是每個專輯的所有歌曲還有專輯、歌手的一些資訊,專輯下也有評論
image.png

6、最後就是歌曲頁了
image.png

好,思路就是這樣,接下來我們分析Scrapy這個框架。