1. 程式人生 > 其它 >Scrapy爬取網易雲音樂和評論(二、Scrapy框架每個模組的作用)

Scrapy爬取網易雲音樂和評論(二、Scrapy框架每個模組的作用)

教程系列連結目錄:

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

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

關於如何建立一個scrapy程式,可以參考這兩篇文章:
1、http://cuiqingcai.com/3472.html(建立的時候推薦)
2、http://www.cnblogs.com/wuxl360/p/5567631.html

關於使用mongodb,可以參考:
1、http://www.jianshu.com/p/30408d8ad1c0

CSDN不允許寫爬取類的東西,其他幾章被遮蔽了,可以去我簡書看https://www.jianshu.com/u/a0871cf1b395,後續可能會陸續轉移到部落格園

一、建立的命令:

scrapy startproject + 你的專案名        

第一篇文章有提到兩個比較特別且有用的地方:
1、

解釋一下:execute裡面的三個字串連起來它其實就是最後執行scrapy程式的命令。這個檔案的好處是,倘若你在使用編輯器,比如sublime,是可以在配置後直接執行的,而不用開啟DOS視窗,如果你在sublime裡直接執行scrapy本身的任何一個檔案,它都不會執行成功,而只能執行這個entrypoint.py,名字應該隨意吧,無所謂。

另一點請參考以下的第三部分

二、框架結構

現在整個框架的結構是這樣的:

當然,這個spiders資料夾下的WangYiYun.py並不是自動生成的,這個需要我們自己建立,這個檔案就是主爬蟲程式。另外,這個指令碼的名字建議不要取和專案名同名,否則後面可能會踩坑。以下簡稱WYY.py,大家最好將這個檔名改成這個,省得出錯,我因為已經生成了,改了出錯。解決辦法是:在程式碼除編碼外的首行加上:

from __future__ import absolute_import
  • entrypoint.py:執行程式,就想象是run/python xx.py
  • items.py:如果你學過orm的話,會很好的理解它,它相當於資料庫的欄位。
  • middlewares.py:這個是個中介軟體,起初我也不知道它是做什麼的,因為並沒有用到。且很多例子上顯示的結構沒有它,基本上我們也不會改到它。很久之後無意在B站看到一個Scrapy的教學視訊,才瞭解到如果需要用到代理池,可以在裡面做處理。
  • pipelines.py:這個就是定義儲存的檔案,比如連線,使用哪個資料庫儲存。
  • settings.py:一看就知道,是配置檔案。

三、關於setting配置:

1、關於除錯

上面的原因和配置解釋的很清楚,參考http://cuiqingcai.com/3472.html:

2、關於spidername和robots.txt

BOT_NAME很重要,在WYY.py檔案裡寫指令碼的時候,繼承自scrapy.Spider的這個類,它需要有一個name,而這兩者必須同名。

最下面那行的ROBOTSTXT_OBEY,大家知道爬蟲繞不開robots.txt這個檔案,每個網站都會有這個網站,是必須遵守的一個守則吧,就是有些不讓你爬,有些又允許你爬。預設是True,如果失敗了,可以嘗試將其註釋,然後複製一行,改為False。
settings.py檔案裡大多都是寫好的,你只要將它複製,取消註釋,然後修改即可,最好不要不復制直接在原文上改,萬一改到了什麼出了錯,還能有個參照物。

3、關於headers

重要的一般就是Referer、User-Agent(這個必須要有)、Accept(可選,但是涉及到xhr,即json檔案,就要修改了)。
這裡將它註釋,改成自己的,你也可以寫在主爬蟲WYY.py檔案裡另寫,比較自由,寫在這裡算是一個基本配置吧。

4、關於ITEM_PIPELINES

這個是啟用一個Item Pipeline元件,數字代表優先順序,越小越優先,沒有註釋的那行是我的,而下面還有一行,是我之前在網上看過的一種寫法,但是並不能成功,它應當是一個字典,列表不行

5、關於mongodb配置
隨便寫在哪,我們就寫在剛剛ITEM_PIPELINES的後面

這裡順便建議,常量都用大寫。
HOST是本地,PORT是埠,DBNAME是資料庫,WYY。
接下來四個是集合了,相當於table,這個順序是倒序。
1、MONGODB_COL_ARTIST - > ArtistInfo -> 所有的歌手列表
2、MONGODB_COL_ALBUMLIST - >AlbumListInfo - > 每個歌手的所有專輯列表
3、MONGODB_COL_ALBUM - >AlbumInfo - > 每張專輯內的所有歌曲列表
4、MONGODB_COL_SONG - > SongInfo -> 每首歌曲的資訊

四、關於items.py

它就相當於SQL/MySQL裡的欄位,它沒有什麼特別的欄位型別,反正所有都是scrapy.Field()就可以了,

另外三個集合同樣,每個單獨寫個類,依照你們自己的需求定欄位即可。

五、關於pinelines.py

切記,要記得匯入items裡的那幾個你定義的欄位的類,我之前忘了匯入,然後一切程式正常,就死活存不進去,也不報錯,差點掉坑裡走不出來

然後這個WangyiyunPipeline基本就兩塊,一個初始化__init__(),一個process_item(),前者是用來連線的,後者是用來儲存的。
可以看到我有一些註釋,這裡說明一下,因為涉及到多個集合儲存,一開始真不知道怎麼弄,一開始我以為把每個都扔__init__就成了,然後通過self呼叫,後來發現不行,在__init__定義一個集合就可以了。process_item()還是參考剛剛那個GitHub那個專案,才知道通過isinstance判斷。


isinstance大家知道什麼意思吧,然後每個item對應的什麼在註釋我也寫了。另外,我下面還有一些被註釋掉的程式碼部分,這裡就是我在最開頭說的,想要跳過一些重複的地方,但是跳過之後不知道做什麼處理。

在不用框架的時候,我們存Mongodb。是先定義一個空字典,然後賦值,最後insert,這裡也是一樣的,只不過,我們是將傳入的item給dict化。

而後面,在不使用預設的集合時,重新賦一個取代之前的artist即可。

接下來我們開始正式寫程式碼了。