组件

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'