說到redis了濒生,自然就要說到另一個(gè)爬蟲框架scrapy_redis,分布式爬蟲磺送,
scrapy與scrapy_redis最大的不同是scheduler歉摧,也正是因?yàn)檫@個(gè)scheduler才使得scrapy_redis能夠做到分布式。
最大的改動在于將帶爬url放進(jìn)redis激蹲,master主要就是維護(hù)此隊(duì)列棉磨,slave就能根據(jù)優(yōu)先級隊(duì)列進(jìn)行分別式爬取,同時(shí)redis有set托呕,dupefiler模塊通過哈希指紋去重含蓉,保證分布式進(jìn)行。
item返回是先返回到master的redis然后存入其他數(shù)據(jù)庫项郊。
對scrapy的改造:
改造
setting:
1.(必須加)。使用scrapy_redis.duperfilter.REPDupeFilter的去重組件斟赚,在redis數(shù)據(jù)庫里做去重着降。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
2.(必須加)。使用了scrapy_redis的調(diào)度器拗军,在redis里面分配請求任洞。
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
3.(必須加)。在redis queues 允許暫停和暫停后恢復(fù)发侵,也就是不清理redis queues
SCHEDULER_PERSIST = True
4.(必須加)交掏。通過RedisPipeline將item寫入key為 spider.name: items的redis的list中,供后面的分布式處理item刃鳄。
這個(gè)已經(jīng)由scrapy-redis實(shí)現(xiàn)了盅弛,不需要我們自己手動寫代碼,直接使用即可。
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 100
}
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
spider:
from scrapy_redis.spiders import RedisSpider
import scrapy
class ToutiaoSpider(RedisSpider):
name='toutiao'
redis_key = 'start_url' #需將start_url先存入redis
def parse(self, response):
....
scrapy.Request(url, callback=xxx)