分布式
pip3 install scrapy-redis
修改設(shè)置文件
(1)#設(shè)置去重組件,使用的是scrapy_redis的去重組件,而不再使用scrapy框架
自己的去重組件了
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
(2)#設(shè)置調(diào)度器,使用的是scrapy_redis重寫(xiě)的調(diào)度器,而不再使用scrapy框架
自帶的調(diào)度器了
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
(3)#可以實(shí)現(xiàn)斷點(diǎn)爬取(請(qǐng)求的記錄不會(huì)丟失,會(huì)存儲(chǔ)在redis數(shù)據(jù)庫(kù)中,
不會(huì)清除redis的任務(wù)隊(duì)列)
SCHEDULER_PERSIST = True
(4)#設(shè)置任務(wù)隊(duì)列的模式(三選一)
SpiderPriorityQueue是scrapy_redis默認(rèn)使用的隊(duì)列模式
(有自己的優(yōu)先級(jí))
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
使用了隊(duì)列的形式,任務(wù)先進(jìn)先出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
采用了棧的形式,任務(wù)先進(jìn)后出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
(5)
實(shí)現(xiàn)這個(gè)管道,可以將爬蟲(chóng)端獲取的item數(shù)據(jù),統(tǒng)一保存
在redis數(shù)據(jù)庫(kù)中
'scrapy_redis.pipelines.RedisPipeline': 400,
(6)
指定要存儲(chǔ)的redis數(shù)據(jù)庫(kù)的主機(jī)ip
REDIS_HOST = '127.0.0.1'
指定redis數(shù)據(jù)庫(kù)主機(jī)的端口
REDIS_PORT = 6379
"xcfCrawlSpider:requests":存儲(chǔ)的是請(qǐng)求的request對(duì)象
"xcfCrawlSpider:items":存儲(chǔ)的爬蟲(chóng)端獲取的items數(shù)據(jù)
"xcfCrawlSpider:dupefilter":存儲(chǔ)的指紋(為了實(shí)現(xiàn)去重)
127.0.0.1:6379> type xcfCrawlSpider:requests
zset
127.0.0.1:6379> type xcfCrawlSpider:items
list
127.0.0.1:6379> type xcfCrawlSpider:dupefilter
set
第一中情況:只設(shè)置settings.py文件,并沒(méi)有實(shí)現(xiàn)分布式,知識(shí)使用了sctapy_redis的數(shù)據(jù)存儲(chǔ)和去重功能
第二中情況:實(shí)現(xiàn)通用爬蟲(chóng)的分布式爬蟲(chóng)
from scrapy_redis.spiders import RedisCrawlSpider
#繼承制:RedisCrawlSpider
class MyCrawler(RedisCrawlSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
allowed_domains = ['dmoz.org']
#缺少了start_url,多了redis_key:根據(jù)redis_key從redis
#數(shù)據(jù)庫(kù)中獲取任務(wù)
redis_key = 'mycrawler:start_urls'
啟動(dòng)爬蟲(chóng):scrapy crawl 爬蟲(chóng)名稱(chēng)
現(xiàn)象:爬蟲(chóng)處于等待狀態(tài)
需要設(shè)置起始任務(wù):
lpush mycrawler:start_urls 目標(biāo)url
第三中情況:實(shí)現(xiàn)scrpy.spider爬蟲(chóng)的分布式爬蟲(chóng)
from scrapy_redis.spiders import RedisSpider
#繼承制:RedisSpider
class MyCrawler(RedisSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
allowed_domains = ['dmoz.org']
#缺少了start_url,多了redis_key:根據(jù)redis_key從redis
#數(shù)據(jù)庫(kù)中獲取任務(wù)
redis_key = 'mycrawler:start_urls'
啟動(dòng)爬蟲(chóng):scrapy crawl 爬蟲(chóng)名稱(chēng)
現(xiàn)象:爬蟲(chóng)處于等待狀態(tài)
需要設(shè)置起始任務(wù):
lpush mycrawler:start_urls 目標(biāo)url
dmoz.py