Подавить Scrapy Item, напечатанный в журналах после конвейера - программирование
Подтвердить что ты не робот

Подавить Scrapy Item, напечатанный в журналах после конвейера

У меня есть проект scrapy, в котором элемент, который в конечном итоге входит в мой конвейер, относительно велик и хранит множество метаданных и контента. Все работает правильно в моем пауке и трубопроводах. Журналы, однако, распечатывают весь предмет исследования, поскольку он покидает трубопровод (я полагаю):

2013-01-17 18:42:17-0600 [tutorial] DEBUG: processing Pipeline pipeline module
2013-01-17 18:42:17-0600 [tutorial] DEBUG: Scraped from <200 http://www.example.com>
    {'attr1': 'value1',
     'attr2': 'value2',
     'attr3': 'value3',
     ...
     snip
     ...
     'attrN': 'valueN'}
2013-01-17 18:42:18-0600 [tutorial] INFO: Closing spider (finished)

Я бы предпочел, чтобы все эти данные не попали в файлы журналов, если я могу избежать этого. Любые предложения о том, как подавить этот вывод?

4b9b3361

Ответ 1

Другой подход заключается в переопределении метода __repr__ подклассов Item для выборочного выбора атрибутов (если они есть) для печати в конце конвейера:

from scrapy.item import Item, Field
class MyItem(Item):
    attr1 = Field()
    attr2 = Field()
    # ...
    attrN = Field()

    def __repr__(self):
        """only print out attr1 after exiting the Pipeline"""
        return repr({"attr1": self.attr1})

Таким образом, вы можете сохранить уровень журнала в DEBUG и отображать только те атрибуты, которые вы хотите видеть, выходящие из конвейера (например, для проверки attr1).

Ответ 2

Прочитав документацию и проверив (краткий) поиск по исходному коду, я не вижу прямого пути достижения этой цели.

Подход молота - установить уровень ведения журнала в настройках в значение INFO (т.е. добавить следующую строку в settings.py):

LOG_LEVEL='INFO'

Это вычеркивает много другой информации об обходах URL-адресов/страницы, но это обязательно подавит данные о обработанных элементах.

Ответ 3

Я попробовал метод repre, упомянутый @dino, он не работает. Но, исходя из его идеи, я попробовал метод str, и он работает.

Вот как я это делаю, очень просто:

    def __str__(self):
        return ""

Ответ 4

или Если вы знаете, что паук работает правильно, вы можете отключить весь журнал

LOG_ENABLED = False

Я отключу это, когда мой искатель работает отлично

Ответ 5

Если вы хотите исключить только некоторые атрибуты вывода, вы можете продлить ответ, заданный @dino

from scrapy.item import Item, Field
import json

class MyItem(Item):
    attr1 = Field()
    attr2 = Field()
    attr1ToExclude = Field()
    attr2ToExclude = Field()
    # ...
    attrN = Field()

    def __repr__(self):
        r = {}
        for attr, value in self.__dict__['_values'].iteritems():
            if attr not in ['attr1ToExclude', 'attr2ToExclude']:
                r[attr] = value
        return json.dumps(r, sort_keys=True, indent=4, separators=(',', ': '))