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