我有一个Scrapy项目,有很多蜘蛛。有一个服务器端解决方案可以重新启动HMA VPN以便更改接口IP(这样我们就可以获得不同的IP并且不会被阻止)。
有一个自定义下载中间件,它为每个请求和响应发送相应的套接字消息,以便服务器端解决方案可以触发VPN重启。显然,当VPN重启即将发生时,Scrapy不得产生任何新请求 - 我们通过拥有一个锁文件来控制它。但是,在实际发生VPN重启之前,Scrapy必须处理所有尚未收到的响应。
将sleep
放入下载中间件会完全停止Scrapy。有没有办法处理响应但是阻止新请求(直到锁定文件被删除)?
当产生超过1x的并发请求时,显然就是这种情况。
使用以下中间件代码:
class CustomMiddleware(object):
def process_request(self, request, spider):
while os.path.exists(LOCK_FILE_PATH):
time.sleep(10)
# Send corresponding socket message("OPEN")
def process_response(self, request, response, spider):
# Send corresponding socket message("CLOSE")
return response
答案 0 :(得分:0)
原来解决方案非常简单:
if os.path.exists(LOCK_FILE_PATH):
return request
这样做请求将通过中间件全部传递,直到可以执行。