Scheduler
Scheduler 组件会接收来自 Engine 的请求,它负责将请求存储到 持久化或非持久化的数据结构中。
它还可以获取这些请求,并在 Engine 要求下载下一个请求时,将其返回给 Engine。
默认 Scheduler
from_crawler
Scrapy 默认已实现的 Queue
持久/非持久化队列:
PickleFifoDiskQueue
:pickle 实现的存储磁盘文件的 先进先出 队列
PickleLifoDiskQueue
:pickle 实现的存储磁盘文件的 后进先出 队列
MarshalFifoDiskQueue
:marshal 实现的存储磁盘文件的 先进先出 队列
MarshalLifoDiskQueue
:marshal 实现的存储磁盘文件的 后进先出 队列
FifoMemoryQueue
:基于内存的 先进先出 队列
LifoMemoryQueue
:基于内存的 后进先出 队列
请求优先级队列:
ScrapyPriorityQueue
:默认请求优先级队列
DownloaderAwarePriorityQueue
:并行抓不同的域时,这个效果好。但不能与CONCURRENT_REQUESTS_PER_IP
同时使用
enqueue_request
has_pending_requests
next_request
重写 Scheduler
继承BaseScheduler
至少要实现 enqueue_request
、has_pending_requests
和 next_request
三个方法
Scheduler 负责存储来自 Engine 的 Request,并调度 Request 反馈 Request 给 Engine。
Request 的来源,可以是:
- Spider:
start_requests
方法,start_urls
列表中生成的 request ,request callbacks
- Spider 中间件:
process_spider_output
和process_spider_exception
方法
- Downloader 中间件:
process_request
, process_response
和process_exception
方法