Каков наилучший подход к написанию контрактов для пауков 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
.
Надеюсь, это достаточно ясно.