4

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

我当前的示例:我有一个称为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()

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

希望它足够清楚。

4

1 回答 1

5

坦率地说,我不使用 Scrapy 合约,我也不推荐任何人使用它们。他们有很多问题有朝一日可能会从 Scrapy 中删除

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

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

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

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

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

于 2016-07-05T00:05:02.477 回答