zoukankan      html  css  js  c++  java
  • 爬虫:Scrapy16

    Scrapy 通过合同(contract)的方式来提供了测试 spider 的集成方法。

    可以硬编码(hardcode)一个样例(sample)url,设置多个条件来测试回调函数处理 response 的结果,来测试 spider 的回调函数。每个 contract 包含在文档字符串(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
        """

    该回调函数使用了3个内置的 contract 来测试:

    class scrapy.contracts.default.UrlContract

    该 contract(@url)设置了用于检查 spider 的其它 contract 状态的样例 url。该 contract 是必须的。所有缺失该 contract 的回调函数在测试时将被忽略:

    @url url

    class scrapy.contracts.default.ReturnContract

    该 contract(@returns)设置 spider 返回的 items 和 requests 的上届和下届。上届是可选的:

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

    class scrapy.contracts.default.ScrapesContract

    该 contract(@scrapes)检查回调函数返回的所有 item 是否有特定的 fields:

    @scrapes field_1 field_2 ...

    使用 check 命令来运行 contract 检查。

    自定义 Contracts

    如果想要比内置 Scrapy contract 更为强大的功能,可以在项目里创建并设置自己的 contract,并使用 SPIDER_CONTRACTS 设置来加载:

    SPIDER_CONTRACTS = {
        'myproject.contracts.ResponseCheck': 10,
        'myproject.contracts.ItemValidate': 10,
    }

    每个 contract 必须继承 scrapy.contracts.Contract 并覆盖以下三个方法:

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

    参数:

    • method (function) – contract 所关联的回调函数
    • args (list) – 传入 docstring 的(以空格区分的)argument 列表(list)
    adjust_request_args(args)

    接收一个字典(dict)作为参数。该参数包含了所有 Request 对象 参数的默认值。该方法必须返回相同或修改过的字典。

    pre_process(response)

    该函数在 sample request 接收到 response 后,传送给回调函数前被调用,运行测试。

    post_process(output)

    该函数处理回调函数的输出。迭代器(Iterators)在传输给该函数前会被列表化(listified)。

    该样例 contract 在 response 接收时检查了是否有自定义 header。 在失败时 Raise scrapy.exceptions.ContractFaild 来展现错误:

    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')
  • 相关阅读:
    Django----博客文章数据返回
    Django----admin模块初识
    Django搭建博客文章---模型层
    Js 提交 form 表单
    sql 查询 between and 和 >= <= 比较
    C# 未能加载项目文件
    不一样的 Null
    Js实现table单双行交替色
    C# 判断一个string型的时间格式是否正确
    利用 Label 小小的提升一下用户体验
  • 原文地址:https://www.cnblogs.com/sufei-duoduo/p/5895489.html
Copyright © 2011-2022 走看看