【问题标题】:Scrapy contracts with multiple parse methods具有多种解析方法的 Scrapy 合约
【发布时间】:2016-07-04 19:49:05
【问题描述】:

为具有不止一种方法来解析响应的 Scrapy 蜘蛛编写合约的最佳方法是什么? 我看到了这个answer,但对我来说听起来不是很清楚。

我当前的示例:我有一个名为 parse_product 的方法可以提取页面上的信息,但我需要为另一个页面中的同一产品提取更多数据,所以我在yield 处提出了一个新请求在这个方法的末尾发出一个新的请求,让新的回调提取这些字段并返回项目。

问题是,如果我为第二种方法编写合同,它会失败,因为它没有元属性(包含具有大部分字段的项目)。如果我为第一种方法编写合同,我无法检查它是否返回字段,因为它返回的是新请求,而不是项目。

def parse_product(self, response):
    il = ItemLoader(item=ProductItem(), response=response)
    # populate the item in here

    # yield the new request sending the ItemLoader to another callback
    yield scrapy.Request(new_url, callback=self.parse_images, meta={'item': il})

def parse_images(self, response):
     """
     @url http://foo.bar
     @returns items 1 1
     @scrapes field1 field2 field3
     """
     il = response.request.meta['item']
     # extract the new fields and add them to the item in here

     yield il.load_item()

在示例中,我将合同放在了第二种方法中,但它在response.request.meta['item'] 上给了我一个KeyError 异常,而且field1field2 字段在第一种方法中填充。

希望它足够清楚。

【问题讨论】:

  • 你终于找到解决这个问题的方法了吗?
  • 不,我没有,最终我放弃了使用合同,正如下面答案中 Elias 所指出的那样。

标签: python unit-testing scrapy web-crawler contracts


【解决方案1】:

坦率地说,我不使用 Scrapy 合约,也不推荐任何人使用它们。他们有many issuessomeday may be removed from Scrapy

在实践中,我在使用蜘蛛单元测试时运气不佳。

为了在开发过程中测试蜘蛛,我会启用缓存,然后根据需要多次重新运行蜘蛛以正确抓取。

对于回归错误,我最好使用即时验证的项目管道(或蜘蛛中间件)(无论如何,您在早期测试中只能捕捉到这么多)。制定一些恢复策略也是一个好主意。

为了维护一个健康的代码库,我会不断地将类库代码从蜘蛛本身移出,以使其更具可测试性。

抱歉,如果这不是您要找的答案。

【讨论】:

  • 这不是我正在寻找的答案,但它确实对我有很大帮助,也许比实际答案(如果存在)更多。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 2019-04-16
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多