组件¶
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_crawler或from_settings构造函数构建类实例。新版本2.12中新增。
*args和**kwargs被转发到构造函数。如果生成的实例是
None,则引发TypeError。
在实现组件时,以下函数也可能很有用,用于报告组件类的导入路径,例如在报告问题时: