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

一、建立的命令:

scrapy startproject + 你的項目名        

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

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

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

二、框架結構

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

當然,這個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
image.png
BOT_NAME很重要,在WYY.py文件裏寫腳本的時候,繼承自scrapy.Spider的這個類,它需要有一個name,而這兩者必須同名。
image.png

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

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

4、關於ITEM_PIPELINES
image.png

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

5、關於mongodb配置
隨便寫在哪,我們就寫在剛剛ITEM_PIPELINES的後面
image.png
這裏順便建議,常量都用大寫。
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()就可以了,
image.png
另外三個集合同樣,每個單獨寫個類,依照你們自己的需求定字段即可。

五、關於pinelines.py

image.png

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

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章