Python 向特定的刮擦请求添加延迟

Python 向特定的刮擦请求添加延迟,python,scrapy,Python,Scrapy,是否有可能延迟特定刮擦请求的重试。我有一个中间件,它需要将页面请求推迟到以后。我知道如何进行基本的延迟(队列结束),以及如何延迟所有请求(全局设置),但我只想延迟这一个单独的请求。这在接近队列末尾时最为重要,如果我执行简单的延迟,它将立即再次成为下一个请求。sleep()方法将在给定的秒数内暂停执行。参数可以是浮点数,以指示更精确的睡眠时间 因此,您必须在spider中导入时间模块 import time 然后可以在需要延迟的地方添加sleep方法 time.sleep( 5 ) 使用twi

是否有可能延迟特定刮擦请求的重试。我有一个中间件,它需要将页面请求推迟到以后。我知道如何进行基本的延迟(队列结束),以及如何延迟所有请求(全局设置),但我只想延迟这一个单独的请求。这在接近队列末尾时最为重要,如果我执行简单的延迟,它将立即再次成为下一个请求。

sleep()方法将在给定的秒数内暂停执行。参数可以是浮点数,以指示更精确的睡眠时间

因此,您必须在spider中导入时间模块

import time
然后可以在需要延迟的地方添加sleep方法

time.sleep( 5 )

使用
twisted.reactor.callLater()
的解决方案如下:

方法1 一种方法是向Spider(,)添加中间件:

#文件:middleware.py
从twisted.internet导入
从twisted.internet.defer导入延迟
类DelayedRequestsMiddlware(对象):
def过程_请求(自我、请求、蜘蛛):
delay\u s=request.meta.get('delay\u request\u by',无)
如果不延迟,则:
返回
递延的
reactor.callLater(delay_s,deferred.callback,None)
延期归还
您以后可以在Spider中使用它,如下所示:

import scrapy
类QuotesSpider(刮毛蜘蛛):
name=“quotes”
自定义设置={
'DOWNLOADER_middleware':{'middleware.DelayedRequestsMiddleware':123},
}
def start_请求(自我):
#此请求本身将延迟5秒
生成剪贴请求(url=)http://quotes.toscrape.com/page/1/', 
meta={'delay_request_by':5})
#此请求不会延迟
生成剪贴请求(url=)http://quotes.toscrape.com/page/2/')
def解析(自我,响应):
...  # 在此处理结果
方法2 您可以使用自定义的重试中间件()来实现这一点,只需覆盖当前的
process\u response
方法:

然后启用它,而不是
settings.py
中的默认
RetryMiddleware

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}

我认为目前不可能。对于类似的问题和讨论,darkrho的评论很可能是解决问题的方法。
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}