组件
Scrapy 组件是任何通过以下方式构建其对象的类:build_from_crawler()。
这包括您可以分配给以下设置的类
第三方 Scrapy 组件也可以让您定义额外的 Scrapy 组件,这些组件通常可以通过设置来修改其行为。
从爬虫初始化
任何 Scrapy 组件都可以选择定义以下类方法
- classmethod from_crawler(cls, crawler: scrapy.crawler.Crawler, *args, **kwargs)
根据 crawler 返回组件实例。
args 和 kwargs 是一些组件接收的特定于组件的参数。但是,大多数组件不接收任何参数,而是使用设置。
如果组件类定义了此方法,则会调用此方法来创建组件的任何实例。
crawler 对象提供对所有 Scrapy 核心组件的访问,例如设置和信号,允许组件访问它们并将其功能挂接到 Scrapy 中。
设置
组件可以通过设置进行配置。
组件可以从settings属性中读取任何设置,该属性属于它们可以获取以进行初始化的Crawler对象。这包括内置设置和自定义设置。
例如
class MyExtension:
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
return cls(settings.getbool("LOG_ENABLED"))
def __init__(self, log_is_enabled=False):
if log_is_enabled:
print("log is enabled!")
组件无需以编程方式声明其自定义设置。但是,它们应该记录下来,以便用户了解它们的存在以及如何使用它们。
一个好的做法是为自定义设置添加组件名称作为前缀,以避免与其他现有(或未来)组件的自定义设置发生冲突。例如,一个名为WarcCaching的扩展程序可以为其自定义设置添加前缀WARC_CACHING_。
另一个好的做法,主要针对用于组件优先级字典的组件,是提供一个名为<PREFIX>_ENABLED(例如WARC_CACHING_ENABLED)的布尔设置,以便在不更改组件优先级字典设置的情况下开启和关闭该组件。您通常可以在初始化期间检查此类设置的值,如果为False,则抛出NotConfigured。
在为自定义设置选择名称时,最好也查看一下内置设置的名称,以努力保持一致性。
强制要求
有时,您的组件可能只打算在特定条件下工作。例如,它们可能需要 Scrapy 的最低版本才能按预期工作,或者它们可能要求某些设置具有特定值。
除了在组件文档中描述这些条件外,如果运行时不满足这些条件,从组件的__init__方法中抛出异常是一个好做法。
对于下载器中间件、扩展、项目管道和蜘蛛中间件,您应该抛出NotConfigured,并将问题的描述作为参数传递给异常,以便将其打印到日志中供用户查看。对于其他组件,您可以随意抛出任何您认为合适的其他异常;例如,RuntimeError对于 Scrapy 版本不匹配是合理的,而ValueError如果问题是设置的值,则可能更好。
如果您的要求是 Scrapy 的最低版本,您可以使用scrapy.__version__来强制执行您的要求。例如
from packaging.version import parse as parse_version
import scrapy
class MyComponent:
def __init__(self):
if parse_version(scrapy.__version__) < parse_version("2.7"):
raise RuntimeError(
f"{MyComponent.__qualname__} requires Scrapy 2.7 or "
f"later, which allow defining the process_spider_output "
f"method of spider middlewares as an asynchronous "
f"generator."
)
API 参考
以下函数可用于创建组件类的实例
- scrapy.utils.misc.build_from_crawler(objcls: ~scrapy.utils.misc.SupportsFromCrawler[~scrapy.utils.misc._T_co, ~_P], crawler: Crawler, /, *args: ~typing.~_P, **kwargs: ~typing.~_P) _T_co[source]
- scrapy.utils.misc.build_from_crawler(objcls: Callable[_P, _T_co], crawler: Crawler, /, *args: ~typing.~_P, **kwargs: ~typing.~_P) _T_co
使用其
from_crawler()或__init__()构造函数来构造类实例。2.12 版本新增。
*args和**kwargs被转发到构造函数。如果结果实例为
None,则抛出TypeError。
在实现组件时,以下函数也很有用,用于报告组件类的导入路径,例如在报告问题时: