调度器

调度器组件接收来自引擎的请求,并将它们存储到持久性和/或非持久性数据结构中。它还会获取这些请求,并在引擎请求下一个要下载的请求时将其反馈给引擎。

覆盖默认调度器

可以通过在SCHEDULER设置中提供其完整的 Python 路径来使用您自己的自定义调度器类。

最小调度器接口

class scrapy.core.scheduler.BaseScheduler[source]

调度器组件负责存储从引擎接收到的请求,并在请求时(也反馈给引擎)提供这些请求。

这些请求的原始来源是

  • 爬虫:start_requests 方法、为start_urls 属性中的 URL 创建的请求、请求回调

  • 爬虫中间件:process_spider_outputprocess_spider_exception 方法

  • 下载器中间件:process_requestprocess_responseprocess_exception 方法

调度器返回其存储请求(通过next_request 方法)的顺序在很大程度上决定了这些请求的下载顺序。

此类中定义的方法构成了 Scrapy 引擎将与其交互的最小接口。

close(reason: str) Deferred[None] | None[source]

当引擎关闭爬虫时调用。它接收爬取完成的原因作为参数,用于执行清理代码。

参数:

reason (str) – 描述爬虫关闭原因的字符串

abstract enqueue_request(request: Request) bool[source]

处理引擎接收到的请求。

如果请求存储正确,则返回True,否则返回False

如果为False,则引擎将触发request_dropped 信号,并且不会在以后尝试安排请求。作为参考,默认的 Scrapy 调度器在请求被重复过滤器拒绝时返回False

classmethod from_crawler(crawler: Crawler) Self[source]

工厂方法,接收当前Crawler 对象作为参数。

abstract has_pending_requests() bool[source]

如果调度器已将请求入队,则为True,否则为False

abstract next_request() Request | None[source]

返回要处理的下一个Request,或None 以指示目前没有请求被认为已准备好。

返回None 表示在当前 reactor 周期中,不会将调度器的任何请求发送到下载器。引擎将继续调用next_request,直到has_pending_requestsFalse

open(spider: Spider) Deferred[None] | None[source]

当引擎打开爬虫时调用。它接收爬虫实例作为参数,用于执行初始化代码。

参数:

spider (Spider) – 当前爬取的爬虫对象

默认 Scrapy 调度器

class scrapy.core.scheduler.Scheduler(dupefilter: BaseDupeFilter, jobdir: str | None = None, dqclass: type[BaseQueue] | None = None, mqclass: type[BaseQueue] | None = None, logunser: bool = False, stats: StatsCollector | None = None, pqclass: type[ScrapyPriorityQueue] | None = None, crawler: Crawler | None = None)[source]

默认的 Scrapy 调度器。此实现还通过 dupefilter 处理重复过滤。

此调度器将请求存储到多个优先级队列中(由 SCHEDULER_PRIORITY_QUEUE 设置定义)。依次,这些优先级队列由基于内存或磁盘的队列支持(分别由 SCHEDULER_MEMORY_QUEUESCHEDULER_DISK_QUEUE 设置定义)。

请求优先级几乎完全委托给优先级队列。此调度器执行的唯一优先级是使用基于磁盘的队列(如果存在,即如果定义了 JOBDIR 设置)并在发生序列化错误时回退到基于内存的队列。如果不存在磁盘队列,则直接使用内存队列。

参数:
  • dupefilter (scrapy.dupefilters.BaseDupeFilter 实例或类似:实现 BaseDupeFilter 接口的任何类) – 负责检查和过滤重复请求的对象。默认情况下使用 DUPEFILTER_CLASS 设置的值。

  • jobdir (strNone) – 用于持久化爬取状态的目录的路径。默认情况下使用 JOBDIR 设置的值。参见 作业:暂停和恢复爬取

  • dqclass () – 用作持久请求队列的类。默认情况下使用 SCHEDULER_DISK_QUEUE 设置的值。

  • mqclass () – 用作非持久请求队列的类。默认情况下使用 SCHEDULER_MEMORY_QUEUE 设置的值。

  • logunser (布尔值) – 一个布尔值,指示是否应记录不可序列化的请求。默认情况下使用 SCHEDULER_DEBUG 设置的值。

  • stats (scrapy.statscollectors.StatsCollector 实例或类似:实现 StatsCollector 接口的任何类) – 一个统计收集器对象,用于记录有关请求调度过程的统计信息。默认情况下使用 STATS_CLASS 设置的值。

  • pqclass () – 用作请求优先级队列的类。默认情况下使用 SCHEDULER_PRIORITY_QUEUE 设置的值。

  • crawler (scrapy.crawler.Crawler) – 与当前爬取对应的爬虫对象。

__len__() int[source]

返回已入队请求的总数

close(reason: str) Deferred[None] | None[source]
  1. 如果存在磁盘队列,则将挂起的请求转储到磁盘

  2. 返回 dupefilter 的 close 方法的结果

enqueue_request(request: Request) bool[source]

除非收到的请求被 Dupefilter 过滤掉,否则尝试将其推入磁盘队列,回退到将其推入内存队列。

增加相应的统计信息,例如:scheduler/enqueuedscheduler/enqueued/diskscheduler/enqueued/memory

如果请求成功存储,则返回 True,否则返回 False

classmethod from_crawler(crawler: Crawler) Self[source]

工厂方法,使用从爬取设置中获取的参数初始化调度器。

has_pending_requests() bool[source]

如果调度器已将请求入队,则为True,否则为False

next_request() Request | None[source]

从内存队列中返回一个Request对象,如果内存队列为空,则回退到磁盘队列。如果不再有排队的请求,则返回None

递增相应的统计信息,例如:scheduler/dequeuedscheduler/dequeued/diskscheduler/dequeued/memory

open(spider: Spider) Deferred[None] | None[source]
  1. 初始化内存队列。

  2. 如果jobdir属性是一个有效的目录,则初始化磁盘队列。

  3. 返回dupefilter的open方法的结果。