核心 API¶
本节介绍 Scrapy 核心 API,旨在供扩展和中间件的开发者使用。
爬虫 API¶
Scrapy API 的主要入口点是 Crawler
对象,通过 from_crawler
类方法传递给扩展。此对象提供对所有 Scrapy 核心组件的访问,并且是扩展访问它们并将它们的功能挂钩到 Scrapy 的唯一方法。
扩展管理器负责加载和跟踪已安装的扩展,并通过 EXTENSIONS
设置进行配置,该设置包含所有可用扩展及其顺序的字典,类似于您 配置下载器中间件 的方式。
- class scrapy.crawler.Crawler(spidercls: type[scrapy.spiders.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 尚未稳定。
- crawl(*args, **kwargs)[source]¶
通过使用给定的
args
和kwargs
参数实例化其爬虫类来启动爬虫,同时启动执行引擎。应仅调用一次。返回一个延迟,在爬取完成时触发。
- 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.CrawlerRunner(settings: dict[str, Any] | Settings | None = None)[source]¶
这是一个方便的辅助类,用于跟踪、管理和运行已在已设置的
reactor
中设置的爬虫。必须使用
Settings
对象实例化 CrawlerRunner 对象。除非编写手动处理爬取过程的脚本,否则不需要此类(因为 Scrapy 负责相应地使用它)。有关示例,请参阅从脚本运行 Scrapy。
- crawl(crawler_or_spidercls: type[scrapy.spiders.Spider] | str | Crawler, *args: Any, **kwargs: Any) Deferred[None] [source]¶
使用提供的参数运行爬虫。
它将调用给定 Crawler 的
crawl()
方法,同时跟踪它,以便以后可以停止它。如果
crawler_or_spidercls
不是Crawler
实例,则此方法将尝试使用此参数作为传递给它的爬虫类来创建一个。返回一个延迟对象,当爬取完成时触发。
- create_crawler(crawler_or_spidercls: type[scrapy.spiders.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 爬虫的类。
此类通过添加对启动
reactor
和处理关机信号(如键盘中断命令 Ctrl-C)的支持来扩展CrawlerRunner
。它还配置顶级日志记录。如果您没有在应用程序中运行其他
reactor
,则此实用程序应该比CrawlerRunner
更合适。CrawlerProcess 对象必须使用
Settings
对象实例化。- 参数:
**install_root_handler** – 是否安装根日志处理程序(默认值:True)
除非编写手动处理爬取过程的脚本,否则不需要此类(因为 Scrapy 负责相应地使用它)。有关示例,请参阅从脚本运行 Scrapy。
- crawl(crawler_or_spidercls: type[scrapy.spiders.Spider] | str | Crawler, *args: Any, **kwargs: Any) Deferred[None] ¶
使用提供的参数运行爬虫。
它将调用给定 Crawler 的
crawl()
方法,同时跟踪它,以便以后可以停止它。如果
crawler_or_spidercls
不是Crawler
实例,则此方法将尝试使用此参数作为传递给它的爬虫类来创建一个。返回一个延迟对象,当爬取完成时触发。
- create_crawler(crawler_or_spidercls: type[scrapy.spiders.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()
方法及其值转换变体进行访问。当请求存储的键时,将检索具有最高优先级的值。- copy_to_dict() dict[Union[bool, float, int, str, NoneType], 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
的数值。
- set(name: bool | float | int | str | None, value: Any, priority: int | str = 'project') None [source]¶
以给定的优先级存储键/值属性。
设置应在配置爬虫对象(通过
configure()
方法)之前填充,否则它们将没有任何效果。- 参数:
name (str) – 设置名称
value (object) – 与设置关联的值
priority (str 或 int) – 设置的优先级。应该是
SETTINGS_PRIORITIES
的键或整数
- setmodule(module: ModuleType | str, priority: int | str = 'project') None [source]¶
以给定的优先级存储来自模块的设置。
这是一个辅助函数,它使用提供的
priority
为module
中每个全局声明的大写变量调用set()
。- 参数:
module (types.ModuleType 或 str) – 模块或模块的路径
priority (str 或 int) – 设置的优先级。应该是
SETTINGS_PRIORITIES
的键或整数
- update(values: _SettingsInputT, priority: int | str = 'project') None [source]¶
以给定的优先级存储键/值对。
这是一个辅助函数,它使用提供的
priority
为values
中的每个项目调用set()
。如果
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
项目设置中指定其路径来使用自定义 Spider 加载器。它们必须完全实现scrapy.interfaces.ISpiderLoader
接口以确保执行无错误。- from_settings(settings)[source]¶
Scrapy 使用此类方法来创建类的实例。它使用当前项目设置调用,并加载在
SPIDER_MODULES
设置的模块中递归找到的 Spider。- 参数:
settings (
Settings
实例) – 项目设置
Signals API¶
- class scrapy.signalmanager.SignalManager(sender: Any = _Anonymous)[source]¶
- connect(receiver: Any, signal: Any, **kwargs: Any) None [source]¶
将接收器函数连接到信号。
信号可以是任何对象,尽管 Scrapy 带有一些预定义的信号,这些信号在Signals部分有文档记录。
- 参数:
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) – 要断开的信号
统计收集器 API¶
在scrapy.statscollectors
模块下提供了多个统计收集器,它们都实现了由StatsCollector
类定义的统计收集器 API(它们都继承自该类)。