網易雲音樂爬取


前提:

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
  • 2
  • 3
  • 4

二、歌手頁

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這個框架。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM