调度器¶
调度器组件接收来自引擎的请求,并将它们存储到持久性和/或非持久性数据结构中。它还会获取这些请求,并在引擎请求下一个要下载的请求时将其反馈给引擎。
覆盖默认调度器¶
可以通过在SCHEDULER
设置中提供其完整的 Python 路径来使用您自己的自定义调度器类。
最小调度器接口¶
- class scrapy.core.scheduler.BaseScheduler[source]¶
调度器组件负责存储从引擎接收到的请求,并在请求时(也反馈给引擎)提供这些请求。
这些请求的原始来源是
爬虫:
start_requests
方法、为start_urls
属性中的 URL 创建的请求、请求回调爬虫中间件:
process_spider_output
和process_spider_exception
方法下载器中间件:
process_request
、process_response
和process_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
。
默认 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_QUEUE
和SCHEDULER_DISK_QUEUE
设置定义)。请求优先级几乎完全委托给优先级队列。此调度器执行的唯一优先级是使用基于磁盘的队列(如果存在,即如果定义了
JOBDIR
设置)并在发生序列化错误时回退到基于内存的队列。如果不存在磁盘队列,则直接使用内存队列。- 参数:
dupefilter (
scrapy.dupefilters.BaseDupeFilter
实例或类似:实现 BaseDupeFilter 接口的任何类) – 负责检查和过滤重复请求的对象。默认情况下使用DUPEFILTER_CLASS
设置的值。jobdir (
str
或None
) – 用于持久化爬取状态的目录的路径。默认情况下使用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
) – 与当前爬取对应的爬虫对象。
- close(reason: str) Deferred[None] | None [source]¶
如果存在磁盘队列,则将挂起的请求转储到磁盘
返回 dupefilter 的
close
方法的结果
- enqueue_request(request: Request) bool [source]¶
除非收到的请求被 Dupefilter 过滤掉,否则尝试将其推入磁盘队列,回退到将其推入内存队列。
增加相应的统计信息,例如:
scheduler/enqueued
、scheduler/enqueued/disk
、scheduler/enqueued/memory
。如果请求成功存储,则返回
True
,否则返回False
。