scrapy-redis是scrapy框架基於redis數據庫的組件,用於scrapy項目的分佈式開發和部署。html
有以下特徵:python
分佈式爬取git
您能夠啓動多個spider工程,相互之間共享單個redis的requests隊列。最適合普遍的多個域名網站的內容爬取。github
分佈式數據處理redis
爬取到的scrapy的item數據能夠推入到redis隊列中,這意味着你能夠根據需求啓動儘量多的處理程序來共享item的隊列,進行item數據持久化處理數據庫
Scrapy即插即用組件json
Scheduler調度器 + Duplication複製 過濾器,Item Pipeline,基本spider架構
scrapy-redis架構
scrapy-redis總體運行流程以下:框架
1. 首先Slaver端從Master端拿任務(Request、url)進行數據抓取,Slaver抓取數據的同時,產生新任務的Request便提交給 Master 處理;scrapy
2. Master端只有一個Redis數據庫,負責將未處理的Request去重和任務分配,將處理後的Request加入待爬隊列,而且存儲爬取的數據。
Scrapy-Redis默認使用的就是這種策略,咱們實現起來很簡單,由於任務調度等工做Scrapy-Redis都已經幫咱們作好了,咱們只須要繼承RedisSpider、指定redis_key就好了。
缺點是,Scrapy-Redis調度的任務是Request對象,裏面信息量比較大(不只包含url,還有callback函數、headers等信息),
可能致使的結果就是會下降爬蟲速度、並且會佔用Redis大量的存儲空間,因此若是要保證效率,那麼就須要必定硬件水平。
scrapy-redis安裝
經過pip安裝便可:pip install scrapy-redis
通常須要python、redis、scrapy這三個安裝包
官方文檔:https://scrapy-redis.readthedocs.io/en/stable/
源碼位置:https://github.com/rmax/scrapy-redis
參考博客:http://www.javashuo.com/article/p-gesudfwk-s.html
scrapy-redis經常使用配置
通常在配置文件中添加以下幾個經常使用配置選項:
1(必須). 使用了scrapy_redis的去重組件,在redis數據庫裏作去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
2(必須). 使用了scrapy_redis的調度器,在redis裏分配請求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
3(可選). 在redis中保持scrapy-redis用到的各個隊列,從而容許暫停和暫停後恢復,也就是不清理redis queues
SCHEDULER_PERSIST = True
4(必須). 經過配置RedisPipeline將item寫入key爲 spider.name : items 的redis的list中,供後面的分佈式處理item 這個已經由 scrapy-redis 實現,不須要咱們寫代碼,直接使用便可
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 100 ,
}
5(必須). 指定redis數據庫的鏈接參數
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
scrapy-redis鍵名介紹
scrapy-redis中都是用key-value形式存儲數據,其中有幾個常見的key-value形式:
一、 「項目名:items」 -->list 類型,保存爬蟲獲取到的數據item 內容是 json 字符串
二、 「項目名:dupefilter」 -->set類型,用於爬蟲訪問的URL去重 內容是 40個字符的 url 的hash字符串
三、 「項目名: start_urls」 -->List 類型,用於獲取spider啓動時爬取的第一個url
四、 「項目名:requests」 -->zset類型,用於scheduler調度處理 requests 內容是 request 對象的序列化 字符串
scrapy-redis簡單實例
在原來非分佈式爬蟲的基礎上,使用scrapy-redis簡單搭建一個分佈式爬蟲,過程只須要修改一下spider的繼承類和配置文件便可,很簡單。
原非分佈式爬蟲項目,參見:http://www.javashuo.com/article/p-zbxjdtee-d.html
首先修改配置文件,在settings.py文件中添加代碼:
而後須要修改的文件,是spider文件,原文件代碼爲:
修改成:
只修改了兩個地方,一個是繼承類:由scrapy.Spider修改成RedisSpider
而後start_url已經不須要了,修改成:redis_key = "xxxxx",其中,這個鍵的值暫時是本身取的名字,
通常用項目名:start_urls來代替初始爬取的url。因爲分佈式scrapy-redis中每一個請求都是從redis中取出來的,所以,在redis數據庫中,設置一個redis_key的值,做爲初始的url,scrapy就會自動在redis中取出redis_key的值,做爲初始url,實現自動爬取。
所以:來到redis中,添加代碼:
即:在redis中設置一個鍵值對,鍵爲tencent2:start_urls , 值爲:初始化url。便可將傳入的url做爲初始爬取的url。
如此一來,分佈式已經搭建完畢。