scrapy - redis 簡介
scrapy-redis 是 scrapy 框架基於 redis 數據庫的組件,用於 scrapy 項目的分佈式開發和部署。
官方文檔:https://scrapy-redis.readthedocs.io/en/stable/
源碼位置:https://github.com/rmax/scrapy-redis
參考博客:https://www.cnblogs.com/kylinlin/p/5198233.html
優勢
-
分佈式爬取
可以啓動多個 spider 工程,相互之間共享單個 redis 的 requests 隊列。最適合廣泛的多個域名網站的內容爬取。 -
分佈式數據處理
爬取到的 scrapy 的 item 數據可以推入到 redis 隊列中,這意味着你可以根據需求啓動儘可能多的處理程序來共享item的隊列,進行item數據持久化處理 -
Scrapy 即插即用組件
Scheduler 調度器 + Duplication 複製 過濾器, Item Pipeline ,基本spider
缺點
Scrapy-Redis 調度的任務是 Request 對象,裏面信息量比較大(不僅包含 url ,還有callback 函數、 headers 等信息)
- 降低爬蟲速度
- 佔用 Redis 大量的存儲空間
- 需要一定硬件水平
scrapy - redis 架構
- 首先 Slaver 端從 Master 端拿任務( Request 、 url )進行數據抓取, Slaver 抓取數據的同時,產生新任務的 Request 便提交給 Master 處理;
- Master 端只有一個 Redis 數據庫,負責將未處理的 Request 去重和任務分配,將處理後的Request 加入待爬隊列,並且存儲爬取的數據。
Scrapy-Redis 默認使用的就是這種策略,實現簡單,因爲任務調度等工作 Scrapy-Redis 都已經幫我
們做好了,我們只需要繼承 RedisSpider 、指定 redis_key 就行了。
scrapy - redis 常用配置
# 使用了scrapy_redis的去重組件,在redis數據庫裏做去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用了scrapy_redis的調度器,在redis裏分配請求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 在redis中保持scrapy-redis用到的各個隊列,從而允許暫停和暫停後恢復,也就是不清理redis queues
SCHEDULER_PERSIST = True
# 通過配置RedisPipeline將item寫入key爲 spider.name : items 的redis的list中,供後面的分
# 布式處理item 這個已經由 scrapy-redis 實現,不需要我們寫代碼,直接使用即可
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 100 ,
}
# 指定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 簡單搭建一個分佈式爬蟲,過程只需要修改下面文
件:
-
settings.py
-
spider 文件
繼承類:由 scrapy.Spider 修改爲 RedisSpiderstart_url 已經不需要了,修改爲: redis_key = “xxxxx”
在 redis 數據庫中,設置一個 redis_key 的值,作爲初始的 url , scrapy 就會自動在redis 中取出 redis_key 的值,作爲初始 url ,實現自動爬取。
添加起始URL:
lpush xxxx:start_urls http:xxxxx.com/xxxx