6

Scrapyd の出力では、すべてのフィールドを埋めていないページを取得しているため、すべてのフィールドを埋めていないアイテム、ある種のドロップを無視する方法を知りたいです。

私はそのコードを持っています:

class Product(scrapy.Item):
    source_url = scrapy.Field(
        output_processor = TakeFirst()
    )
    name = scrapy.Field(
        input_processor = MapCompose(remove_entities),
        output_processor = TakeFirst()
    )
    initial_price = scrapy.Field(
        input_processor = MapCompose(remove_entities, clear_price),
        output_processor = TakeFirst()
    )
    main_image_url = scrapy.Field(
        output_processor = TakeFirst()
    )

パーサー:

def parse_page(self, response):
    try:
        l = ItemLoader(item=Product(), response=response)
        l.add_value('source_url', response.url)
        l.add_css('name', 'h1.title-product::text')
        l.add_css('main_image_url', 'div.pics a img.zoom::attr(src)')

        l.add_css('initial_price', 'ul.precos li.preco_normal::text')
        l.add_css('initial_price', 'ul.promocao li.preco_promocao::text')

        return l.load_item()

    except Exception as e:
        print self.log("#1 ERRO: %s" % e), response.url

独自のセレクターで作成する必要なく、ローダーでそれを実行したい (アイテムを 2 回処理するのを避けるため)。パイプラインにドロップできると思いますが、これらのアイテムは有効ではないため、おそらく最善の方法ではありません。

4

1 に答える 1

10

データの検証は、パイプラインの典型的なユース ケースの 1 つです。あなたの場合、必要なフィールドをチェックするために少量のコードを書くだけで済みます。次のようなものです。

from scrapy.exceptions import DropItem

class YourPersonalPipeline(object):
    def process_item(self, item, spider):
        required_fields = [] # your list of required fields
        if all(field in item for field in required_fields):
            return item
        else:
            raise DropItem("your reason")

settings.pyでパイプラインを有効にする必要があります。

于 2014-05-22T16:19:50.960 に答える