Skip to main content

蜘蛛合同

0.15 新版功能.

注解

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

测试蜘蛛可以得到特别烦人,虽然没有什么阻止你编写单元测试任务变得麻烦很快。 Scrapy提供了一种通过合同方式测试蜘蛛的集成方法。

这允许您通过硬编码示例url来测试蜘蛛的每个回调,并检查回调处理响应的各种约束。每个合同都以 @ 为前缀,并包含在docstring中。请参阅以下示例:

def parse(self, response):
    """ This function parses a sample response. Some contracts are mingled
    with this docstring.

    @url http://www.amazon.com/s?field-keywords=selfish+gene
    @returns items 1 16
    @returns requests 0 0
    @scrapes Title Author Year Price
    """

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

class scrapy.contracts.default.UrlContract

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

@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,并且可以覆盖三种方法:

class scrapy.contracts.Contract(method, *args)
参数:
  • method (function) – 与合同关联的回调函数
  • args (list) – 传入docstring的参数列表(空格分隔)
adjust_request_args(args)

这将接收 dict 作为包含 Request 对象的默认参数的参数。必须返回相同或修改的版本。

pre_process(response)

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

post_process(output)

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

这是一个演示合同,检查在收到的响应中自定义标头的存在。提高 scrapy.exceptions.ContractFail,以获得打印失败:

from scrapy.contracts import Contract
from scrapy.exceptions import ContractFail

class HasHeaderContract(Contract):
    """ Demo contract which checks the presence of a custom header
        @has_header X-CustomHeader
    """

    name = 'has_header'

    def pre_process(self, response):
        for header in self.args:
            if header not in response.headers:
                raise ContractFail('X-CustomHeader not present')