组件¶
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
。
以下函数在实现组件时也很有用,例如在报告问题时报告组件类的导入路径