Scrapy爬取網(wǎng)易云音樂和評(píng)論(一、思路分析)

目錄:

1、Scrapy爬取網(wǎng)易云音樂和評(píng)論(一、思路分析)
2、Scrapy爬取網(wǎng)易云音樂和評(píng)論(二、Scrapy框架每個(gè)模塊的作用)
3、Scrapy爬取網(wǎng)易云音樂和評(píng)論(三、爬取歌手)
4、Scrapy爬取網(wǎng)易云音樂和評(píng)論(四、關(guān)于API)
5、Scrapy爬取網(wǎng)易云音樂和評(píng)論(五、評(píng)論)

前提:

  1. scrapy這個(gè)框架很多人用過,網(wǎng)上教程也很多,但大多就是爬爬小說這種比較簡(jiǎn)單且有規(guī)律的。尤其大多網(wǎng)站它是可以通過點(diǎn)擊下一頁(yè)的方式爬取下一頁(yè),我看到的教程也都是這樣的。而網(wǎng)易云的按鈕光頁(yè)面不采取類似selenium這樣的模擬瀏覽器的模塊是獲取不到的,加上有API,所以換種方式。

  2. 網(wǎng)易云音樂也有很多人寫過,也有API,不過大多是爬取了熱門歌曲,或是從歌單下手。但是考慮到歌單會(huì)有大量重復(fù)的,我則從歌手下手——
    當(dāng)然,從歌手頁(yè)的話,如果有多個(gè)歌手合唱,那每個(gè)歌手頁(yè)也都會(huì)有這首歌,但他們的鏈接是一樣的,也是會(huì)有重復(fù)的,但是相對(duì)來說就比較少。
    在GitHub上也有很多優(yōu)秀的例子,例如,我寫的時(shí)候關(guān)于開頭參考了這篇:https://github.com/runningRobin/music163/blob/master/music163/spiders/spider.py,但是它沒有文檔,我這里寫一個(gè)整站的。

個(gè)人認(rèn)為scrapy的一些不足

1、在寫的過程中,發(fā)現(xiàn)scrapy這個(gè)框架其實(shí)不是那么完美,它對(duì)上手的要求有點(diǎn)高,而且又有些束縛,尤其是對(duì)數(shù)據(jù)庫(kù)的操作,不是那么的完美。

2、再比如我要設(shè)置一些已經(jīng)存在的url跳過(在沒有索引的情況下),而scrapy它本身就是一個(gè)各個(gè)功能分開寫的,pinelines這個(gè)文件是處理數(shù)據(jù)庫(kù)的,但我要處理存在的url跳過,pinelines就不方便了,還有些可能就要寫到程序,這就相悖了。所以我后來還是沒有用框架又寫了一遍。這一塊就拿出來當(dāng)教程吧。

開發(fā)環(huán)境:WIN7+Anaconda+py2.7+scrapy
數(shù)據(jù)庫(kù):MongoDB
文章的順序
1、先分析思路;
2、再分析scrapy框架每個(gè)模塊的作用;
3、最后寫代碼和分析API,以及評(píng)論
只有5篇,不會(huì)把完整的代碼貼出來,因?yàn)樗悸泛苤匾?,有了思路,懂得基本操作和順序,自己折騰就折騰出來了。

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

方法一:遍歷

優(yōu)點(diǎn):有個(gè)別歌手有主頁(yè),但是沒有申請(qǐng)音樂人,所以不存在歌單列表頁(yè),用第二種方法也獲取不到。
缺點(diǎn):不好測(cè)試它到底有多少,大概十一二萬的樣子,大多id是相隔不遠(yuǎn)的。有些id之間相隔了幾位數(shù),本來挺穩(wěn)定的,想著往4位數(shù)遍歷就行,卻發(fā)現(xiàn)還有7位數(shù)的,這樣遍歷的跨度有些大,(id從1872開始),要做些處理,還有判斷這個(gè)頁(yè)面存在與否。

方法二:從歌手分類爬取所有歌手的id

歌手分類頁(yè)http://music.163.com/#/discover/artist
這里要說一下,網(wǎng)易云的所有網(wǎng)址,要去掉中間那個(gè)#號(hào)才是真正的url,帶#的查看源代碼是獲取不到真正的信息的。
所以其實(shí)是:http://music.163.com/discover/artist

優(yōu)點(diǎn):方便,不需要考慮遍歷的數(shù)量,不需要對(duì)頁(yè)面是否存在做處理
缺點(diǎn):可能會(huì)漏掉一些有主頁(yè)但未注冊(cè)的歌手。

