说到redis了,自然就要说到另一个爬虫框架scrapy_redis,分布式爬虫,
scrapy与scrapy_redis最大的不同是scheduler,也正是因为这个scheduler才使得scrapy_redis能够做到分布式。
最大的改动在于将带爬url放进redis,master主要就是维护此队列,slave就能根据优先级队列进行分别式爬取,同时redis有set,dupefiler模块通过哈希指纹去重,保证分布式进行。
item返回是先返回到master的redis然后存入其他数据库。
对scrapy的改造:
改造
setting:
1.(必须加)。使用scrapy_redis.duperfilter.REPDupeFilter的去重组件,在redis数据库里做去重。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
2.(必须加)。使用了scrapy_redis的调度器,在redis里面分配请求。
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
3.(必须加)。在redis queues 允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True
4.(必须加)。通过RedisPipeline将item写入key为 spider.name: items的redis的list中,供后面的分布式处理item。
这个已经由scrapy-redis实现了,不需要我们自己手动写代码,直接使用即可。
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)
网友评论