蜘蛛合同

新版本0.15。

注意

这是一个新功能(在Scrapy 0.15中引入),可能会受到次要功能/ API更新。检查发行说明以通知更新。

测试蜘蛛可以特别烦人,而没有什么可以阻止您编写单元测试,任务会很快繁琐。 Scrapy提供了一种通过合同方式测试您的蜘蛛的综合方法。

这样可以通过对示例URL进行硬编码来测试您的蜘蛛的每个回调,并检查各种约束,以了解响应如何处理响应。每个合同都以@为前缀,并包含在docstring中。请参见以下示例:

def解析(self,response):

“”“此函数解析样本响应,有些合约混合

与这个docstring。



@url http://www.amazon.com/s?field-keywords=selfish+gene

@返回物品1 16

@返回请求0 0

@scrapes标题作者年价格

“””

此回调使用三个内置合约进行测试:

class scrapy.contracts.default.UrlContract

此合同(@url)设置检查此蜘蛛的其他合同条件时使用的示例网址。本合同是强制性的。运行检查时,所有缺少此合同的回调都将被忽略:

@url网址

class scrapy.contracts.default.ReturnsContract

该合同(@returns)为蜘蛛返回的项目和请求设置下限和上限。上限是可选的:

@returns item(s)| request(s)[min [max]]

class scrapy.contracts.default.ScrapesContract

此契约(@scrapes)检查回调所返回的所有项目都具有指定的字段:

@scrapes field_1 field_2 ...

使用check命令运行合同检查。

定制合同

如果您发现需要比内置的scrapy合同更多的权力,您可以使用SPIDER_CONTRACTS设置在项目中创建并加载自己的合同:

SPIDER_CONTRACTS = {

'myproject.contracts.ResponseCheck':10,

'myproject.contracts.ItemValidate':10,

}

每个合同必须继承scrapy.contracts.Contract并可以覆盖三种方法:

类scrapy.contracts.Contract(method,* args)

参数:

方法(function) - 与之相关联的回调函数

args(list) - 传递给docstring的参数列表(空格分隔)

adjust_request_args(参数)

它接收一个dict作为参数,其中包含Request对象的默认参数。必须返回相同或修改版本。

pre_process(响应)

这允许在将样本请求传递给回调之前,对从示例请求收到的响应进行各种检查。

post_process(输出)

这允许处理回调的输出。迭代器在传递给此钩子之前被转换。

这是一个演示合同,它检查收到的响应中是否存在自定义标题。提高scrapy.exceptions.ContractFail以获得故障漂亮打印:

results matching ""

    No results matching ""