gpt4 book ai didi

redis - Scrapy 分布式连接数

转载 作者:可可西里 更新时间:2023-11-01 11:13:06 25 4
gpt4 key购买 nike

假设我有几台服务器,每台服务器同时运行多个 Scrapy 蜘蛛实例。每个蜘蛛被限制为 4 个并发请求,CONCURRENT_REQUESTS = 4。具体来说,假设同时有 10 个爬虫实例,所以我绝不会期望同时有超过 40 个请求。

如果我需要在任何给定时间知道所有 10 个蜘蛛中有多少并发请求处于事件状态,我可能会考虑将该整数存储在中央 Redis 服务器上的某个“connection_count”键下。

我当时的想法是编写一些下载器中间件,大致如下所示:

class countMW(object):

def process_request(self, request, spider):
# Increment the redis key

def process_response(self, request, response, spider):
# Decrement the redis key
return response

def process_exception(self, request, exception, spider):
# Decrement the redis key

但是,使用这种方法,中心键下的连接数似乎可以超过 40。我什至得到 > 4,对于单个蜘蛛运行(当网络处于负载状态时),甚至对于单个蜘蛛当 redis 存储被替换为将计数存储为蜘蛛实例本身的属性时,以消除远程 redis key 服务器更新中的任何滞后问题。

我认为这不起作用的原因是即使每个蜘蛛的请求并发上限为 4,Scrapy 仍然同时创建和排队超过 4 个请求,并且那些额外的请求调用 process_requests 在获取它们之前很久就递增计数。

首先,这个理论正确吗?其次,如果是的话,有没有一种方法可以让我仅在真正的提取发生时(当请求变为事件状态时)增加 redis 计数,并以类似的方式减少它。

最佳答案

在我看来,自定义调度器更好,因为它更适合 Scrapy 架构,并且您可以完全控制请求发出过程:

Scheduler

The Scheduler receives requests from the engine and enqueues them for feeding them later (also to the engine) when the engine requests them.

https://doc.scrapy.org/en/latest/topics/architecture.html?highlight=scheduler#component-scheduler

例如,您可以在此处找到有关如何自定义调度程序的一些灵感:https://github.com/rolando/scrapy-redis

关于redis - Scrapy 分布式连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com