教程系列鏈接目錄:
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即可。
接下來我們開始正式寫代碼了。