本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于上海php自學中心 ,作者汪春波
一、Redis資料庫
Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言撰寫、支持網路、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API,從2010年3月15日起,Redis的開發作業由VMware主持,從2013年5月開始,Redis的開發由Pivotal贊助,[來自百度百科]
Redis是一個非關系型資料庫,是key-value資料結構,每一條資料都是一個鍵值對,
鍵的型別是字串,
值的型別分為五種:
- 字串 string
- 哈希 hash
- 串列 list
- 集合 set
- 有序集合 zset
redis的默認埠:6479
二、scrapy_redis分布式原理
Scrapy_redis :Redis-based components for Scrapy.
Github地址:https://github.com/rmax/scrapy-redis
安裝:
pip install scrapy-redis
scrapy_redis在scrapy的基礎上實作了更多,更強大的功能,具體體現在:
- 請求物件的持久化
- 去重的持久化
- 實作分布式
scrapy-redis只是替換了redis的幾個組件,不是一個新的框架,
三、 scrapy_redis的原理分析
3.1 回顧scrapy的流程
那么,在這個基礎上,如果需要實作分布式,即多臺服務器同時完成一個爬蟲
3.2 scrapy_redis的流程
- 在scrapy_redis中,所有的帶抓取的物件和去重的指紋都存在所有的服務器公用的redis中
- 所有的服務器共用一個redis中的request物件
- 所有的request物件存入redis前,都會在同一個redis中進行判斷,之前是否已經存入過
- 在默認情況下所有的資料會保存在redis中
具體流程如下:
3.3 Scrapy-Redis分布式策略:
假設有三臺電腦:Windows 10、Ubuntu 16.04、Windows 10,任意一臺電腦都可以作為 Master端 或 Slaver端,比如:
1、 Master端(核心服務器) :使用 Windows 10,搭建一個Redis資料庫,不負責爬取,只負責url指紋判重、Request的分配,以及資料的存盤,
2、 Slaver端(爬蟲程式執行端) :使用 Ubuntu 16.04、Windows 10,負責執行爬蟲程式,運行程序中提交新的Request給Master,
首先Slaver端從Master端拿任務(Request、url)進行資料抓取,Slaver抓取資料的同時,產生新任務的Request便提交給 Master 處理;
Master端只有一個Redis資料庫,負責將未處理的Request去重和任務分配,將處理后的Request加入待爬佇列,并且存盤爬取的資料,
Scrapy-Redis默認使用的就是這種策略,我們實作起來很簡單,因為任務調度等作業Scrapy-Redis都已經幫我們做好了,我們只需要繼承RedisSpider、指定redis_key就行了,
缺點是,Scrapy-Redis調度的任務是Request物件,里面資訊量比較大(不僅包含url,還有callback函式、headers等資訊),可能導致的結果就是會降低爬蟲速度、而且會占用Redis大量的存盤空間,所以如果要保證效率,那么就需要一定硬體水平,
四、scrapy_redis實作分布式爬蟲
前面使用scrapy框架獲取果殼網問答的問題和高贊答案,如果使用分布式爬蟲需要對setting.py以及wenda.py檔案進行修改,
在setting.py中修改和添加的內容
# 把scrapy中默認的去重組件替換為scrapy-redis中的去重組件 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 把scrapy中默認的調度器替換成scrapy-redis中的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 任務持久化 SCHEDULER_PERSIST = True # 添加scrapy-redis管道 ITEM_PIPELINES = { # 'guoke.pipelines.GuokePipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400, } # 添加redis資料庫的連接URL # REDIS_URL = 'redis://127.0.0.1:6379' REDIS_HOST = 'localhost' REDIS_PORT = 6379 REDIS_PARAMS = {} REDIS_PARAMS['password'] = '12345'
wenda.py添加的內容
from scrapy_redis.spiders import RedisSpider # class WendaSpider(scrapy.Spider): # 繼承RedisSpoder類 class WendaSpider(RedisSpider): name = 'wenda' allowed_domains = ['guokr.com'] #添加redis庫,當redis中沒有這個鍵的時候,程式會處于監聽等待狀態 redis_key = 'python'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8307.html
標籤:Python
上一篇:python實作txt轉excel,excel轉txt
下一篇:領取Python安裝包+安裝教程
