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