目錄:
1旺聚、Scrapy爬取網(wǎng)易云音樂和評論(一、思路分析)
2眶蕉、Scrapy爬取網(wǎng)易云音樂和評論(二砰粹、Scrapy框架每個模塊的作用)
3、Scrapy爬取網(wǎng)易云音樂和評論(三造挽、爬取歌手)
4碱璃、Scrapy爬取網(wǎng)易云音樂和評論(四、關(guān)于API)
5、Scrapy爬取網(wǎng)易云音樂和評論(五、評論)
前提:
scrapy這個框架很多人用過谆扎,網(wǎng)上教程也很多座舍,但大多就是爬爬小說這種比較簡單且有規(guī)律的。尤其大多網(wǎng)站它是可以通過點擊下一頁的方式爬取下一頁蛛勉,我看到的教程也都是這樣的。而網(wǎng)易云的按鈕光頁面不采取類似selenium這樣的模擬瀏覽器的模塊是獲取不到的,加上有API讥珍,所以換種方式。
網(wǎng)易云音樂也有很多人寫過窄瘟,也有API衷佃,不過大多是爬取了熱門歌曲,或是從歌單下手蹄葱。但是考慮到歌單會有大量重復(fù)的氏义,我則從歌手下手——
當然,從歌手頁的話图云,如果有多個歌手合唱惯悠,那每個歌手頁也都會有這首歌,但他們的鏈接是一樣的琼稻,也是會有重復(fù)的吮螺,但是相對來說就比較少。
在GitHub上也有很多優(yōu)秀的例子帕翻,例如鸠补,我寫的時候關(guān)于開頭參考了這篇:https://github.com/runningRobin/music163/blob/master/music163/spiders/spider.py,但是它沒有文檔嘀掸,我這里寫一個整站的紫岩。
個人認為scrapy的一些不足
1、在寫的過程中睬塌,發(fā)現(xiàn)scrapy這個框架其實不是那么完美泉蝌,它對上手的要求有點高歇万,而且又有些束縛,尤其是對數(shù)據(jù)庫的操作勋陪,不是那么的完美贪磺。
2、再比如我要設(shè)置一些已經(jīng)存在的url跳過(在沒有索引的情況下)诅愚,而scrapy它本身就是一個各個功能分開寫的寒锚,pinelines這個文件是處理數(shù)據(jù)庫的,但我要處理存在的url跳過违孝,pinelines就不方便了刹前,還有些可能就要寫到程序,這就相悖了雌桑。所以我后來還是沒有用框架又寫了一遍喇喉。這一塊就拿出來當教程吧。
開發(fā)環(huán)境:WIN7+Anaconda+py2.7+scrapy
數(shù)據(jù)庫:MongoDB
文章的順序:
1校坑、先分析思路拣技;
2、再分析scrapy框架每個模塊的作用撒踪;
3过咬、最后寫代碼和分析API,以及評論
只有5篇制妄,不會把完整的代碼貼出來掸绞,因為思路很重要,有了思路耕捞,懂得基本操作和順序衔掸,自己折騰就折騰出來了。
一俺抽、我們先分析歌手敞映,有兩種方法:
方法一:遍歷
優(yōu)點:有個別歌手有主頁,但是沒有申請音樂人磷斧,所以不存在歌單列表頁振愿,用第二種方法也獲取不到。
缺點:不好測試它到底有多少弛饭,大概十一二萬的樣子冕末,大多id是相隔不遠的。有些id之間相隔了幾位數(shù)侣颂,本來挺穩(wěn)定的档桃,想著往4位數(shù)遍歷就行,卻發(fā)現(xiàn)還有7位數(shù)的憔晒,這樣遍歷的跨度有些大藻肄,(id從1872開始)蔑舞,要做些處理,還有判斷這個頁面存在與否嘹屯。
方法二:從歌手分類爬取所有歌手的id
歌手分類頁:http://music.163.com/#/discover/artist
這里要說一下攻询,網(wǎng)易云的所有網(wǎng)址,要去掉中間那個#號才是真正的url抚垄,帶#的查看源代碼是獲取不到真正的信息的蜕窿。
所以其實是:http://music.163.com/discover/artist
優(yōu)點:方便谋逻,不需要考慮遍歷的數(shù)量呆馁,不需要對頁面是否存在做處理
缺點:可能會漏掉一些有主頁但未注冊的歌手。
我們主要以方法二入手毁兆,分析如下:
我們看這個頁面左側(cè)欄:
2浙滤、因為當時我寫的時候,參考到前面提到的那篇GitHub上的代碼气堕,
這個group_ids里的就是左側(cè)每個項對應(yīng)所有的頁面了(不包括最上方的推薦歌手和入駐歌手纺腊,因為包含在其他里面了)
3、我們按F12或右鍵檢查茎芭,如圖揖膜,每個對應(yīng)的url是:http://music.163.com/discover/artist/cat?id=xxx,
這里的id就是上面group_ids里的數(shù)字了梅桩。
4壹粟、然后我們再點進去,如圖四宿百,url的id就是上面這個group_ids里的元素了趁仙,而后面的initial是首字母的意思,你看下面我們選中的是A垦页,然后它是65雀费,是不是想到ASCII碼?在ASCII碼中A就是從65開始的痊焊,Z是90盏袄,后面以此類推,最后有個其他薄啥,代替的是0:
我們將這兩個分別存儲為一個列表或元組:
# 左側(cè)欄所有:男女辕羽、國家分類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,同樣赘艳,查看源代碼的時候去掉url里的#酌毡。
2克握、我們獲取的這個歌手頁的url對應(yīng)的是熱門50首,在對應(yīng)網(wǎng)頁里我們會發(fā)現(xiàn)下面有好幾個塊:熱門50首枷踏、專輯菩暗、MV、歌手介紹
3旭蠕、因為受框架的限制停团,以上四個信息的內(nèi)容不在一個傳遞鏈里,
以下兩種順序的特點都是后者傳入的參數(shù)都是由前者返回的掏熬,而這四個之間屬于相同的id佑稠,他們并不需要由前者返回,不構(gòu)成一個傳遞鏈:
1)旗芬、歌手 ——>專輯列表——>歌曲列表——>歌曲信息——>第5步
2)舌胶、歌手 ——>熱門50首的歌曲列表——>歌曲信息——>第4步
4、如果如果你只需要熱門歌曲你可以獲取它所有鏈接疮丛,這個代碼被我分為兩塊:
1)幔嫂、第一塊是包含熱門50首的url,也只有url誊薄,在id名為'song-list-pre-cache'的div標簽里履恩,div->ul->li->a->href
2)、而第二塊textarea里是json呢蔫,是這50首歌的比較完整的信息切心,只不過,這些信息通過lxml.etree或者BeautifulSoup用text的方式獲取下來會是字符串咐刨,我們需要用json將它格式化昙衅。
如果你只需要歌曲的話,選擇第一條就好了定鸟,直接跳到第四篇講API的)而涉,用歌曲的API即可。
5联予、我們要獲取所有歌手的歌曲啼县,就得從歌手的專輯下手,獲取專輯里所有的歌手才行沸久。我們在專輯頁會發(fā)現(xiàn)季眷,有些是有很多頁的,我最開始用的是scrapy的xpath解析頁面卷胯,后來搜的時候發(fā)現(xiàn)了API子刮,所以接下來的東西,我們就不通過頁面的方式了,API我是通過這個網(wǎng)站發(fā)現(xiàn)的:http://moonlib.com/606.html(最近發(fā)現(xiàn)網(wǎng)站掛了挺峡,請看我的第四篇講API的葵孤,有其他類似API的文章鏈接)。
我們用到的是2到6(不包括5橱赠,沒用到歌單)尤仍,第7條接口是MV的,不過不幸沒有發(fā)現(xiàn)像專輯一樣的列表頁信息狭姨,它只有單曲的MV的API宰啦。不過這里我們用不上。后面第四篇會專門分析API饼拍。
6赡模、接下來就是每個專輯的所有歌曲還有專輯、歌手的一些信息惕耕,另外專輯下也有評論纺裁,且評論數(shù)的獲取方式有些不同,因此評論有兩種處理司澎。
7栋豫、最后從圖八里的歌曲鏈接點進去的就是歌曲頁了挤安,如圖九:
好,思路就是這樣丧鸯,接下來我們分析Scrapy這個框架蛤铜。