重试中间件的使用

来源:10-9 集成bloomfilter到scrapy-redis中

我是一只有宝贝的熊

2019-06-15

老师,我在练习scrapy 时,使用scrapy 对接百度api,它需要一个ak, 我申请了几个,首先在初始化时,从redis中读取其中一个,但是当ak超出限制的时候,它返回的还是200状态码,于是我在process_response中获取它的返回信息,可以正确的捕获超出限制状态,接下来我就需要更换ak, 我手动去redis删除,但是它的每个请求都会经过process_response, process_request, 因此,我的key无法全局更换,并且,我的key瞬间就被删除光了,我也尝试过改写retry_middleware,但不成功。。这种情况还有别的什么思路么?

写回答

1回答

bobby

2019-06-17

因为scrapy是一个高并发的框架,所以可以在短时间内快速的发起多个请求,所以对于已经发送出去的请求,当然没办法在你修改了当前的response就去影响到其他所有的url了,但是还没有发送出去的url可以在process_request中拦截然后从redis中读取,你这里提到的key瞬间删光是什么意思?每个response不应该只是删除自己的的ak吗

1
4
我是一只有宝贝的熊
回复
bobby
对的,就是这个意思,因为已经是发送出去的request了,我在返回response之前检测这些失效的key,如果失效,更换key,然后将这些request返回调度器重新进行请求, 目前的解决方案仅仅是让它的request限制为一个, 这样,它才可以将后面的请求也进行改变,但这样效率下降了N倍不止,老师,有没有解决方案,比如加个锁,但我不知道应该怎么做
2019-06-25
共4条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程