核心 API
本节介绍 Scrapy 核心 API,旨在供扩展和中间件开发者参考。
Crawler API
Scrapy API 的主要入口点是 Crawler
对象,组件 可以获取它进行初始化。它提供了访问所有 Scrapy 核心组件的途径,并且是组件访问它们并将功能挂接到 Scrapy 的唯一方式。
扩展管理器(Extension Manager)负责加载和跟踪已安装的扩展,并通过 EXTENSIONS
设置进行配置,该设置包含一个字典,列出了所有可用的扩展及其顺序,类似于你配置下载器中间件的方式。
- class scrapy.crawler.Crawler(spidercls: type[Spider], settings: dict[str, Any] | Settings | None = None, init_reactor: bool = False)[source]
Crawler 对象必须使用
scrapy.Spider
子类和一个scrapy.settings.Settings
对象进行实例化。- settings
此 crawler 的设置管理器。
供扩展和中间件用于访问此 crawler 的 Scrapy 设置。
有关 Scrapy 设置的介绍,请参阅设置。
有关 API,请参阅
Settings
类。
- signals
此 crawler 的信号管理器。
供扩展和中间件用于将自身挂接到 Scrapy 功能中。
有关信号的介绍,请参阅信号。
有关 API,请参阅
SignalManager
类。
- stats
此 crawler 的统计信息收集器。
供扩展和中间件用于记录其行为统计信息,或访问其他扩展收集的统计信息。
有关统计信息收集的介绍,请参阅统计信息收集。
有关 API,请参阅
StatsCollector
类。
- engine
执行引擎,协调调度器、下载器和爬虫之间的核心爬取逻辑。
某些扩展可能需要访问 Scrapy 引擎,以检查或修改下载器和调度器的行为,尽管这是一个高级用法,且此 API 尚未稳定。
- crawl(*args, **kwargs)[source]
通过使用给定的
args
和kwargs
参数实例化其 spider 类来启动 crawler,同时启动执行引擎。应只调用一次。返回一个 deferred 对象,该对象在爬取完成时触发。
- stop() Generator[Deferred[Any], Any, None] [source]
开始优雅地停止 crawler,并返回一个 deferred 对象,该对象在 crawler 停止时触发。
- get_downloader_middleware(cls: type[_T]) _T | None [source]
返回指定类或其子类的 下载器中间件 运行时实例,如果未找到则返回
None
。添加到 2.12 版本。
此方法只能在爬取引擎创建后调用,例如在
engine_started
或spider_opened
信号时。
- get_extension(cls: type[_T]) _T | None [source]
返回指定类或其子类的 扩展 运行时实例,如果未找到则返回
None
。添加到 2.12 版本。
此方法只能在扩展管理器创建后调用,例如在
engine_started
或spider_opened
信号时。
- get_item_pipeline(cls: type[_T]) _T | None [source]
返回指定类或其子类的 item pipeline 运行时实例,如果未找到则返回
None
。添加到 2.12 版本。
此方法只能在爬取引擎创建后调用,例如在
engine_started
或spider_opened
信号时。
- get_spider_middleware(cls: type[_T]) _T | None [source]
返回指定类或其子类的 spider 中间件 运行时实例,如果未找到则返回
None
。添加到 2.12 版本。
此方法只能在爬取引擎创建后调用,例如在
engine_started
或spider_opened
信号时。
- class scrapy.crawler.CrawlerRunner(settings: dict[str, Any] | Settings | None = None)[source]
这是一个方便的辅助类,用于在已设置的
reactor
中跟踪、管理和运行 crawlers。CrawlerRunner 对象必须使用
Settings
对象进行实例化。除非编写手动处理爬取过程的脚本,否则不需要此类(因为 Scrapy 会相应地负责使用它)。有关示例,请参阅从脚本运行 Scrapy。
- crawl(crawler_or_spidercls: type[Spider] | str | Crawler, *args: Any, **kwargs: Any) Deferred[None] [source]
使用提供的参数运行 crawler。
它将调用给定的 Crawler 的
crawl()
方法,同时跟踪它以便稍后停止。如果
crawler_or_spidercls
不是Crawler
实例,此方法将尝试使用此参数作为传入的 spider 类来创建一个 Crawler 实例。返回一个 deferred 对象,该对象在爬取完成时触发。
- create_crawler(crawler_or_spidercls: type[Spider] | str | Crawler) Crawler [source]
返回一个
Crawler
对象。如果
crawler_or_spidercls
是一个 Crawler 实例,则按原样返回。如果
crawler_or_spidercls
是一个 Spider 子类,则为其构建一个新的 Crawler 实例。如果
crawler_or_spidercls
是一个字符串,此函数将在 Scrapy 项目中(使用 spider loader)查找同名 spider,然后为其创建一个 Crawler 实例。
- class scrapy.crawler.CrawlerProcess(settings: dict[str, Any] | Settings | None = None, install_root_handler: bool = True)[source]
基类:
CrawlerRunner
一个类,用于在同一进程中同时运行多个 scrapy crawlers。
此类扩展了
CrawlerRunner
,增加了启动reactor
和处理关闭信号(例如键盘中断命令 Ctrl-C)的支持。它还配置了顶层日志记录。如果你没有在应用程序中运行另一个
reactor
,则此工具比CrawlerRunner
更适合。CrawlerProcess 对象必须使用
Settings
对象进行实例化。- 参数:
install_root_handler – 是否安装根日志处理程序(默认值:True)
除非编写手动处理爬取过程的脚本,否则不需要此类(因为 Scrapy 会相应地负责使用它)。有关示例,请参阅从脚本运行 Scrapy。
- crawl(crawler_or_spidercls: type[Spider] | str | Crawler, *args: Any, **kwargs: Any) Deferred[None]
使用提供的参数运行 crawler。
它将调用给定的 Crawler 的
crawl()
方法,同时跟踪它以便稍后停止。如果
crawler_or_spidercls
不是Crawler
实例,此方法将尝试使用此参数作为传入的 spider 类来创建一个 Crawler 实例。返回一个 deferred 对象,该对象在爬取完成时触发。
- create_crawler(crawler_or_spidercls: type[Spider] | str | Crawler) Crawler
返回一个
Crawler
对象。如果
crawler_or_spidercls
是一个 Crawler 实例,则按原样返回。如果
crawler_or_spidercls
是一个 Spider 子类,则为其构建一个新的 Crawler 实例。如果
crawler_or_spidercls
是一个字符串,此函数将在 Scrapy 项目中(使用 spider loader)查找同名 spider,然后为其创建一个 Crawler 实例。
- start(stop_after_crawl: bool = True, install_signal_handlers: bool = True) None [source]
此方法启动一个
reactor
,调整其线程池大小为REACTOR_THREADPOOL_MAXSIZE
,并根据DNSCACHE_ENABLED
和DNSCACHE_SIZE
安装 DNS 缓存。如果
stop_after_crawl
为 True,则在所有爬虫完成后,使用join()
停止 reactor。
设置 API
- scrapy.settings.SETTINGS_PRIORITIES
一个字典,设置 Scrapy 中使用的默认设置优先级的键名和优先级级别。
每个条目定义一个设置入口点,给它一个用于标识的代码名称和一个整数优先级。在
Settings
类中设置和检索值时,较高的优先级比低的优先级具有更高的优先权。SETTINGS_PRIORITIES = { "default": 0, "command": 10, "addon": 15, "project": 20, "spider": 30, "cmdline": 40, }
关于每个设置来源的详细解释,请参阅:设置。
- scrapy.settings.get_settings_priority(priority: int | str) int [source]
小型辅助函数,用于在
SETTINGS_PRIORITIES
字典中查找给定的字符串优先级并返回其数值,或者直接返回给定的数值优先级。
- class scrapy.settings.Settings(values: _SettingsInputT = None, priority: int | str = 'project')[source]
基类:
BaseSettings
此对象存储用于配置内部组件的 Scrapy 设置,并可用于任何进一步的自定义。
它是
BaseSettings
的直接子类并支持其所有方法。此外,在此类实例化后,新对象将已填充 内置设置参考 中描述的全局默认设置。
- class scrapy.settings.BaseSettings(values: _SettingsInputT = None, priority: int | str = 'project')[source]
此类的实例表现得像字典,但除了存储其
(key, value)
对之外,还存储优先级,并且可以被冻结 (即标记为不可变)。键值条目可以在初始化时通过
values
参数传入,并且它们将采用priority
级别 (除非values
已是BaseSettings
的一个实例,在这种情况下将保留现有的优先级级别)。如果priority
参数是字符串,优先级名称将在SETTINGS_PRIORITIES
中查找。否则,应提供一个特定的整数。对象创建后,新的设置可以通过
set()
方法加载或更新,并且可以通过字典的方括号表示法访问,或者通过实例的get()
方法及其值转换变体访问。当请求存储的键时,将检索具有最高优先级的那个值。- add_to_list(name: bool | float | int | str | None, item: Any) None [source]
将 item 追加到指定 name 的
list
设置中,如果 item 不在该列表中。此更改无论 name 设置的优先级如何都将应用。设置优先级也不受此更改的影响。
- copy_to_dict() dict[bool | float | int | str | None, Any] [source]
创建当前设置的副本并转换为字典。
此方法返回一个新字典,填充了与当前设置相同的值及其优先级。
对返回字典的修改不会反映在原始设置上。
此方法很有用,例如在 Scrapy shell 中打印设置时。
- getbool(name: bool | float | int | str | None, default: bool = False) bool [source]
将设置值作为布尔值获取。
1
、'1'
、True` 和'True'
返回True
,而0
、'0'
、False
、'False'
和None
返回False
。例如,通过设置为
'0'
的环境变量填充的设置,在使用此方法时将返回False
。
- getdict(name: bool | float | int | str | None, default: dict[Any, Any] | None = None) dict[Any, Any] [source]
将设置值作为字典获取。如果设置的原始类型是字典,将返回它的一个副本。如果它是字符串,则会将其评估为 JSON 字典。如果它本身是
BaseSettings
实例,它将被转换为字典,包含其所有当前设置值,就像通过get()
返回的一样,并丢失所有关于优先级和可变性的信息。
- getdictorlist(name: bool | float | int | str | None, default: dict[Any, Any] | list[Any] | tuple[Any] | None = None) dict[Any, Any] | list[Any] [source]
-
如果设置已经是 dict 或 list,将返回它的一个副本。
如果它是字符串,则会将其评估为 JSON,或者作为逗号分隔的字符串列表作为备用。
例如,从命令行填充的设置将返回
{'key1': 'value1', 'key2': 'value2'}
如果设置为'{"key1": "value1", "key2": "value2"}'
['one', 'two']
如果设置为'["one", "two"]'
或'one,two'
- 参数:
name (string) – 设置名称
default (any) – 如果未找到设置,则返回的值
- getlist(name: bool | float | int | str | None, default: list[Any] | None = None) list[Any] [source]
获取列表类型的设置值。如果设置的原始类型是列表,则返回其副本。如果是字符串,将按“,”分割。如果为空字符串,将返回空列表。
例如,通过环境变量设置为
'one,two'
的设置在使用此方法时将返回列表 [‘one’, ‘two’]。
- getpriority(name: bool | float | int | str | None) int | None [source]
返回设置当前的数字优先级值,如果给定的
name
不存在,则返回None
。- 参数:
name (str) – 设置名称
- getwithbase(name: bool | float | int | str | None) BaseSettings [source]
获取一个字典型设置与其对应的 _BASE 部分的组合。
- 参数:
name (str) – 字典型设置的名称
- maxpriority() int [source]
返回所有设置中存在的最高优先级的数值,如果没有任何设置存储,则返回
SETTINGS_PRIORITIES
中default
的数值。
- pop(k[, d]) v, remove specified key and return the corresponding value. [source]
如果未找到键,若指定了 d 则返回 d,否则引发 KeyError。
- remove_from_list(name: bool | float | int | str | None, item: Any) None [source]
从指定名称的
list
设置中移除 item。如果 item 不存在,则引发
ValueError
。此更改无论 name 设置的优先级如何都将应用。设置优先级也不受此更改的影响。
- replace_in_component_priority_dict(name: bool | float | int | str | None, old_cls: type, new_cls: type, priority: int | None = None) None [source]
在 name 组件优先级字典 中用 new_cls 替换 old_cls。
如果 old_cls 不存在,或其值为
None
,则引发KeyError
。如果 old_cls 作为导入字符串存在,即使存在多次,这些键也会被删除并替换为 new_cls。
如果指定了 priority,则将其值赋给组件优先级字典中的 new_cls。否则,使用 old_cls 的值。如果 old_cls 以不同值存在多次(导入字符串可能出现这种情况),则赋给 new_cls 的值是其中的一个,但不保证是哪一个。
此更改无论 name 设置的优先级如何都将应用。设置优先级也不受此更改的影响。
- set(name: bool | float | int | str | None, value: Any, priority: int | str = 'project') None [source]
以给定优先级存储键/值属性。
设置应在配置 Crawler 对象之前(通过
configure()
方法)填充,否则不会生效。- 参数:
name (str) – 设置名称
value (object) – 与设置关联的值
priority (str 或 int) – 设置的优先级。应为
SETTINGS_PRIORITIES
的键或整数
- set_in_component_priority_dict(name: bool | float | int | str | None, cls: type, priority: int | None) None [source]
以 priority 设置 name 组件优先级字典 中的 cls 组件。
如果 cls 已存在,其值将被更新。
如果 cls 作为导入字符串存在,即使存在多次,这些键也会被删除并替换为 cls。
此更改无论 name 设置的优先级如何都将应用。设置优先级也不受此更改的影响。
- setdefault_in_component_priority_dict(name: bool | float | int | str | None, cls: type, priority: int | None) None [source]
如果 cls 组件尚未定义(即使作为导入字符串),则以 priority 设置 name 组件优先级字典 中的 cls 组件。
如果 cls 尚未定义,则无论 name 设置的优先级如何,都会进行设置。此更改也不会影响设置优先级。
- setmodule(module: ModuleType | str, priority: int | str = 'project') None [source]
以给定优先级存储模块中的设置。
这是一个辅助函数,它会调用
set()
,为module
中每个全局声明的大写变量设置提供的priority
。- 参数:
module (types.ModuleType 或 str) – 模块或模块的路径
priority (str 或 int) – 设置的优先级。应为
SETTINGS_PRIORITIES
的键或整数
- update(values: _SettingsInputT, priority: int | str = 'project') None [source]
以给定优先级存储键/值对。
这是一个辅助函数,它会调用
set()
,为values
中的每个项设置提供的priority
。如果
values
是一个字符串,则假定它是 JSON 编码的,并首先使用json.loads()
解析为字典。如果它是一个BaseSettings
实例,则将使用每个键的优先级,并忽略priority
参数。这允许使用一个命令插入/更新具有不同优先级的设置。- 参数:
values (dict 或 string 或
BaseSettings
) – 设置名称和值priority (str 或 int) – 设置的优先级。应为
SETTINGS_PRIORITIES
的键或整数
SpiderLoader API
- class scrapy.spiderloader.SpiderLoader[source]
此类别负责检索和处理项目中定义的 spider 类。
自定义爬虫加载器可以通过在
SPIDER_LOADER_CLASS
项目设置中指定其路径来使用。它们必须完全实现scrapy.interfaces.ISpiderLoader
接口,以确保无差错执行。- from_settings(settings)[source]
Scrapy使用这个类方法来创建类的实例。它会使用当前项目设置被调用,并且会递归加载在
SPIDER_MODULES
设置的模块中找到的爬虫。- 参数:
settings (
Settings
实例) – 项目设置
信号API
- class scrapy.signalmanager.SignalManager(sender: Any = _Anonymous)[source]
- connect(receiver: Any, signal: Any, **kwargs: Any) None [source]
将接收函数连接到信号。
信号可以是任何对象,尽管Scrapy自带了一些预定义信号,这些信号已在信号部分进行了文档说明。
- 参数:
receiver (collections.abc.Callable) – 要连接的函数
signal (object) – 要连接的信号
- disconnect(receiver: Any, signal: Any, **kwargs: Any) None [source]
将接收函数与信号断开连接。这与
connect()
方法的效果相反,并且参数相同。
- disconnect_all(signal: Any, **kwargs: Any) None [source]
断开给定信号的所有接收器。
- 参数:
signal (object) – 要断开连接的信号
- send_catch_log(signal: Any, **kwargs: Any) list[tuple[Any, Any]] [source]
发送信号,捕获异常并记录日志。
关键字参数会传递给信号处理器(通过
connect()
方法连接)。
统计收集器API
在scrapy.statscollectors
模块下有几个可用的统计收集器,它们都实现了由StatsCollector
类(它们都继承自该类)定义的统计收集器API。