目录:

  • 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"
View Code

相关文章:

  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2021-06-18
  • 2022-02-03
  • 2021-04-14
猜你喜欢
  • 2021-06-04
  • 2022-12-23
  • 2021-06-10
  • 2021-05-13
  • 2021-12-09
  • 2021-12-22
  • 2021-07-17
相关资源
相似解决方案