29

最終的にパイプラインに入るアイテムが比較的大きく、多くのメタデータとコンテンツを格納するスクレイピー プロジェクトがあります。スパイダーとパイプラインですべてが正常に機能しています。ただし、ログは、パイプラインを離れるときにスクラップアイテム全体を出力しています(私は信じています):

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)

できれば、このすべてのデータをログ ファイルに保存したくありません。この出力を抑制する方法について何か提案はありますか?

4

8 に答える 8

26

もう 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たとえば、 をチェックするため)。

于 2013-04-30T15:37:32.383 に答える
17

ドキュメントを読み、ソース コードを (簡単に) 検索した結果、この目的を達成する簡単な方法がわかりません。

ハンマー アプローチは、設定のログ レベルを INFO に設定することです (つまり、次の行を settings.py に追加します)。

LOG_LEVEL='INFO'

これにより、クロールされている URL/ページに関する他の多くの情報が取り除かれますが、処理されたアイテムに関するデータは確実に抑制されます。

于 2013-01-18T02:02:16.667 に答える
6

出力の一部の属性のみを除外する場合は、@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=(',', ': '))
于 2015-10-02T15:21:26.897 に答える
4

またはスパイダーが正しく機能していることがわかっている場合は、ログ全体を無効にすることができます

LOG_ENABLED = False

クローラーが正常に実行されたら無効にします

于 2013-01-18T06:29:59.797 に答える