目录:
-
scrapy-redis组件
- scrapy-redis配置示例
一、scrapy-redis组件
1、scrapy-redis简介:
scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能:
- scheduler - 调度器
- dupefilter - URL去重规则(被调度器使用)
- pipeline - 数据持久化
2、url去重
多爬虫分布式并发,如何保证调用的url不重复。需要把爬虫队列和调度器,去重规则,提取到redis中。
组件: scrapy-redis,将去重规则和调度器放置到redis中。
流程:连接redis,指定调度器时,调用去重规则.request_seen方法。
1 定义去重规则(被调度器调用并应用) 2 3 a. 内部会使用以下配置进行连接Redis 4 5 # REDIS_HOST = 'localhost' # 主机名 6 # REDIS_PORT = 6379 # 端口 7 # REDIS_URL = 'redis://user:pass@hostname:9001' # 连接URL(优先于以上配置) 8 # REDIS_PARAMS = {} # Redis连接参数 默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,}) 9 # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块 默认:redis.StrictRedis 10 # REDIS_ENCODING = "utf-8" # redis编码类型 默认:'utf-8' 11 12 b. 去重规则通过redis的集合完成,集合的Key为: 13 14 key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())} 15 默认配置: 16 DUPEFILTER_KEY = 'dupefilter:%(timestamp)s' 17 18 c. 去重规则中将url转换成唯一标示,然后在redis中检查是否已经在集合中存在 19 20 from scrapy.utils import request 21 from scrapy.http import Request 22 23 req = Request(url='http://www.cnblogs.com/wupeiqi.html') 24 result = request.request_fingerprint(req) 25 print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c 26 27 28 PS: 29 - URL参数位置不同时,计算结果一致; 30 - 默认请求头不在计算范围,include_headers可以设置指定请求头 31 示例: 32 from scrapy.utils import request 33 from scrapy.http import Request 34 35 req = Request(url='http://www.baidu.com?name=8&id=1',callback=lambda x:print(x),cookies={'k1':'vvvvv'}) 36 result = request.request_fingerprint(req,include_headers=['cookies',]) 37 38 print(result) 39 40 req = Request(url='http://www.baidu.com?id=1&name=8',callback=lambda x:print(x),cookies={'k1':666}) 41 42 result = request.request_fingerprint(req,include_headers=['cookies',]) 43 44 print(result) 45 46 """ 47 # Ensure all spiders share same duplicates filter through redis. 48 # DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"