Контракты Scrapy с несколькими методами разбора

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

Надеюсь, это достаточно ясно.


person Gustavo Carvalho    schedule 04.07.2016    source источник


Ответы (1)


Честно говоря, я не использую контракты Scrapy и никому не рекомендую их использовать. У них много проблем и когда-нибудь может быть удален из Scrapy.

На практике мне не очень повезло с модульными тестами для пауков.

Для тестирования пауков во время разработки я бы включил кеширование, а затем повторно запускал паука столько раз, сколько необходимо для получения правильного парсинга.

Что касается ошибок регрессии, мне больше повезло с конвейерами элементов (или промежуточным программным обеспечением пауков), которые выполняют проверку на лету (в любом случае вы можете отловить только некоторые из них на раннем тестировании). Это также хорошая идея, чтобы иметь некоторые стратегии для восстановления.

А для поддержания здоровой кодовой базы я бы постоянно выносил библиотечный код из самого паука, чтобы сделать его более тестируемым.

Извините, если это не тот ответ, который вы ищете.

person Elias Dorneles    schedule 05.07.2016
comment
Это был не совсем тот ответ, который я искал, но он мне очень помог, может быть, больше, чем фактический ответ (если он существует). Спасибо. - person Gustavo Carvalho; 05.07.2016