由于Scrapy_redis已經(jīng)為封裝了大部分的流程,所以使用它不會有任何難度。
1.啟動Redis
首先需要把Redis啟動起來。使用Mac OS/Linux的同學(xué)在終端下面輸入以下命令并回車:
redis-server
使用Windows的同學(xué),在CMD中cd進入存放Redis的文件夾,并運行:
redis-server.exe
2.修改爬蟲
在前面的課程中,我們爬蟲是繼承自scrapy.Spider這個父類。這是Scrapy里面最基本的一個爬蟲類,只能實現(xiàn)基本的爬蟲功能。現(xiàn)在需要把它替換掉,從而實現(xiàn)更高級的功能。
請對比一下下面這段使用了Scrapy_redis的代碼與前面read color網(wǎng)站爬蟲的代碼頭部有什么不同:
from scrapy_redis.spiders import RedisSpider
class ReadColorSpider(RedisSpider):name ="readcolorspider"
redis_key ='readcolorspider:start_urls'
可以看出,這里爬蟲的父類已經(jīng)改成了RedisSpider,同時多了一個:
redis_key='readcolorspider:start_urls'
這里的redis_key實際上就是一個變量名,之后爬蟲爬到的所有URL都會保存到Redis中這個名為“readcolorspider:start_urls”的列表下面,爬蟲同時也會從這個列表中讀取后續(xù)頁面的URL。這個變量名可以任意修改。
除了這兩點以外,在爬蟲部分的其他代碼都不需要做修改。
實際上,這樣就已經(jīng)建立了一個分布式爬蟲,只不過現(xiàn)在只有一臺電腦。
3.修改設(shè)置
現(xiàn)在已經(jīng)把三輪車換成了挖掘機,但是Scrapy還在按照指揮三輪車的方式指揮挖掘機,所以挖掘機還不能正常工作。因此修改爬蟲文件還不行,Scrapy還不能認識這個新的爬蟲。現(xiàn)在修改settings.py。
(1)Scheduler
首先是Scheduler的替換,這個東西是Scrapy中的調(diào)度員。在settings.py中添加以下代碼:
# Enables scheduling storing requests queue in redis.
SCHEDULER="scrapy_redis.scheduler.Scheduler"
(2)去重
# Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
設(shè)置好上面兩項以后,爬蟲已經(jīng)可以正常開始工作了。不過還可以多設(shè)置一些東西使爬蟲更好用。
(3)不清理Redis隊列
# Don't cleanup redis queues, allows to pause/resume crawls.
SCHEDULER_PERSIST=True
如果這一項為True,那么在Redis中的URL不會被Scrapy_redis清理掉,這樣的好處是:爬蟲停止了再重新啟動,它會從上次暫停的地方開始繼續(xù)爬取。但是它的弊端也很明顯,如果有多個爬蟲都要從這里讀取URL,需要另外寫一段代碼來防止重復(fù)爬取。
如果設(shè)置成了False,那么Scrapy_redis每一次讀取了URL以后,就會把這個URL給刪除。這樣的好處是:多個服務(wù)器的爬蟲不會拿到同一個URL,也就不會重復(fù)爬取。但弊端是:爬蟲暫停以后再重新啟動,它會重新開始爬。
4.爬蟲請求的調(diào)度算法
爬蟲的請求調(diào)度算法,有三種情況可供選擇:
隊列
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.SpiderQueue'
如果不配置調(diào)度算法,默認就會使用這種方式。它實現(xiàn)了一個先入先出的隊列,先放進Redis的請求會優(yōu)先爬取。
棧
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.SpiderStack'
這種方式,后放入到Redis的請求會優(yōu)先爬取。
優(yōu)先級隊列
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.SpiderPriorityQueue'
這種方式,會根據(jù)一個優(yōu)先級算法來計算哪些請求先爬取,哪些請求后爬取。這個優(yōu)先級算法比較復(fù)雜,會綜合考慮請求的深度等各個因素。
【拓展閱讀】
Redis信息,如果不配置的話,Scrapy_redis會默認Redis就運行在現(xiàn)在這臺電腦上,IP和端口也都是默認的127.0.0.1和6379。如果Redis不在本地的話,就需要將它們寫出來:
REDIS_HOST='127.0.0.1'#修改為Redis的實際IP地址
REDIS_PORT=6379#修改為Redis的實際端口