我們主要以方法二入手,分析如下:

我們看這個(gè)頁(yè)面左側(cè)欄:


圖一

2、因?yàn)楫?dāng)時(shí)我寫的時(shí)候,參考到前面提到的那篇GitHub上的代碼,
這個(gè)group_ids里的就是左側(cè)每個(gè)項(xiàng)對(duì)應(yīng)所有的頁(yè)面了(不包括最上方的推薦歌手和入駐歌手,因?yàn)榘谄渌锩媪耍?/p>

圖二 左欄里的id

3、我們按F12或右鍵檢查,如圖,每個(gè)對(duì)應(yīng)的url是:http://music.163.com/discover/artist/cat?id=xxx,
這里的id就是上面group_ids里的數(shù)字了。

圖三

4、然后我們?cè)冱c(diǎn)進(jìn)去,如圖四,url的id就是上面這個(gè)group_ids里的元素了,而后面的initial是首字母的意思,你看下面我們選中的是A,然后它是65,是不是想到ASCII碼?在ASCII碼中A就是從65開始的,Z是90,后面以此類推,最后有個(gè)其他,代替的是0:

圖四

我們將這兩個(gè)分別存儲(chǔ)為一個(gè)列表或元組:

#  左側(cè)欄所有:男女、國(guó)家分類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]

二、歌手頁(yè)

1、點(diǎn)進(jìn)來之后我們來到歌手頁(yè),http://music.163.com/#/artist?id=6452,同樣,查看源代碼的時(shí)候去掉url里的#。

2、我們獲取的這個(gè)歌手頁(yè)的url對(duì)應(yīng)的是熱門50首,在對(duì)應(yīng)網(wǎng)頁(yè)里我們會(huì)發(fā)現(xiàn)下面有好幾個(gè)塊:熱門50首、專輯、MV、歌手介紹

圖五

3、因?yàn)槭芸蚣艿南拗?,以上四個(gè)信息的內(nèi)容不在一個(gè)傳遞鏈里,
以下兩種順序的特點(diǎn)都是后者傳入的參數(shù)都是由前者返回的,而這四個(gè)之間屬于相同的id,他們并不需要由前者返回,不構(gòu)成一個(gè)傳遞鏈:

1)、歌手 ——>專輯列表——>歌曲列表——>歌曲信息——>第5
2)、歌手 ——>熱門50首的歌曲列表——>歌曲信息——>第4

4、如果如果你只需要熱門歌曲你可以獲取它所有鏈接,這個(gè)代碼被我分為兩塊:
1)、第一塊是包含熱門50首的url,也只有url,在id名為'song-list-pre-cache'的div標(biāo)簽里,div->ul->li->a->href
2)、而第二塊textarea里是json,是這50首歌的比較完整的信息,只不過,這些信息通過lxml.etree或者BeautifulSoup用text的方式獲取下來會(huì)是字符串,我們需要用json將它格式化。
如果你只需要歌曲的話,選擇第一條就好了,直接跳到第四篇講API的),用歌曲的API即可。

圖六 熱門50首歌曲的所有鏈接或者json

5、我們要獲取所有歌手的歌曲,就得從歌手的專輯下手,獲取專輯里所有的歌手才行。我們?cè)趯]嬳?yè)會(huì)發(fā)現(xiàn),有些是有很多頁(yè)的,我最開始用的是scrapy的xpath解析頁(yè)面,后來搜的時(shí)候發(fā)現(xiàn)了API,所以接下來的東西,我們就不通過頁(yè)面的方式了,API我是通過這個(gè)網(wǎng)站發(fā)現(xiàn)的:http://moonlib.com/606.html(最近發(fā)現(xiàn)網(wǎng)站掛了,請(qǐng)看我的第四篇講API的,有其他類似API的文章鏈接)。

我們用到的是2到6(不包括5,沒用到歌單),第7條接口是MV的,不過不幸沒有發(fā)現(xiàn)像專輯一樣的列表頁(yè)信息,它只有單曲的MV的API。不過這里我們用不上。后面第四篇會(huì)專門分析API。

圖七

6、接下來就是每個(gè)專輯的所有歌曲還有專輯、歌手的一些信息,另外專輯下也有評(píng)論,且評(píng)論數(shù)的獲取方式有些不同,因此評(píng)論有兩種處理。

圖八 專輯信息、歌曲列表

7、最后從圖八里的歌曲鏈接點(diǎn)進(jìn)去的就是歌曲頁(yè)了,如圖九:

圖九

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容