请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

重试中间件的使用

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

正在回答

1回答

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

1 回复 有任何疑惑可以回复我~
  • 非常感谢!
    回复 有任何疑惑可以回复我~ 2019-06-19 21:59:31
  • 首先我在__init__创建了一个redis连接,然后在process_request进行获取Key的操作,然后进行Url重置, 接着,我在process_response中监控状态,当检测到异常的时候,从redis中删除key,然后重新获取一个key,并返回request进行重试请求,正如老师所说,scrapy是一个高并发框架, 假设我process_request接收到了5个请求, 这5个请求都是第一个过期的key的话, 在process_response中,我也会获取到5个异常需要删除key的操作, 那么, 它会在redis中进行5次删除操作, 我在想,可不可以在检测到第一个请求的时候, 仅仅删除一个key, 将它锁住,然后其他的请求通通强制返回, 这样可以充分利用scrapy 高并发的优势(目前解决是在setting中设置并发为1, 这样效率会变得很慢,虽然成功完成了切换key的操作)
    回复 有任何疑惑可以回复我~ 2019-06-19 22:05:40
  • bobby 回复 提问者 我是一只有宝贝的熊 #3
    scrapy高并发,但是处理process_request的时候请求这个时候实际上还没有发送出去,这样的话你是如何判断到当前的key失效的呢?你只有在返回reponse的时候才会知道某个key是否已经失效了,但是因为是高并发的框架,所以在返回response之前,已经有大量的request携带了失效的key去请求了。所以我的理解你应该是希望在处理reponse的时候想去block住已经发送出去的request吧,这样虽然能达到目的,但是对于已经发送出去的request还是没法阻止,只有尽快通知还没有发送出去的request检查一下key而已
    回复 有任何疑惑可以回复我~ 2019-06-20 14:00:29
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号