scrapy_redis
- Scrapy_redis在scrapy的基礎上實現了更多,更強大的功能,具體體現在:reqeust去重,爬蟲持久化,和輕鬆實現分佈式
- 安裝
pip3 install scrapy-redis
3.要使用分佈式 Scrapy_Redis Settings.py設置文件中需要做一下配置
這裏表示啓用scrapy-redis裏的去重組件,不實用scrapy默認的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
使用了scrapy-redis裏面的調度器組件,不使用scrapy默認的調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
允許暫停,redis請求的記錄不會丟失,不清除Redis隊列,可以恢復和暫停
SCHEDULER_PERSIST = True
下面這些是request的隊列模式
scrapy-redis默認的請求隊列形式(有自己的優先級順序)
是按照redis的有序集合排序出隊列的
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
隊列形式,請求先進先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
使用了棧的形式,請求先進後出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400,
}
指定要存儲的redis的主機的ip,默認存儲在127.0.0.1
REDIS_HOST = 'redis的主機的ip'
定要存儲的redis的主機的port,默認6379
REDIS_PORT = '6379'
導入 from scrapy_redis.spiders import RedisCrawlSpider
這個RedisCrawlSpider類爬蟲繼承了RedisCrawlSpider,能夠支持分佈式的抓取。
因爲採用的是crawlSpider,所以需要遵守Rule規則,
以及callback不能寫parse()方法。
同樣也不再有start_urls了,取而代之的是redis_key,
scrapy-redis將key從Redis裏pop出來,成爲請求的url地址。
注意:
同樣的,RedisCrawlSpider類不需要寫start_urls:
- scrapy-redis 一般直接寫allowd_domains來指定需要爬取的域,也可以從在構造方法__init__()裏動態定義爬蟲爬取域範圍(一般不用)。
- 必須指定redis_key,即啓動爬蟲的命令,參考格式:redis_key = ‘myspider:start_urls’
- 根據指定的格式,start_urls將在 Master端的 redis-cli 裏 lpush 到 Redis數據庫裏,RedisSpider 將在數據庫裏獲取start_urls。
執行方式
1.通過runspider方法執行爬蟲的py文件(也可以分次執行多條),爬蟲(們)將處於等待準備狀態:
scrapy runspider myspider_redis.py
或者
scrapy crawl myspider_redis
2 .在Master端的redis-cli輸入push指令,參考格式(指定起始url):
lpush myspider:start_urls http://www.dmoz.org/
3.Slaver端爬蟲獲取到請求,開始爬取。
scrapy和scrapy-redis有什麼區別?爲什麼選擇redis數據庫?
1) scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定製性,但是不支持分佈式。而scrapy-redis一套基於redis數據庫、運行在scrapy框架之上的組件,可以讓scrapy支持分佈式策略,Slaver端共享Master端redis數據庫裏的item隊列、請求隊列和請求指 紋集合。
2) 爲什麼選擇redis數據庫,因爲redis支持主從同步,而且數據都是緩存在內存中的,所以基於redis的分佈式爬蟲,對請求和數據的高頻讀取效率非常高。