scrapy 自己並非一個分佈式框架,而 Scrapy-redis 庫使得分佈式成爲可能;git
Scrapy-redis 並無重構框架,而是基於redis數據庫重寫了框架的某些組件。github
分配爬取任務:爲每一個爬蟲分配不重複的任務redis
scrapy-redis 使用 redis 數據庫存儲全部請求,利用 redis 數據庫實現請求隊列,全部爬蟲從該隊列中獲取任務,並將新產生的請求添加到該隊列中;數據庫
彙總爬取數據:將全部爬蟲的數據彙總到一處服務器
scrapy-redis 使用 RedisPipeline 將數據存儲於同一個 redis 數據庫中,並用 twisted 框架實現併發存儲。網絡
具體實現參考併發
Scrapy-redis 源碼 https://github.com/rmax/scrapy-redis/tree/master/src/scrapy_redis框架
1. 多臺服務器scrapy
2. 分別配置 單機爬蟲 所需環境分佈式
3. 選擇一臺服務器搭建 redis 數據庫
4. 測試集羣可否鏈接 redis
1. 建立單機項目
2. 修改配置文件
# 必選項 # ================================================================= # 指定爬蟲所使用的Redis數據庫(在雲服務器116.29.35.201 上) REDIS_URL = 'redis://116.29.35.201:6379' # 使用scrapy_redis的調度器替代Scrapy 原版調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy_redis的RFPDupeFilter做爲去重過濾器 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 啓用scrapy_redis的RedisPipeline將爬取到的數據彙總到Redis數據庫 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } # 可選項 # ================================================================= #爬蟲中止後,保留/清理Redis中的請求隊列以及去重集合 # True:保留,False:清理,默認爲False SCHEDULER_PERSIST = True
3. 修改爬蟲
from scrapy_redis.spiders import RedisSpider # 1.更改基類 # class BooksSpider(spider.Spider): class BooksSpider(RedisSpider): # 2.註釋 start_urls # start_urls = ['http://books.toscrape.com/']
【如何爲多個爬蟲設置起始爬取點】
單機爬蟲 的起始爬取點由 start_urls 肯定,可是分佈式去掉了 start_urls,而後重寫了 start_requests 方法,它嘗試從 redis 數據庫的某個特定列表中獲取起始爬取點,構造request對象,並設置 dont_filter=False,
該列表可經過配置文件設定,REDIS_START_URLS_KEY,默認爲 <spider_name>:start_urls;
在分佈式爬取時,運行全部爬蟲後,須要手動向該列表添加起始爬取點,以後只有其中一個爬蟲獲取到該起始點,避免重複。
4. 分發代碼到其餘機器
5. 每臺機器上運行爬蟲
6. 爬蟲處於等待狀態,在任一臺機器上鍊接redis,設置爬取起始點
lpush books:start_urls 'http://books.toscrape.com'
其中一個爬蟲獲取該url,此後整個爬蟲開始運轉。
參考資料:
《精通scrapy網絡爬蟲》 pdf