为具有不止一种方法来解析响应的 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']
,字段field1
和field2
填充。
希望它足够清楚。