Scrapy 教程(八)-分佈式爬蟲

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

相關文章
相關標籤/搜索