组件

Scrapy 组件是指任何使用 build_from_crawler() 创建对象的类。

这包括您可以分配到以下设置的类

第三方 Scrapy 组件还可以让您定义其他 Scrapy 组件,通常可以通过 设置 进行配置,以修改其行为。

强制执行组件需求

有时,您的组件可能仅打算在特定条件下工作。例如,它们可能需要最低版本的 Scrapy 才能按预期工作,或者它们可能需要某些设置具有特定值。

除了在组件文档中描述这些条件之外,如果在运行时不满足这些条件,最好从组件的 __init__ 方法引发异常。

对于 下载器中间件扩展数据项管道爬虫中间件,您应该引发 scrapy.exceptions.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: type[T], crawler: Crawler, /, *args: Any, **kwargs: Any) T[source]

使用类的 from_crawlerfrom_settings 构造函数构建类实例。

版本 2.12 中的新功能。

*args**kwargs 将转发到构造函数。

如果生成的实例为 None,则引发 TypeError

以下函数在实现组件时也很有用,例如在报告问题时报告组件类的导入路径

scrapy.utils.python.global_object_name(obj: Any) str[source]

返回给定类的完整导入路径。

>>> from scrapy import Request
>>> global_object_name(Request)
'scrapy.http.request.Request'