分布式爬虫
分布
大需求的情况需要用到分布(千万,亿),分布指将大型任务中耗时的方面分配给多个进程或者终端(电脑)共同完成,比如scrapy的downloader和pipeline
问题:多个终端之间的通信,防止数据重复
scrapy分布式的可能性
- 多个终端使用同一个scheduler—>替换为数据库
mysql: 可以持久化,查询方便,但速度慢
redis:基于内存,可以持久化,速度快,查询不易,贵
request的调度不需要查询 - pipeline使用快的数据库
scrapy-redis
配置
在settings中配置
REDIS_HOST = 'local.host' #调度器redis的IP地址
REDIS_PORT = 6379 #REDIS的端口号
from scrapy_redis.scheduler import Scheduler#从import找路径
SCHEDULER = "scrapy_redis.scheduler.Scheduler"#配置调度器为scrapy-redis
from scrapy_redis.dupefilter import RFPDupeFilter#从import找路径
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#配置去重策略的类
#如果需要断点续传即持久化
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
"scrapy_redis.pipelines.RedisPipeline": 300,
}#设置存储进redis数据库,但查询不易
然后在spider中配置
#spider中需要继承自scrapy_redis.RedisSpider
redis_key=" name:start_urls"#从redis中提取的url
同时需要在redis中输入:lpush 名字:start
_urls 请求的url